有时候可能会在生产环境中的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]

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐