docker swarm 最近出现了一个很有意思的问题, 具体问题如下:
docker logs 正常输出日志, docker service logs 为空, 无法正常输出日志
问题:
docker swarm 调度程序停止了 或 无法协调其他机器 导致日志无法正常输出
解决方案:
1: 通过管理节点降级, 将管理节点降级成工作节点, 降级完成也可以将工作节点在提升至管理节点
降级为工作节点 docker node demote 节点名称或id
提升为管理节点 docker node promote 节点名称或id
2: 移除当前管理节点中的Leader, 迫使docker重新选取Leader
在需要移除的节点上执行 docker swarm leave, 也可以强制移除 docker swarm leave --force
如果这时出现了超时的情况, 则可以在当前管理节点中的Leader节点上执行 docker node rm [worker_node], 这时该节点已经被移除了集群, 如果没有其他问题运行docker service logs 可以正常输出日志。
如果需要将移除的节点重新加入到集群, 可以在Leader机器上运行docker swarm join-token manager 查看当前集群 swarm join token, 这时会返回当前集群的加入命令以及token, 可以在需要的服务器上执行返回的命令加入到集群中