![Docker Swarm。位于一个覆盖网络中但位于不同节点的容器无法通过 tcp 相互访问](https://linux22.com/image/769107/Docker%20Swarm%E3%80%82%E4%BD%8D%E4%BA%8E%E4%B8%80%E4%B8%AA%E8%A6%86%E7%9B%96%E7%BD%91%E7%BB%9C%E4%B8%AD%E4%BD%86%E4%BD%8D%E4%BA%8E%E4%B8%8D%E5%90%8C%E8%8A%82%E7%82%B9%E7%9A%84%E5%AE%B9%E5%99%A8%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%20tcp%20%E7%9B%B8%E4%BA%92%E8%AE%BF%E9%97%AE.png)
我有一个包含 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
问题出在出站数据包的校验和错误。因此,这些数据包被网络接口丢弃。
解决方案是禁用校验和卸载。使用 ethtool:
# ethtool -K <interface> tx off