Docker Worker节点晋升为Manager后状态始终为Down的问题
我之前也遇到过类似的Swarm集群节点状态异常的问题,结合你的操作步骤和给出的信息,帮你梳理下可能的原因和解决办法:
先明确下你的问题场景
你在AWS上搭了5节点的Docker Swarm集群,手动终止原Leader节点后,依次做了降级、移除旧主节点的操作,然后把一个Worker节点升为Manager,但这个新Manager始终显示Down状态,可用性却是active,执行docker node update --availability active也没效果。用的是Docker 18.03.1-ce,从docker info看Swarm是活跃状态,当前有2个Manager、4个节点。
可能的原因和对应的解决步骤
1. 先排查网络连通性(最常见的原因)
Swarm的Manager节点之间需要三个关键端口互通:2377(集群管理)、7946(节点间通信)、4789(overlay网络)。AWS的安全组如果没开放这些端口,新晋升的Manager根本没法和集群里其他Manager同步状态。
- 去AWS控制台检查所有集群节点的安全组,确保这几个端口对集群内的所有节点(或者节点所在的子网)开放:
- TCP 2377
- TCP/UDP 7946
- UDP 4789
- 登录到那个状态Down的节点,用
nc测试和正常Manager的连通性,比如:
如果连不上,先把安全组规则改对,然后重启这个节点的Docker服务:nc -zv 172.31.4.129 2377 nc -zv 172.31.4.129 7946
等几分钟再看节点状态,大概率会恢复。sudo systemctl restart docker
2. 解决集群Raft日志不一致的问题
你是直接终止了原Leader节点,可能导致集群的Raft日志有残留的不一致状态,新晋升的Manager没法正常同步。试试以下操作:
- 在正常的Manager节点上,先列出所有节点,拿到那个异常节点的ID:
docker node ls - 先把这个异常节点从集群里移除:
docker node rm <异常节点ID> - 然后登录到那个异常节点,重新加入集群(用Manager的token):
先在正常Manager上获取Manager的加入token:
然后在异常节点上执行类似这样的命令:docker swarm join-token manager
重新加入后,节点应该能正常同步状态,变成Ready。docker swarm join --token <你的manager-token> 172.31.4.129:2377
3. 考虑Docker版本的问题
你用的Docker 18.03是比较老的版本了,这个版本的Swarm确实存在一些已知的稳定性Bug,比如节点晋升后的状态同步问题。建议升级到较新的稳定版本,比如20.10.x系列:
- 先卸载旧版本:
sudo apt-get remove docker docker-engine docker.io containerd runc - 安装最新稳定版:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io - 升级完成后重启Docker服务,再检查节点状态。
4. 查看系统日志找具体错误
如果上面的方法都不管用,就去看问题节点的Docker日志,找具体的报错信息:
sudo journalctl -u docker.service -f
比如可能会看到证书同步失败、Raft选举超时之类的错误,根据这些错误再针对性解决。
最后验证
做完上面的操作后,执行docker node ls看看那个节点的状态是不是变成Ready了,再用docker info确认集群的Manager数量正常,Swarm状态稳定。
内容的提问来源于stack exchange,提问作者Zaks

