![Docker swarm 路由网格超时](https://linux22.com/image/742870/Docker%20swarm%20%E8%B7%AF%E7%94%B1%E7%BD%91%E6%A0%BC%E8%B6%85%E6%97%B6.png)
我有两台机器运行 Ubuntu 18.04,安装了 Docker 版本 18.09.9。我设置了一个 Swarm 集群,其中管理节点公布其公共 IP,工作节点公布其私有 IP:
// On manager
docker swarm init --advertise-addr INSTANCE_PUBLIC_IP
// On worker
docker swarm join --advertise-addr INSTANCE_PRIVATE_IP --token XXXXXX MANAGER_PUBLIC_IP:2377
两台机器在同一个私有网络上运行,管理器能够连接到工作节点的私有 IP。集群基本正常工作,我可以部署服务,查看两个节点上的入口网络等……但是当我部署容器位于工作节点上的服务时,我无法通过管理器节点访问它。连接超时。从工作节点,连接成功。
但是,如果我让工作节点公布其公共 IP,则一切正常。这些节点由 Digitalocean 托管,您知道这个问题从何而来吗?
答案1
这通常是防火墙阻止主机之间的 vxlan 覆盖网络端口的结果。您需要打开以下内容:
- 2377/tcp:群管理器通信
- 7946/tcp+udp:覆盖网络控制端口
- 4789/udp:覆盖网络数据端口
- 协议 50:仅在覆盖网络上启用安全性时才需要
使用 iptables,你需要在 Swarm 集群中的每个节点上进行以下操作:
iptables -A INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp -m udp --dport 4789 -j ACCEPT
iptables -A INPUT -p 50 -j ACCEPT
请注意,某些工具(尤其是 VMWare NSX)会阻止 vxlan 端口。
答案2
我终于搞明白了!问题不在于端口关闭或任何配置错误,而在于 Digitalocean 的内部网络。
他们在实例的公共 IP 和私有 IP 之间设置了 NAT。事实证明,通过 NAT 进行 p2p 连接并不好。正如此评论所述(https://github.com/docker/swarmkit/issues/1429#issuecomment-361924332):
关键是从工作节点到管理节点以及反之亦然具有直接连接(途中没有 NAT)。
此页面还提到了 NAT 的潜在问题和限制:https://en.wikipedia.org/wiki/Network_address_translation#Issues_and_limitations
它说,“除非 NAT 路由器做出特殊努力来支持此类协议,否则传入的数据包无法到达目的地。”。
因此,即使您最终可以通过 NAT 系统完全运行 Swarm,我也不建议这样做。