在 Docker Swarm 模式中发现无法 promote master 或者新的 node 无法直接 join 为 master node。这篇文章提供了解决方案。
0x00. 前言
我使用 Zerotier 把我在全球的十几个小鸡连起来建立了一个虚拟内网,并使用 Docker Swarm 统一管理。在单一 manager 的情况下的配置:
ufw allow in on <ZEROTIER_NETWORK> # 打开防火墙
docker swarm init --advertise-addr <ZEROTIER_IP> # 初始化 Swarm
docker swarm join-token worker # 取得 join token
之后将取得的 join token 在所有 node 上运行来成功组建全球 swarm 。
0x01. 问题描述
为了更好的 swarm resilience ,我决定 promote 另两个 node 为 manager 。于是在现有 master 上运行
docker node promote <NEW_MASTER_NAME>
可是一直报错
Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
于是也尝试了先让新的 node 离开 swarm 再使用 manager join token 加入 swarm 亦无果。
Error response from daemon: manager stopped: can't initialize raft node: rpc error: code = Unknown desc = could not connect to prospective new cluster member using its advertised address: rpc error: code = DeadlineExceeded desc = context deadline exceeded
0x02. 解决方案
Step 1. 打开防火墙
我这里使用的是 ufw 于是
ufw allow in on <ZEROTIER_NETWORK> # 打开防火墙
Step 2. 配置 NO_PROXY
mkdir -p /etc/systemd/system/docker.service.d
cat >> /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="NO_PROXY=localhost,127.0.0.1,<MANAGER_ZEROTIER_IP>"
EOF
systemctl daemon-reload
systemctl restart docker
# 可选,检查配置是否生效
# systemctl show --property=Environment docker
完成。再次 promote 或者使用 join-token 即可!
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。