问题描述:
docker swarm状态不正常,节点不能加入swarm集群。
用docker info命令查看状态有类似如下错误:
$ docker info
...
Swarm: error
NodeID:
Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - ea84ts6urascdbgr50lrlljih) not valid after Thu, 26 Aug 2021 09:17:00 UTC, and it is currently Mon, 13 Sep 2021 15:26:56 UTC: x509: certificate has expired or is not yet valid
Is Manager: false
Node Address: 192.168.15.19
...
解决办法:
基本就是把坏的节点先从cluster里面挪出去,然后再重新加入即可。
分几种情况:
- 作为worker节点坏了
$ docker swarm leave
$ docker swarm join --token ...
然后跑到任意一个manger节点上,把之前的那个换的node删除,不然你会有两个同名node(虽然ID不同,状态不同,但看起来很难看了)。
$ docker node rm <BAD-NODE-ID>
-
作为manager节点坏了,但是cluster还能运行,即少数的节点坏了
和作为worker节点坏了类似处理。 -
整个cluster已经不能运行,作为超过半数的多数节点都坏了
此时因为cluster已经坏点了,你不能操作任何docker swarm相关的命令;那么此时需要在一个manager节点上执行:
$ docker swarm init --force-new-cluster
来基于现有的docker环境重新初始化cluster,加了参数--force-new-cluster
在swarm初始化时不会丢弃原来的swarm信息;然后再把其他的manger和worker节点按照前面的步骤,一个一个重新加进来就行了。其实都很简单哈。
这个办法对于只有一个manager节点的cluster不适应,因为对这个情况,证书失效后,节点的manager属性变成false了,此时执行上述命令会得到当前节点不是manager节点的错误;目前我还没有找到更好的办法处理这个场景,都是用修改系统时间来完成的:
- $ sudo systemctl stop docker
停止docker服务 - $ sudo openssl x509 -text -noout -in /var/lib/docker/swarm/certificates/swarm-node.crt
获取当前证书的有效区间,为了下一步把系统时间设成有效区间内 - $ sudo date -s '<datetimestr>'
这个时间串必须在第二步证书的有效时间内。 - $ sudo systemctl start docker
启动docker - $ docker swarm ca --rotate --cert-expiry <num>h
计算出<num>为证书的有效期时间到当前的时间差(小时)。
这一步可能会失败,如果无法连接其他worker节点,那么就先把worker节点从cluster里面删除,再重新执行命令。 - $ sudo systemctl stop docker
- $ sudo date -s '<current_datetimestr>'
- $ sudo systemctl start docker
- $ docker swarm ca --rotate
重置--cert-expiry为缺省值(不带参数)。 - 重新加入其他的worker节点。
网友评论