docker swarm TLS certificate 失效的

2021-09-17  本文已影响0人  CodingCode

问题描述:
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里面挪出去,然后再重新加入即可。

分几种情况:

  1. 作为worker节点坏了
$ docker swarm leave
$ docker swarm join --token ...

然后跑到任意一个manger节点上,把之前的那个换的node删除,不然你会有两个同名node(虽然ID不同,状态不同,但看起来很难看了)。

$ docker node rm <BAD-NODE-ID>
  1. 作为manager节点坏了,但是cluster还能运行,即少数的节点坏了
    和作为worker节点坏了类似处理。

  2. 整个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节点的错误;目前我还没有找到更好的办法处理这个场景,都是用修改系统时间来完成的:

  1. $ sudo systemctl stop docker
    停止docker服务
  2. $ sudo openssl x509 -text -noout -in /var/lib/docker/swarm/certificates/swarm-node.crt
    获取当前证书的有效区间,为了下一步把系统时间设成有效区间内
  3. $ sudo date -s '<datetimestr>'
    这个时间串必须在第二步证书的有效时间内。
  4. $ sudo systemctl start docker
    启动docker
  5. $ docker swarm ca --rotate --cert-expiry <num>h
    计算出<num>为证书的有效期时间到当前的时间差(小时)。
    这一步可能会失败,如果无法连接其他worker节点,那么就先把worker节点从cluster里面删除,再重新执行命令。
  6. $ sudo systemctl stop docker
  7. $ sudo date -s '<current_datetimestr>'
  8. $ sudo systemctl start docker
  9. $ docker swarm ca --rotate
    重置--cert-expiry为缺省值(不带参数)。
  10. 重新加入其他的worker节点。
上一篇下一篇

猜你喜欢

热点阅读