加入Docker swarm

3

I have 2 VMs.

On the first I run:

docker swarm join-token manager

在第二个步骤中,我运行了此命令的结果。

即:

docker swarm join --token SWMTKN-1-0wyjx6pp0go18oz9c62cda7d3v5fvrwwb444o33x56kxhzjda8-9uxcepj9pbhggtecds324a06u 192.168.65.3:2377

然而,这将输出:
Error response from daemon: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 192.168.65.3:2377: connect: connection refused"

有什么想法出了问题吗?

如果有帮助,我是使用Vagrant来启动这些虚拟机的。


两个虚拟机之间存在连接问题?我会在Swarm主节点上运行tcpdump来嗅探传入的连接。 - OkieOth
5个回答

5

在主节点上,只需将端口添加到防火墙中

firewall-cmd --add-port=2377/tcp --permanent

firewall-cmd --reload

然后再次尝试在第二个虚拟机或节点上加入docker swarm。


3

我曾经遇到了类似的问题,花了几个小时找出了根本原因,并向那些可能遇到同样问题的人分享。

环境:

  • Oracle Cloud + AWS EC2 (2 +2)
  • 操作系统: 20.04.2-Ubuntu
  • Docker 版本:20.10.8
  • 3个动态公共 IP+1个弹性 IP

问题

  1. 最初在 Oracle Cloud 上创建了两个实例
  2. A 实例(manager) docker swarm init --advertise-addr成功
  3. B 实例(worker) 成功以 worker 加入
  4. 试图晋升 B 实例为 manager 时,遇到了错误

无法连接到远程主机: No route to host 5. 网格路由未正常工作。

调查

  1. 猜测与网络/防火墙/安全组/安全列表相关
  2. 使用相同错误 ssh 到 B 服务器 (worker),尝试 telnet (manager) 2377

无法连接到远程主机: No route to host 3. 登录 Oracle 控制台并为所有相关端口添加入站规则 TCP 端口 2377 用于群集管理通信

TCP 和 UDP 端口 7946 用于节点间通信

UDP 端口 4789 用于覆盖网络流量 4. 尝试再次使用相同错误的 telnet,但仍然无法工作 5. 检查操作系统级别防火墙。如果有,请禁用它。 systemctl ufw disable 6. 再次尝试使用相同结果仍然无法工作 7. 怀疑 Oracle Cloud 出了问题,因此决定尝试使用 AWS 安装相同版本的操作系统/ docker 8. 添加安全组以允许所有相关端口/协议,并禁用 ufw 9. 使用 AWS 实例 C (leader/master) + D (worker) 进行测试。它可以工作并且还可以晋升 D 为 manager。网格路由也正常工作。 10. 确认了 Oracle Cloud 的问题 11. 尝试将 oracle 实例 (A) 加入到 C 中作为 worker。它可以工作,但仍然无法晋升为 manager。 12. 使用 journalctl -f 命令调查日志,并确认 A/B (oracle 实例) 到 AWS 实例 (C) 存在套接字超时 13. 回顾 A/B,发现 iptables 阻止了请求 14. 移除 iptables 中的所有设置

# remove the rules
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F

 15. remove all of setup in the iptables

根本原因

It caused by firewall either in cloud security/WAF/ACL level or OS firewall/rules. e.g. ufw/iptables

谢谢,这对我有用。 但是你能否编辑你的答案以指定删除主节点或工作节点或两者都删除? 我从两个节点上都删除了。那么删除iptables会有什么缺点或安全风险吗? - Sumer Singh
iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F这是在一行中运行的更好的命令。 - Sumer Singh

3

我在主节点上执行了firewall-cmd --add-port=2377/tcp --permanent firewall-cmd --reload命令,但仍然遇到相同的错误。 在工作节点上执行telnet <master ip> 2377命令,然后在主节点上执行reboot命令。 这样就可以正常工作了。


我遇到了相同的错误 Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2377: connect: connection refused" 我意识到这是因为我正在使用两个虚拟机,我需要使用FQDN而不是ip。 在替换加入集群命令中的ip后,我成功让它工作。 - pushd93

1

看起来你的Docker Swarm管理器领导者没有在2377端口运行。你可以通过在Swarm管理器领导者虚拟机上执行此命令来检查它。如果一切正常,你将获得类似的输出。

[root@host1]# docker node ls
ID                            HOSTNAME                     STATUS              AVAILABILITY        MANAGER STATUS
tilzootjbg7n92n4mnof0orf0 *   host1    Ready               Active              Leader

此外,您可以在领导者群管理节点中检查监听端口。它应该具有用于集群管理通信的TCP 2377端口和用于节点间通信的TCP/UDP 7946端口开放。
[root@host1]# netstat -ntulp | grep dockerd
tcp6       0      0 :::2377                 :::*                    LISTEN      2286/dockerd
tcp6       0      0 :::7946                 :::*                    LISTEN      2286/dockerd
udp6       0      0 :::7946                 :::*                                2286/dockerd

在第二个虚拟机中配置第二个Swarm管理器时,您需要确保可以连接到领导Swarm管理器的2377端口。您可以使用telnet、wget、nc等工具来测试连接性,如下所示。
[root@host2]# telnet <swarm manager leader ip> 2377
Trying 192.168.44.200...
Connected to 192.168.44.200.

针对我的情况,我可以确认端口2377正在监听。我创建了另一个实例(worker),并在相关端口(例如2377 tcp)上打开了防火墙规则。然而,它显示错误“telnet:无法连接到远程主机:没有路由到主机”,不确定问题出在哪里。PS:我正在尝试从worker节点telnet leader节点的22端口,它可以工作。但是2377端口无法工作。操作系统:20.04.2-Ubuntu。 - Baodi Di

0

对我来说,我同时使用Linux和Windows。我的Windows Docker私有网络与本地网络地址相同。因此,Docker守护程序无法在自己的网络中找到我给他的主机地址。 所以我做了以下操作:

1- go to Docker Desktop app 
2- go to Settings 
3- go to Resources 
4- go to Network section and change the Docker subnet address (need to be different from your local subnet address). 
5- Then apply and restart. 
6- use the docker join on the worker again.

注意:所有这些步骤都在出现错误的节点上执行。确保主节点开放了端口2377、7946和4789(您可以使用iptables或ufw)。
希望它对你有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接