[我在玩Docker群,我有一个三个节点的集群,一个管理器和两个工作器节点。我正在为所有服务使用VIP
。我有一个奇怪的情况,我重新启动了工作节点。我执行了docker node ls
,而工作节点是Ready
。docker service ls
会告诉我,工作者中容器的复制是好的。问题:我无法通过入口网络加入该节点。其他节点中没有容器能够访问该工作节点中的容器。
我检查了它们都已加入入口网络的容器。我从同一节点内卷曲容器,它们做出了响应。我从一个容器ping服务名称(在同一故障节点中),并且该名称有效。我把经理那里的工人容器卷曲了,无法正常工作!!我ed缩着工人的IP地址,他们回应了。我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,并且再次正常工作!
我刚刚目睹过什么解释吗?我最担心这会在生产环境中发生。预先谢谢你。
当未在节点(工作人员和管理人员)之间打开覆盖网络端口时,会发生这种情况。从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
如果无法调整防火墙设置,则群集模式可能会配置为具有docker swarm init --data-path-port
的4789以外的覆盖网络端口>