如何让Docker Swarm worker节点通过路由网格转发流量到manager服务
核心疑问确认
即使worker节点没有对应服务的镜像,也完全可以通过Swarm的ingress路由网格将请求转发到manager节点上运行的服务实例,这是Swarm路由网格的原生能力,不需要worker节点本地存在服务镜像、也不需要在worker节点上运行服务副本。
故障排查与配置修改步骤
按优先级依次检查调整以下配置即可解决worker节点无法转发流量的问题:
1. 开放Swarm集群必要通信端口
Swarm路由网格、节点间通信依赖以下端口必须在manager和worker两个节点的系统防火墙、云服务商安全组中全部放行,绝大多数转发失败问题都是端口未开放导致的:
- TCP 2377:集群管理通信
- TCP/UDP 7946:节点间gossip状态同步
- UDP 4789:overlay网络VXLAN数据传输
2. 检查ingress网络状态
执行以下命令确认worker节点已正常接入Swarm内置的ingress网络:
docker network inspect ingress
如果输出的Peers字段中没有worker节点的信息,或者网络状态异常,按以下步骤重建ingress网络:
# 先删除现有服务栈 docker stack rm minecraft # 删除异常的ingress网络 docker network rm ingress # 重建加密的ingress overlay网络 docker network create --driver overlay --ingress --opt encrypted=true ingress # 重新部署你的Minecraft服务栈
3. 调整服务网络配置
你的服务当前仅加入了自定义的minecraft-net网络,可显式将ingress网络也加入服务的网络列表,确保路由网格可以正常访问服务:
修改minecraft.yml配置如下:
version: '3.7' services: crafty-controller: image: crafty-controller ports: # 如果你需要使用Minecraft默认端口连接,建议显式指定映射,避免自动分配高位端口 # 例如你要开放25565端口就写:- "25565:25565" - "25500-25600" - "13121:13121" volumes: - ./minecraft/docker/minecraft_servers:/minecraft_servers - ./minecraft/docker/db:/crafty_db - /mnt/minecraft-backups:/crafty_web/backups networks: - minecraft-net - ingress # 新增ingress网络 deploy: placement: constraints: - node.labels.minecraft == main networks: minecraft-net: external: true ingress: # 新增ingress网络的外部声明 external: true
4. 检查端口占用
确认worker节点上的13121端口、以及服务自动映射的30000-30100段端口没有被其他进程占用,端口占用会导致路由网格无法监听对应端口,转发失败。
内容的提问来源于stack exchange,提问作者Tarocco
相关产品推荐
相关产品推荐

