k8s 下线node正确处理姿势 驱逐 node
注意: 默认情况下,kubectl drain将忽略节点上无法杀死的某些系统窗格;有关更多详细信息,请参阅kubectl drain文档。当kubectl drain成功返回时,表示所有pod(除了前一段中所述排除的那些)已被安全驱逐(尊重所需的正常终止期,并且不违反任何应用程序级别的中断SLO).然后通过关闭其物理机器来关闭节点是安全的,或者如果在云平台上运行,则删除其虚拟机。
有时候可能会在生产环境中的k8s的node节点对docker文件daemon.json进行更改并且重启或者node节点出现其他故障或者需要进行其他方面维护,但是该node节点上有很多pod还在跑着,这时候就需要用到drain和uncordon两个命令:
- drain:释放排空node上所有pod,并且不接收新的pod进程(自动设置节点状态为 cordon )
- uncordon :恢复node,恢复接收新的pod进程
kubectl drain在对节点执行维护之前,可以使用从节点安全地逐出所有pod.安全驱逐允许pod的容器优雅地终止并且将遵守您指定的PodDisruptionBudgets
注意: 默认情况下,kubectl drain将忽略节点上无法杀死的某些系统窗格; 有关更多详细信息,请参阅kubectl drain文档。
当kubectl drain成功返回时,表示所有pod(除了前一段中所述排除的那些)已被安全驱逐(尊重所需的正常终止期,并且不违反任何应用程序级别的中断SLO).然后通过关闭其物理机器来关闭节点是安全的,或者如果在云平台上运行,则删除其虚拟机。
操作流程
1.获取节点列表
[root@k8s-master1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready <none> 35d v1.17.5 10.23.215.243 <none> CentOS Linux 7 (Core) 3.10.0-1062.4.1.el7.x86_64 docker://18.9.9
k8s-node2 Ready <none> 35d v1.17.5 10.23.215.244 <none> CentOS Linux 7 (Core) 3.10.0-1062.4.1.el7.x86_64 docker://18.9.9
k8s-node3 Ready <none> 35d v1.17.5 10.23.215.245 <none> CentOS Linux 7 (Core) 3.10.0-1062.4.1.el7.x86_64 docker://18.9.9
2.驱逐该节点上所有的pod
如遇到daemonsets报错可以增加参数 --ignore-daemonsets
[root@k8s-master1 ~]# kubectl drain k8s-node3 --force --ignore-daemonsets --delete-local-data
node/k8s-node3 already cordoned
node/k8s-node3 drained
drain参数解释:
-
–force:
不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod。加了后还会删除’裸奔的pod’(没有绑定到任何replication controller)。即当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候就需要用–force来强制执行 (例如:kube-proxy)。 -
–ignore-daemonsets:
忽略DaemonSet管理下的Pod。如果不忽略,deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环。 -
–delete-local-data:
即使pod使用了emptyDir也删除。如果有mount local volumn的pod,会强制杀掉该pod并把数据清除掉。另外如果跟本身的配置讯息有冲突时,drain就不会执行。
例如你在一个运行了三个replica的statefulSet中设定了PodDisruptionBudget,而minAvaliability又设成了2,当正在运行的pod数量等于或者少于2的时候,drain就会停止执行。
3.安全的操作节点
这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json
或者说node节点故障需要进行的处理操作然后可以恢复可调度
查看节点上是否还有pod运行
[root@k8s-master1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 0/1 Completed 0 14d 10.244.36.66 k8s-node1 <none> <none>
nginx-deployment-8d9f7c4f-dsdvw 1/1 Running 1 8d 10.244.36.76 k8s-node1 <none> <none>
nginx-deployment-8d9f7c4f-kqq5p 1/1 Running 2 8d 10.244.169.141 k8s-node2 <none> <none>
nginx-deployment-8d9f7c4f-pnfbz 1/1 Running 0 2m25s 10.244.36.79 k8s-node1 <none> <none>
删除节点
[root@k8s-master1 ~]# kubectl delete node k8s-node3
node "k8s-node3" deleted
查看节点是否被删除
[root@k8s-master1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready <none> 35d v1.17.5 10.23.215.243 <none> CentOS Linux 7 (Core) 3.10.0-1062.4.1.el7.x86_64 docker://18.9.9
k8s-node2 Ready <none> 35d v1.17.5 10.23.215.244 <none> CentOS Linux 7 (Core) 3.10.0-1062.4.1.el7.x86_64 docker://18.9.9
4.然后恢复node,恢复接收新的pod进程
kubectl uncordon [node-name]
更多推荐
所有评论(0)