【问题标题】:Docker swarm: a node is not joining the ingress networkDocker swarm:节点未加入入口网络
【发布时间】:2020-07-16 14:14:41
【问题描述】:

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

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

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

我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,它又可以工作了!

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

提前谢谢您。

【问题讨论】:

    标签: docker docker-swarm docker-ingress


    【解决方案1】:

    当节点(工作人员和管理人员)之间未打开覆盖网络端口时,会发生这种情况。从Docker's documentation开始,需要打开以下端口:

    • 用于集群管理通信的 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
    

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

    【讨论】:

    • 感谢您的回复。服务器可以通信,管理器会将新服务部署到该工作节点,问题是将流量路由到该节点。不确定这是防火墙的事情,因为我重新启动了管理器并且它起作用了。不幸的是我没有这个设置了,只问看看这是否已经发生或者是否有人可以分享他的经验。再次感谢您
    • 覆盖网络端口不会影响在节点上调度工作负载的能力。
    • 有类似的问题,但我认为它与端口/防火墙无关。我有 1 个管理器和 1 个工作节点,并且有防火墙。尝试了上面建议的 iptables,但没有奏效。唯一有效的方法是重新启动两个节点,然后重新创建集群。然后入口网络终于开始出现在工人身上。这发生在几天前,我虽然是侥幸,但现在又发生了。在此之前,几个月来一切都运行良好。
    • @Mehdi 过去我能够追踪这些问题的唯一方法是调试节点之间的网络。 tcpdump 和 wireshark 往往是缩小问题范围的最快方法。如果你想在容器内调试网络,可以使用 netshoot:github.com/nicolaka/netshoot
    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多