Docker Swarm。位于一个覆盖网络中但位于不同节点的容器无法通过 tcp 相互访问

Docker Swarm。位于一个覆盖网络中但位于不同节点的容器无法通过 tcp 相互访问

我有一个包含 12 个节点的 docker swarm 集群。部署在单个节点上的容器可以通过覆盖网络顺利地相互访问,但当它们部署在不同的节点上时,就会出现连接问题:主机名已解析,我可以从一个容器 ping 另一个容器,但当我尝试通过 tcp(例如使用 telnet)访问其他容器时,我需要等待很长时间,然后连接超时。每个节点上的防火墙都已为 docker swarm 设置,端口 2377、7946 和 4789 已打开。

示例:在我的主节点上,我运行了以下命令来为不同节点创建服务:

docker network create -d overlay test_net
docker service create --constraint node.labels.first==true --name first --network test_net ubuntu/nginx:1.18-20.04_beta
docker service create --constraint node.labels.second==true --name second --network test_net ubuntu/nginx:1.18-20.04_beta

然后我首先从容器运行:

root@37be801ebe8b:/# ping second
PING second (10.0.5.18): 56 data bytes
64 bytes from 10.0.5.18: icmp_seq=0 ttl=64 time=0.092 ms
64 bytes from 10.0.5.18: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 10.0.5.18: icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from 10.0.5.18: icmp_seq=3 ttl=64 time=0.073 ms
^C--- second ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.079/0.092/0.000 ms

但是,当我尝试使用 telnet 连接其他节点时(此容器中的 nginx 正在监听端口 80):

root@37be801ebe8b:/# telnet second 80
Trying 10.0.5.18...
telnet: Unable to connect to remote host: Connection timed out

有人可以建议解决这个问题的方法吗?

答案1

在这里找到答案https://stackoverflow.com/questions/66251422/docker-swarm-overlay-network-icmp-works-but-not-anything-else

问题出在出站数据包的校验和错误。因此,这些数据包被网络接口丢弃。

解决方案是禁用校验和卸载。使用 ethtool:

# ethtool -K <interface> tx off

答案2

我在多个 VMWare ESXi VM 上部署了 Docker Swarm 集群,并尝试了 @hattivatt 建议的解决方案,并且成功了。但是,重启后这种情况不会持续,需要额外的努力,老实说,这似乎不是正确的做法。

我更改了 docker swarm 使用的数据端口(默认为 4789)并且它成功了!

docker swarm init --advertise-addr w.x.y.z --listen-addr w.x.y.z --data-path-port 1234

根据波特奈尔虚拟机,使用 NSX 时可能会发生这种情况,从而导致 vxlan 端口冲突。但是,我没有使用它!

相关内容