Docker群模式路由网格无法按预期工作

时间:2019-03-13 02:41:00

标签: docker docker-swarm

我尝试通过遵循此document

在docker swarm模型中创建服务

我在集群中创建了两个节点: enter image description here

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

似乎成功启动了: enter image description here

如文件所述:

  

当您在任何节点上访问端口8080时,Docker会将您的请求路由到   一个活动的容器。

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

enter image description here

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

这可能是由于节点之间的端口被阻塞引起的。群集网状网络使用“入口”网络将发布的端口连接到服务的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或需要更改网络路由器上的防火墙规则,以上内容将有所不同。