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

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
      

5. 检查Swarm DNS服务是否正常

服务名解析依赖Swarm内置的DNS:

  • 在service1的容器里执行nslookup service3,如果返回NXDOMAIN,说明DNS解析失败:
    • 检查节点上的DNS代理容器是否运行:docker ps | grep docker_dns
    • 如果没有,重启Docker服务恢复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:04:17