Docker Swarm跨子网Overlay网络通信异常求助
排查Docker Swarm Overlay网络跨子网连通问题
我来帮你梳理这个问题,这种跨子网的Swarm Overlay网络故障我碰到过好几次,咱们一步步来定位原因:
1. 先确认Swarm集群基础状态
首先得确保集群本身是健康的,Overlay网络依赖Swarm的控制平面:
- 在管理节点执行
docker node ls,检查所有工作节点状态是否为Ready,角色是否标记为Worker。如果节点状态异常,先解决集群节点的连通性问题。 - 查看你的Overlay网络配置:
docker network inspect <你的Overlay网络名>,重点核对:Driver是否为overlay、Scope是否为swarmIPAM.Config里的子网段有没有和主机子网冲突(比如管理节点子网是192.168.1.0/24,Overlay就别用同一段,避免路由混淆)Attachable是否为true(否则手动启动的busybox无法接入这个网络)
2. 验证主机间的Swarm必备端口连通性
Overlay网络依赖VXLAN隧道(UDP 4789),还有Swarm控制平面的TCP 2377、TCP/UDP 7946端口,这些必须在子网间畅通:
- 先在工作节点ping管理节点的静态IP,确认主机层面的静态路由确实生效(你说已经配置了,但再验证一遍更稳妥)
- 用
nc测试端口连通性:# 测试控制平面端口 nc -zv <管理节点静态IP> 2377 # 测试节点发现端口 nc -zv <管理节点静态IP> 7946 nc -zvu <管理节点静态IP> 7946 # 测试VXLAN隧道端口 nc -zvu <管理节点静态IP> 4789
如果这些端口不通,大概率是CoreOS的防火墙(firewalld/iptables)拦截了,这是CoreOS环境里常见的坑。
3. 配置CoreOS防火墙允许Swarm相关流量
CoreOS默认启用防火墙,需要手动开放Swarm所需端口:
# 永久添加端口规则 sudo firewall-cmd --add-port=2377/tcp --permanent sudo firewall-cmd --add-port=7946/tcp --permanent sudo firewall-cmd --add-port=7946/udp --permanent sudo firewall-cmd --add-port=4789/udp --permanent # 重载防火墙使规则生效 sudo firewall-cmd --reload
另外还要确保内核转发开启:
# 临时开启 sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.ipv6.conf.all.forwarding=1 # 写入配置文件永久生效 echo -e "net.ipv4.ip_forward=1\nnet.ipv6.conf.all.forwarding=1" | sudo tee /etc/sysctl.d/99-swarm.conf
4. 检查DHCP工作节点的Swarm广告地址
DHCP节点最容易踩的坑:加入Swarm时没指定--advertise-addr,Docker可能会自动选错误的网卡/IP,导致Overlay隧道建立失败。
- 先让工作节点退出集群,再重新加入(指定实际可用的IP):
docker swarm leave --force docker swarm join --token <你的工作节点令牌> --advertise-addr <工作节点当前IP> <管理节点静态IP>:2377
这里的<工作节点当前IP>必须是管理节点能ping通的那个DHCP分配地址。
5. 容器层面的连通性验证
等上面的配置都调整完,重新测试容器连通:
- 在工作节点启动接入Overlay网络的busybox:
docker run -it --rm --network <你的Overlay网络名> busybox - 先ping同网络的其他工作节点容器IP,再ping管理节点上的容器IP(注意是容器IP,不是管理节点的主机IP!如果要ping主机IP,需要确保Overlay网络的网关能路由到主机子网)
- 在busybox里执行
ip route,查看路由表是否包含到管理节点容器子网的条目。
6. 确认Overlay隧道的Peer状态
在管理节点执行docker network inspect <你的Overlay网络名>,查看Peers字段是否包含所有工作节点的IP。如果工作节点不在列表里,说明VXLAN隧道没建立,回到前面的端口连通性和广告地址排查。
我之前碰到最多的情况就是DHCP节点没指定--advertise-addr,或者CoreOS防火墙没开4789端口,先从这两个点入手排查效率最高。
内容的提问来源于stack exchange,提问作者Lily Mara
相关产品推荐
相关产品推荐

