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

Docker Swarm路由网格连接超时问题排查求助

排查Swarm Ingress路由失效的实用步骤

从你的描述来看,ingress网络已经在所有节点监听了服务端口,但跨节点访问超时——这事儿大概率和Swarm路由 mesh 的底层机制有关,毕竟ingress的跨节点访问依赖节点间的流量转发、iptables规则以及overlay网络的正常通信。咱们一步步来排查:

1. 先确认Swarm节点间的核心端口连通性

虽然你说两台机器在同一物理网络,但还是要把Swarm集群依赖的几个关键端口验证一遍:

  • 集群节点间必须开放:2377/tcp(集群管理用)、7946/tcp/udp(节点发现)、4789/udp(overlay网络的VXLAN流量)
  • 比如在Node B上用nc测试:nc -zv NodeA_IP 7946 和 nc -zv NodeA_IP 4789,反过来在Node A测Node B的这些端口,确保都能打通。
  • 顺便看看节点的路由表,执行ip route show,确认两个节点在同一子网,没有奇怪的路由规则把流量导去别的地方。

2. 检查Docker自动配置的iptables规则

Swarm的ingress路由全靠iptables做流量转发,哪怕ufw关了,Docker也会自己加规则。你得验证这些规则是否正常:

  • 在Node B上跑iptables -t nat -L DOCKER-INGRESS,看看有没有对应9000端口的转发规则——正常应该能看到类似DNAT tcp -- anywhere anywhere tcp dpt:9000 to:172.18.0.2:9000的条目(172.18.0.2是你ingress-endpoint容器的IP)。
  • 如果规则没了,可以试试重启Docker服务:systemctl restart docker,然后重新发布服务,看规则会不会自动生成。
  • 同时检查iptables -t filter -L DOCKER-INGRESS,确保没有拒绝流量的规则在搞鬼。

3. 验证ingress-endpoint容器的状态

ingress-endpoint是负责流量转发的核心容器,每个节点上都得正常运行:

  • 在Node B上执行docker ps | grep ingress-endpoint,确认容器是Up状态。
  • 如果容器挂了或者异常,可以尝试重建ingress网络(注意:这会中断所有通过ingress发布的服务,先做好备份):
    # 所有节点先退出集群
    docker swarm leave --force
    # 删除旧的ingress网络
    docker network rm ingress
    # 重新加入集群,Docker会自动重建ingress网络
    docker swarm join <你的集群管理节点IP和端口>
    
  • 还可以进入ingress-endpoint容器,测试能不能访问Node A上的服务容器:docker exec -it <ingress-endpoint容器ID> curl <Node A上服务容器的IP>:9000,如果能通,说明内部转发没问题,问题可能出在节点到ingress-endpoint的流量上。

4. 检查内核参数和VXLAN配置

Overlay网络依赖VXLAN,内核参数不对的话肯定玩不转:

  • 检查sysctl net.ipv4.ip_forward是不是1,如果不是,执行sysctl -w net.ipv4.ip_forward=1,再写入/etc/sysctl.conf永久生效。
  • 检查sysctl net.bridge.bridge-nf-call-iptables是不是1,这个必须开,不然Docker的iptables规则没法生效。
  • 看看VXLAN设备:执行ip link show,应该能看到vxlan0设备(属于docker_gwbridge网络),状态得是UP。

5. 扒一扒Docker日志找线索

Docker日志里可能藏着ingress网络的错误信息:

  • 在Node B上执行journalctl -u docker.service -f,然后尝试访问Node B的9000端口,盯着日志看有没有报错——比如连接超时、路由失败之类的,这些信息能帮你精准定位问题。

6. 测试基础Overlay网络的通信

先排除overlay网络本身的问题:创建一个简单的overlay网络,在Node A上启动个Nginx服务加入这个网络,然后在Node B上启动一个容器也加入同一网络,测试能不能ping通Node A上的Nginx容器IP。如果连基础overlay网络都没法通信,那得先解决这个——比如检查节点主机名能不能解析,或者Docker的overlay网络配置有没有异常。


内容的提问来源于stack exchange,提问作者Tyrel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:14