驱逐节点?这是要干什么?
我问你,如果你的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>