10/04/2019

Docker Swarm 模式添加 manager node 报错

在 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 即可!

本文链接:https://blog.whe.me/post/docker-swarm-mode-add-manager.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。