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.
逐個分析兩個節點的日志,發現周期性打印的錯誤日志:
第一個管理節點:
Mar 4 09:30:05 manager1 dockerd: time="2020-03-04T09:30:05.663865244+08:00" level=error
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\""
第二個管理節點報:
Mar 4 09:08:01 manager2 dockerd: time="2020-03-04T09:08:01.446858105+08:00" level=warning
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
點擊證書,查看證書,發現有效期不在當前時間范圍內,接着着手更新證書有效期
接着面臨問題:證書在哪存放?怎么更新?參考了以下地址的內容:
4最終解決:
管理節點二因為證書失效,直接主動讓它離開集群
docker swarm leave --force
管理節點一仍然不正常,在管理節點一上執行命令
docker swarm init --force-new-cluster --advertise-addr x.x.x.x
(x.x.x.x是你服務器的IP地址)
發現無法正常執行,重啟了docker進程
systemctl restart docker
等待時間較長,之后再次執行
docker swarm init --force-new-cluster --advertise-addr x.x.x.x
集群恢復正常,並且之前的部署和配置依然存在,算是解決了問題
(完畢)