You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是否为swarm
    • IPAM.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:13:02