Docker 集群模式路由网格未按预期工作

Docker swarm mode routing mesh not work as expected

我尝试按照此 document

在 docker 群模型中创建服务

我在集群中创建了两个节点:

然后创建部署服务,我这里用的是jwilder/whoami而不是文档中的nginxdocker service create --name my-web --publish published=8888,target=8000 --replicas 2 jwilder/whoami

看来他们启动成功了:

如文档所述:

When you access port 8080 on any node, Docker routes your request to an active container.

所以在我看来,我可以从任何节点访问 my-web 服务,但是我发现只有一个节点工作:

怎么回事?

这可能是由于节点之间的端口被阻塞造成的。群网状网络使用 "ingress" 网络将发布的端口连接到服务的 VIP。该入口网络是使用 vxlan 实现的覆盖网络。为此你需要:

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

参考:https://docs.docker.com/network/overlay/

这些端口有可能在多个级别被阻止,包括 iptables、路由器上的防火墙,我什至看到 VMware 使用他们的 NSX 工具也实现了 vxlan 来阻止它。

对于 iptables,我通常使用以下命令:

iptables -A INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
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

如果您使用 firewalld 或需要更改网络路由器上的防火墙规则,以上内容将有所不同。