Docker swarm:节点未加入入口网络

Meh*_*hdi 4 docker docker-swarm docker-ingress

我在玩 Docker swarm,
我有一个三节点集群、1 个管理器和 2 个工作节点。我正在使用VIP我的所有服务。

我有一个奇怪的情况,我重新启动了工作节点。
我执行docker node ls了,工作节点是Ready.
docker service ls会告诉我工人中容器的复制很好。
问题:我无法通过入口网络加入节点。其他节点中的容器无法访问该工作节点中的容器。

我检查了它们都加入入口网络的容器。
我从同一个节点内卷曲容器,他们做出了回应。
我从容器 ping 服务名称(在同一个故障节点中)并且它工作正常。
我从经理那里卷曲了工人容器中的工人容器不起作用!
我蜷缩着工人的 IP 地址,他们回应了。

我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,它再次运行了!

对我刚刚目睹的事情有什么解释吗?
我最担心这会发生在生产环境中。

先感谢您。

BMi*_*tch 5

当节点(worker 和 manager)之间没有打开覆盖网络端口时,就会发生这种情况。从Docker 的文档中,需要打开以下端口:

  • 用于集群管理通信的 TCP 端口 2377
  • 用于节点间通信的 TCP 和 UDP 端口 7946
  • UDP 端口 4789 用于覆盖网络流量

这可能会被两端的 iptables、中间的网络路由器/防火墙,甚至像 VMWare NSX 这样的工具阻止。要验证连接是否端到端工作,您可以在每个节点的选定端口上运行 tcpdump,并确保离开一个节点的请求到达另一个节点。

集群中每个节点的相关iptables规则是:

iptables -I INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
iptables -I INPUT -p udp -m udp --dport 7946 -j ACCEPT
iptables -I INPUT -p tcp -m udp --dport 4789 -j ACCEPT
iptables -I INPUT -p 50 -j ACCEPT # allows ipsec when secure overlay is enabled
Run Code Online (Sandbox Code Playgroud)

如果您无法调整防火墙设置,swarm 模式可能会配置一个与 4789 不同的覆盖网络端口, docker swarm init --data-path-port