我已经设置了一个工作的 Docker Swarm 集群,但几个月后我试图重新使用这个集群,但我发现没有任何效果。
在进行故障排除以了解发生了什么后,我发现了这个错误。
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: error
NodeID:
Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - s3htdkgcv9qifg2jmbpud1gt7) not valid after Sun, 27 Mar 2022 10:27:00 UTC, and it is currently Sun, 19 Jun 2022 04:33:54 UTC: x509: certificate has expired or is not yet valid:
Is Manager: false
Node Address: 10.10.1.10
我已经尝试过像这里一样在网上找到的东西https://stackoverflow.com/a/59086699/5442187
docker swarm leave
然后尝试重新加入
docker swarm join-token manager
=>
来自守护进程的错误响应:此节点不是群管理器。使用 “docker swarm init”或“docker swarm join”将此节点连接到 蜂拥而至再试一次。
和
docker swarm join-token worker
=>
来自守护进程的错误响应:此节点不是群管理器。使用 “docker swarm init”或“docker swarm join”将此节点连接到 蜂拥而至再试一次。
我如何重新加入/重新认领这个集群?我希望它应该是可能的,否则这将使 Docker Swarm 无法用于生产。
通过
docker swarm ca --rotate
旋转群体CA。
在所有注册节点都轮换了他们的 TLS 证书之前,根 CA 轮换不会完成。如果轮换没有在合理的时间内完成,请尝试运行
docker node ls --format '{{.ID}} {{.Hostname}} {{.Status}} {{.TLSStatus}}'
以查看是否有任何节点已关闭或无法轮换 TLS 证书。
见https://docs.docker.com/engine/reference/commandline/swarm_ca/
集群中只有 2 个节点,所有节点都显示 manager false,命令在两个节点上运行,但没有一个有效
一旦所有的经理都离开了集群,我相信它就消失了。在此之前,您可以对其中一位经理运行以下命令:
docker swarm init --force-new-cluster
现在他们都离开了,您可以从头开始重新创建集群:
# on the manager
docker swarm init
一旦你有了一个新的集群,在管理器上运行:
docker swarm join-token manager # or worker
然后在其他节点上运行上面的 join-token 命令的输出以加入集群。
有一种恢复方法,不会丢失已部署的集群服务/堆栈。 错误是抱怨“证书在 2022 年 3 月 27 日星期日 10:27:00 UTC 后无效”。所以我们应该先让证书有效,然后恢复 swarm 服务,并在 swarm 启动并运行时轮换 CA 证书:
停止码头服务:
service docker stop
将日期调回“2022年3月27日10:27:00”,可以更早:
date -s "27 Mar 2022 10:27:00"
启动集群服务:
service docker start
#check if all the services are up and running
docker stack ls
旋转证书:
docker swarm ca –rotate
将系统日期设置为当前:
date -s "19 Apr 2023 06:34:00"