我有一个包含 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