Docker swarm 路由网格超时

Docker swarm 路由网格超时

我有两台机器运行 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 托管,您知道这个问题从何而来吗?

相关Docker Swarm 路由网格连接超时

答案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,我也不建议这样做。

相关内容