Docker swarm:一个节点没有加入入口网络
Docker swarm: a node is not joining the ingress network
我正在玩 Docker swarm,
我有一个三节点集群、1 个管理器和 2 个工作节点。我的所有服务都使用 VIP
。
我遇到了一个奇怪的情况,我重新启动了工作节点。
我执行了 docker node ls
并且工作节点是 Ready
.
docker service ls
会告诉我 worker 中容器的复制是好的。
问题:我无法通过入口网络加入节点。其他节点中的容器无法访问该工作节点中的容器。
我检查了它们都加入入口网络的容器。
我从同一节点内卷曲容器,它们响应了。
我从容器中 ping 了服务名称(在同一个故障节点中)并且它起作用了。
我把 worker 里面的 worker container 卷曲了 manager 不工作!!
我用工作人员的 ip 地址卷曲,他们回复了。
我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,它又工作了!
我刚才看到的有什么解释吗?
我最担心这会发生在生产环境中。
提前谢谢你。
当节点(工作人员和管理人员)之间未打开覆盖网络端口时会发生这种情况。从 Docker's documentation 开始,需要打开以下端口:
- TCP port 2377 for cluster management communications
- TCP and UDP port 7946 for communication among nodes
- UDP port 4789 for overlay network traffic
这可能会被两端的 iptables、中间的网络 router/firewall 甚至像 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
如果您无法调整防火墙设置,swarm 模式可能配置了与 4789 不同的覆盖网络端口 docker swarm init --data-path-port
我正在玩 Docker swarm,
我有一个三节点集群、1 个管理器和 2 个工作节点。我的所有服务都使用 VIP
。
我遇到了一个奇怪的情况,我重新启动了工作节点。
我执行了 docker node ls
并且工作节点是 Ready
.
docker service ls
会告诉我 worker 中容器的复制是好的。
问题:我无法通过入口网络加入节点。其他节点中的容器无法访问该工作节点中的容器。
我检查了它们都加入入口网络的容器。
我从同一节点内卷曲容器,它们响应了。
我从容器中 ping 了服务名称(在同一个故障节点中)并且它起作用了。
我把 worker 里面的 worker container 卷曲了 manager 不工作!!
我用工作人员的 ip 地址卷曲,他们回复了。
我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,它又工作了!
我刚才看到的有什么解释吗?
我最担心这会发生在生产环境中。
提前谢谢你。
当节点(工作人员和管理人员)之间未打开覆盖网络端口时会发生这种情况。从 Docker's documentation 开始,需要打开以下端口:
- TCP port 2377 for cluster management communications
- TCP and UDP port 7946 for communication among nodes
- UDP port 4789 for overlay network traffic
这可能会被两端的 iptables、中间的网络 router/firewall 甚至像 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
如果您无法调整防火墙设置,swarm 模式可能配置了与 4789 不同的覆盖网络端口 docker swarm init --data-path-port