kubernetes 节点维护 cordon, drain, uncordon

2023-10-30

这三个命令是正式release的1.2新加入的命令,三个命令一起介绍,是因为三个命令配合使用可以实现节点的维护。在1.2之前,因为没有相应的命令支持,如果要维护一个节点,只能stop该节点上的kubelet将该节点退出集群,是集群不在将新的pod调度到该节点上。如果该节点上本生就没有pod在运行,则不会对业务有任何影响。如果该节点上有pod正在运行,kubelet停止后,master会发现该节点不可达,而将该节点标记为notReady状态,不会将新的节点调度到该节点上。同时,会在其他节点上创建新的pod替换该节点上的pod。这种方式虽然能够保证集群的健壮性,但是任然有些暴力,如果业务只有一个副本,而且该副本正好运行在被维护节点上的话,可能仍然会造成业务的短暂中断。

1.2中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。

如下图所示是一个整个的节点维护的流程(为了方便demo增加了一些查看节点信息的操作):

1)首先查看当前集群所有节点状态,可以看到共两个节点都处于ready状态;

[root@master run]# kubectl get nodes
NAME                   STATUS    AGE
node1-192.168.52.132   Ready     1d
node2-192.168.52.130   Ready     1d

2)查看当前tomcat两个副本运行在node1两个节点上;

[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-kl9pc   1/1       Running   0          2m        172.17.82.3   node1-192.168.52.132
tomcat-l9hlp   1/1       Running   0          2m        172.17.82.2   node1-192.168.52.132

3)使用cordon命令将node1标记为不可调度;

[root@master run]# kubectl cordon node1-192.168.52.132
NAME                   STATUS                     AGE
node1-192.168.52.132   Ready,SchedulingDisabled   1d
node2-192.168.52.130   Ready                      1d

4)再使用kubectl get nodes查看节点状态,发现node1虽然还处于Ready状态,但是同时还被禁能了调度,这意味着新的pod将不会被调度到node1上。

5)再查看tomcat状态,没有任何变化,两个副本仍运行在node1上;

[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-kl9pc   1/1       Running   0          2m        172.17.82.3   node1-192.168.52.132
tomcat-l9hlp   1/1       Running   0          2m        172.17.82.2   node1-192.168.52.132

6)执行drain命令,将运行在node1上运行的pod平滑的赶到其他节点上;

[root@master run]# kubectl drain node1-192.168.52.132
node "node1-192.168.52.132" cordoned
pod "tomcat-l9hlp" evicted
pod "tomcat-kl9pc" evicted
node "node1-192.168.52.132" drained

7)再查看tomcat的状态发现,node1上的副本已经被迁移到node2上;这时候就可以对node1进行一些节点维护的操作,如升级内核,升级Docker等;

[root@master run]# kubectl get pod -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP            NODE
tomcat-dddmp   1/1       Running   0          5m        172.17.40.3   node2-192.168.52.130
tomcat-h4qsb   1/1       Running   0          5m        172.17.40.4   node2-192.168.52.130

8)节点维护完后,使用uncordon命令解锁node1,使其重新变得可调度;

[root@master run]# kubectl uncordon node1-192.168.52.132
node "node1-192.168.52.132" uncordoned

9)检查节点状态,发现node1重新变回Ready状态。

[root@master run]# kubectl get nodes
NAME                   STATUS    AGE
node1-192.168.52.132   Ready     1d
node2-192.168.52.130   Ready     1d

若想去掉某个节点,可以直接 只有kubectl delete node ip 则就会直接把节点删除了。

若想把这个节点再从新加入,只需要重启节点的kubelet kube-proxy 就可以了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes 节点维护 cordon, drain, uncordon 的相关文章

随机推荐