Docker Swarm跨节点Overlay Network服务连通故障咨询
排查Docker Swarm跨节点Overlay网络连通问题
这种跨节点服务连不通的情况在树莓派Swarm集群里确实挺常见的,咱们一步步来定位问题:
1. 先确认service3是否真的接入了目标Overlay网络
首先得排除最基础的配置错误:
- 执行
docker service inspect service3,在输出的Networks字段里,检查是否包含test-overlay。 - 如果没找到,立刻把服务加入网络:
docker service update --network-add test-overlay service3
2. 检查Swarm节点间的必备端口是否开放
Overlay网络依赖节点间的几个核心端口,树莓派默认的ufw防火墙很可能把这些端口挡住了:
需要开放的端口:
2377/tcp:Swarm集群管理通信7946/tcp/udp:节点间的成员通信与 gossip 协议4789/udp:Overlay网络的VXLAN隧道
测试端口连通性(在其中一个节点上执行):
nc -zv <另一节点的IP> 7946 nc -zv <另一节点的IP> 4789
如果不通,执行以下命令放行端口(两个节点都要做):
sudo ufw allow 2377/tcp sudo ufw allow 7946/tcp sudo ufw allow 7946/udp sudo ufw allow 4789/udp sudo ufw reload
3. 验证Overlay网络的集群同步状态
检查网络是否在两个节点上正常同步:
- 执行
docker network inspect test-overlay,查看:Scope字段是否为swarm(确保是Swarm管理的Overlay网络)Peers列表是否包含两个节点的IP和节点ID
如果某个节点不在Peers里,尝试重启该节点的Docker服务:
sudo systemctl restart docker
重启后如果节点退出了集群,重新加入:docker swarm join --token <你的集群token> <管理节点IP>:2377
4. 跳过服务DNS,直接测试容器IP连通性
有时候DNS解析出问题,会导致服务名访问失败,但IP能通:
- 先找到service3所在容器的IP:
docker inspect $(docker ps -q -f name=service3) | grep -A2 IPAddress - 进入service1的容器:
docker exec -it <service1的容器ID> /bin/bash - 尝试ping刚才拿到的service3容器IP,如果ping不通,说明VXLAN隧道有问题:
- 检查树莓派内核是否加载了VXLAN模块:
lsmod | grep vxlan - 如果没有输出,手动加载模块并设置开机启动:
sudo modprobe vxlan echo vxlan | sudo tee /etc/modules-load.d/vxlan.conf
- 检查树莓派内核是否加载了VXLAN模块:
5. 检查Swarm DNS服务是否正常
服务名解析依赖Swarm内置的DNS:
- 在service1的容器里执行
nslookup service3,如果返回NXDOMAIN,说明DNS解析失败:- 检查节点上的DNS代理容器是否运行:
docker ps | grep docker_dns - 如果没有,重启Docker服务恢复DNS服务。
- 检查节点上的DNS代理容器是否运行:
6. 排查子网冲突问题
如果Overlay网络的子网和主机网络子网冲突,也会导致连通失败:
- 执行
docker network inspect test-overlay查看Subnet字段(比如10.0.0.0/24) - 对比两个节点的主机子网(用
ip addr查看),如果有重叠,需要重新创建Overlay网络:
然后把所有服务重新加入这个新网络。docker network rm test-overlay docker network create --driver overlay --subnet 10.1.0.0/24 test-overlay
7. 确认service3自身是否正常运行
最后别忘了检查服务本身的状态:
- 查看service3的日志:
docker service logs service3,确认服务没有启动失败或端口监听错误 - 在service3所在容器里,用
curl localhost:<服务端口>验证服务自身能正常访问
内容的提问来源于stack exchange,提问作者X0r0N
相关产品推荐
相关产品推荐

