解决 The swarm does not have a leader

1 问题:

最近有一个测试环境的 Swarm 集群挂了, 这个集群有两个管理节点, 执行 docker node ls, 均报:

The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online

明明两个管理节点都在线.

2 分析:

通过 docker info 命令, 看到一条错误信息

Error: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

逐个分析两个节点的日志, 发现周期性打印的错误日志:

第一个管理节点:

  1. Mar 4 09:30:05 manager1 dockerd: time="2020-03-04T09:30:05.663865244+08:00" level=error
  2. msg="error sending message to peer" error="rpc error: code = Internal desc = connection error: desc = \"transport: x509: certificate has expired or is not yet valid\""

第二个管理节点报:

  1. Mar 4 09:08:01 manager2 dockerd: time="2020-03-04T09:08:01.446858105+08:00" level=warning
  2. msg="error renewing TLS certificate: rpc error: code = Internal desc = connection error: desc = \"transport: remote error: tls: bad certificate\""

初步得出结论, 第二个管理节点证书有问题, 并且很大可能是过期了,

根据字面信息猜测一下: 这里好像是个 BUG, 刷新本地证书需要请求某一个远程节点, 请求远程节点又报证书不对, 形成悖论.

查看两台机器的时间, 均是正常时间

3 验证:

通过命令

docker swarm ca | openssl x509 -noout -text

查看第二个管理节点证书, 命令报错无法显示证书信息

直接通过谷歌浏览器访问两个节点的 2377 端口 https://x.x.x.x:2377

点击证书, 查看证书, 发现有效期不在当前时间范围内, 接着着手更新证书有效期

接着面临问题: 证书在哪存放? 怎么更新? 参考了以下地址的内容:

证书相关 GitHub 上的讨论 https://github.com/moby/moby/issues/34384

4 最终解决:

管理节点二因为证书失效, 直接主动让它离开集群

docker swarm leave --force

管理节点一仍然不正常, 在管理节点一上执行命令

docker swarm init --force-new-cluster --advertise-addr x.x.x.x

发现无法正常执行, 重启了 docker 进程

systemctl restart docker

等待时间较长, 之后再次执行

docker swarm init --force-new-cluster --advertise-addr x.x.x.x

集群恢复正常, 并且之前的部署和配置依然存在, 算是解决了问题

posted @ 2020-06-24 12:51  豆浆D  阅读(571)  评论(0编辑  收藏  举报