如何驱逐docker swarm集群中的一个node节点?


驱逐节点?这是要干什么?

 

我问你,如果你的swarm集群中的一个节点,由于硬件,比如内存条故障了,要检修,你怎么办?强行将节点关机,你不担心swarm集群直接异常,而永久无法修复吗?

 

所以,这些粗暴的方法,或许并不适合,所以,看个更加温和的方法—drain

 

也就是,将swarm集群中的节点,先驱逐集群,然后修复主机,然后再重新的激活,接收manager分配的task.

 

接下来的部门,就会为你演示,如何一步一步的去做。

 

1、首先查看集群节点的状态

[root@nccztsjb-node-07 ~]# docker node ls
ID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
mjktd9is5xd8d4el2awrqby5k *   nccztsjb-node-07   Ready     Active         Leader           20.10.17
u87i9artgcnyki0osp9gvylu3     nccztsjb-node-08   Ready     Active                          20.10.17
z1x3ufsdxekrt6w5n37m7azfe     nccztsjb-node-09   Ready     Active                          20.10.17
cw5bome4a9g1rzelivxejd31c     nccztsjb-node-10   Ready     Active                          20.10.17
[root@nccztsjb-node-07 ~]# 

 

 

目前,在集群中,一共有4个节点,3个是worker节点。目前都是Active的状态。

 

查看service的task在节点上的分布的情况

 

[root@nccztsjb-node-07 ~]# docker service ps redis
ID             NAME      IMAGE                                  NODE               DESIRED STATE   CURRENT STATE            ERROR     PORTS
ttt73voejbh4   redis.1   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-09   Running         Running 14 seconds ago             
dkt6tw9yy44r   redis.2   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-07   Running         Running 14 seconds ago             
kimseii4sc7m   redis.3   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-10   Running         Running 14 seconds ago             
wa457rt4kdhk   redis.4   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-08   Running         Running 13 seconds ago             
s6ueg62zlul9   redis.5   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-08   Running         Running 13 seconds ago             
v2r39eb83iey   redis.6   172.20.58.152/middleware/redis:3.0.6   nccztsjb-node-09   Running         Running 14 seconds ago             
[root@nccztsjb-node-07 ~]#

 

 

在每个节点上都有task。

 

现在,驱逐节点 nccztsjb-node-10 ,执行下面的命令:

 

[root@nccztsjb-node-07 ~]# docker node update --availability drain cw5bome4a9g1rzelivxejd31c
cw5bome4a9g1rzelivxejd31c
[root@nccztsjb-node-07 ~]# 

 

其中,cw5bome4a9g1rzelivxejd31c是docker node ls查出来的节点 nccztsjb-node-10 对应的nodeID.

 

再次查看节点状态

 

 

节点nccztsjb-node-10 已经变为 Drain状态了。

 

再查看service的状态

 

docker service ps redis

 

 

 

发现节点 nccztsjb-node-10上的task已经是Shutdown状态了,并且是被调度到其他的Active节点上运行了。

 

 

OK,到这里的话,这个节点就可以进行停机维护了。

 

到这里,就结束了吗?当然没有,维护完了,怎么加回来呀?

 

非常,非常的简单。

 

就像这样:

 

[root@nccztsjb-node-07 ~]# docker node update --availability active cw5bome4a9g1rzelivxejd31c
cw5bome4a9g1rzelivxejd31c

 

 

就可以了。

 

当节点是Active的状态时,就可以重新接收task.

 

 

总结一下:

 

  • 将节点驱逐的命令

 

docker node update --availability drain <NODE_ID>

 

 

  • 将节点再次激活的命令

 

docker node update --availability active <NODE_ID>

 

posted @ 2022-09-01 13:43  Zhai_David  阅读(317)  评论(0编辑  收藏  举报