Docker Swarm中每两次请求就有一次路由失败问题排查求助
排查单节点Docker Swarm服务每两次请求一次失败的问题
看起来你遇到的是Swarm负载均衡或者服务实例异常导致的交替失败问题,结合你描述的telnet现象,我给你梳理几个排查方向和解决办法:
1. 先检查服务的副本数与实例状态
首先确认你的服务是不是启动了2个副本——如果是,Swarm的默认VIP负载均衡会轮询分发请求到两个实例,要是其中一个实例本身就有问题,就会出现一次通一次失败的情况。
- 执行命令查看服务列表:
看对应服务的docker service lsREPLICAS列是不是2/2(或者类似的多副本配置)。 - 进一步查看每个副本的运行状态:
检查有没有副本处于docker service ps <你的服务名称>Restarting或者Failed状态,或者节点调度异常。 - 登录到每个容器内部,测试服务本身是否正常:
如果其中一个容器内部访问就失败,那问题出在服务镜像或者启动配置上,和Swarm无关。docker exec -it <容器ID> curl localhost:8091
2. 检查端口映射模式
Swarm的端口映射默认用VIP模式(虚拟IP),单节点集群下偶尔会出现iptables规则异常,导致流量分配紊乱。你可以尝试切换成host模式绕过Swarm的负载均衡,验证问题是否消失:
修改你的docker-compose-swarm.yml中的端口配置:
services: <你的服务>: # 其他配置... ports: - target: 8091 published: 8091 mode: host
然后重新部署服务:
docker stack rm testing1 docker-compose -f docker-compose-swarm.yml config | docker stack deploy -c - testing1
如果切换后问题解决,那就是Swarm VIP机制在单节点下的小问题,你可以选择继续用host模式,或者重启docker daemon修复VIP规则:
systemctl restart docker # Linux系统 # Windows/Mac的话在Docker Desktop里重启应用
3. 排查网络与防火墙问题
当第二次telnet卡住时,检查主机的网络状态和防火墙规则:
- 查看8091端口的连接状态:
看看卡住的连接是不是处于netstat -anp | grep 8091 # Linux # Windows用 netstat -ano | findstr 8091SYN_SENT状态,这可能是防火墙拦截了流量。 - 检查Swarm的 ingress 防火墙链:
确保没有拒绝8091端口流量的规则,要是有异常可以重置docker的iptables规则:iptables -L DOCKER-INGRESS -niptables -F DOCKER-INGRESS systemctl restart docker
4. 查看日志找线索
最后,通过日志定位具体错误:
- 查看docker daemon的日志,看有没有Swarm负载均衡相关的错误:
journalctl -u docker.service -f # Linux # Docker Desktop可以在设置里查看日志 - 查看服务的日志,对比两个副本的输出差异:
docker service logs -f <你的服务名称>
一般来说,按这个顺序排查,很快就能找到问题所在——大概率是某个服务实例异常,或者Swarm的VIP负载均衡在单节点下的临时故障。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

