Docker Swarm环境下Traefik v2无法访问跨节点服务故障求助
可能的故障原因
根据你给出的配置和现象,最可能的原因按概率从高到低排序:
- 节点防火墙未放通Docker Swarm Overlay网络所需的UDP端口,跨节点流量被拦截
- 节点iptables的FORWARD链默认策略为DROP,跨节点Overlay流量被规则拦截
- Traefik服务发现获取到的跨节点服务IP异常,无法正确路由到后端
uccser-dev-publicOverlay网络配置异常,Traefik容器的网络栈无法路由到其他节点的服务IP
排查步骤
1. 检查集群节点端口开放情况
Docker Swarm Overlay网络正常运行需要以下端口全局放通,注意4789和7946是UDP协议,很多用户会漏掉UDP规则:
| 端口 | 协议 | 作用 |
|---|---|---|
| 2377 | TCP | Swarm集群管理通信 |
| 7946 | TCP/UDP | 节点成员发现、健康检查 |
| 4789 | UDP | Overlay网络VXLAN数据传输 |
验证命令示例:
# 测试TCP端口连通性 nc -zv <目标节点IP> 2377 nc -zv <目标节点IP> 7946 # 测试UDP端口连通性 nc -zvu <目标节点IP> 7946 nc -zvu <目标节点IP> 4789
2. 检查iptables转发规则
所有节点执行以下命令查看FORWARD链默认策略:
iptables -L FORWARD
如果默认策略为DROP,且没有针对docker overlay流量的放行规则,跨节点流量会被直接拦截。
3. 验证Traefik服务发现的后端IP是否正确
你已经开启了Traefik的DEBUG日志,在日志中搜索测试服务的名称,查看Traefik识别到的后端IP:
- 进入部署在其他节点的Nginx测试容器,执行
ip a查看uccser-dev-public网卡对应的IP - 对比Traefik日志中记录的该服务的后端IP是否一致
如果不一致说明服务发现的网络选择错误。
4. 检查Overlay网络配置
执行以下命令查看公共网络的配置:
docker network inspect uccser-dev-public
确认以下参数符合预期:
Scope字段值为swarmAttachable字段值为true- 所有节点上该网络的ID完全一致,不存在同名不同ID的异常
对应解决方法
- 端口未放通的情况:
对应你的操作系统防火墙规则,放通上述3个端口的对应协议,以ufw为例:
ufw allow 2377/tcp ufw allow 7946 ufw allow 4789/udp ufw reload
- FORWARD链拦截的情况:
临时生效可以执行iptables -P FORWARD ACCEPT,永久生效需要将规则写入系统iptables配置文件。 - 服务发现IP异常的情况:
可以将Traefik配置中的--providers.docker.network=uccser-dev-public参数的网络名替换为网络的完整ID(通过docker network ls获取),避免同名网络冲突。 - Overlay网络配置异常的情况:
删除并重建公共overlay网络:
docker network rm uccser-dev-public docker network create --driver overlay --scope swarm --attachable uccser-dev-public
内容的提问来源于stack exchange,提问作者Jack Morgan
相关产品推荐
相关产品推荐

