背景
docker swarm集群的某几个节点出现问题,需要重启这些节点的docker服务
错误操作
这几个节点都是worker节点
- 在物理机以root账户登录
- 执行systemctl restart docker
- 发现worker节点docker服务重启成功但是在manager执行docker node ls发现该节点状态处于Down
- worker节点执行docker swarm leave试图离开集群
- worker节点执行失败并报错:Error response from daemon: context deadline exceeded
- worker节点执行docker swarm leave -f,同样失败并返回相同的错误
- manager执行docker node rm xxxx删除这个Down的worker节点,然后worker节点leave集群,依旧失败
- worker节点执行docker swarm join企图重新加入集群,但是失败,报错说已经在集群中,需要先执行leave再join
错误操作导致的结果
集群能正常工作,但是少了一个节点。worker节点退不出集群,也加入不了集群,该节点对集群来说处于不可达不可用状态。
处理方法
在这种情况下,只能通过删除物理机上的swarm配置信息才能退出集群,然后再加入新集群。
- 先找到swarm的目录,一般情况是在/var/docker/swarm,但是如果安装docker更改了目录,就有可能不在这里,可以使用find -name "swarm"查找,记住该目录
- 然后关闭docker服务systemctl stop docker
- 使用rm -rf swarm目录删除这整个目录,当前节点的swarm信息就都没了
- 启动dockersystemctl start docker
- 在manager节点执行docker swarm join-token worker,来获取别的机器加入集群成为worker需要执行的命令,如果需要是成为manager,则把命令中的worker换成manager即可
- 在当前机器上执行第五步获取的命令即可加入swarm集群成功