记录一下那天晚上的排查过程。三台 ECS 组了 Docker Swarm,服务副本分布在两个节点上,跨节点的容器互相访问超时,同节点副本之间正常,docker node ls 显示三个节点都是 Ready。
刚开始盯着「节点间的主机名解析不一致,ingress 网络找不到对端地址」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。overlay 网络依赖 4789 端口的 VXLAN,安全组只放行了 TCP 没放 UDP。少数情况下是2377 的集群管理端口只在部分节点放行,节点列表看起来正常但状态同步延迟。
另外,docker_gwbridge 的网段与其他网络冲突,跨节点路由被劫持。
第一件事是确认 overlay 依赖的端口是否可达
nc -zvu -w2 10.0.0.12 4789
随后核对集群各节点的状态与地址
docker node ls && docker info | grep -A3 'Node Address'
再往下在安全组放行三个必要端口
aliyun ecs AuthorizeSecurityGroup --SecurityGroupId sg-xxx --IpProtocol udp --PortRange 4789/4789 --SourceCidrIp 10.0.0.0/24
等前面都确认过,再重建服务并验证跨节点访问
docker service update --force web && docker run --rm --network overlay_net busybox ping -c2 web
别只看报错消失,验证要多做一步。跨节点容器之间 ping 与 curl 都通,docker service ps 显示副本全部 Running,nc 探测 4789 的 UDP 有回应。
这里还有个坑。Swarm 要放行 2377/tcp、7946/tcp+udp、4789/udp 三组端口,漏一组就只坏一半;安全组按最小网段放行,别图省事开 0.0.0.0/0。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
