Docker Swarm跨两个互通网络时Ingress无法跨网段访问问题求助
Docker Swarm跨网段Ingress服务访问异常解决方案
1. 调整Linux内核反向路径过滤参数(rp_filter,最高概率解决)
该参数为Linux系统默认开启的网络校验机制,会丢弃反向路径不符合最优路由规则的数据包。跨网段场景下,Ingress所用的VXLAN封装数据包到达对端节点时,会被rp_filter判定为非法直接丢弃,表现为底层端口通信正常但业务流量不通。
- 临时验证方案(重启后失效):所有集群节点依次执行以下命令:
sysctl -w net.ipv4.conf.all.rp_filter=0 sysctl -w net.ipv4.conf.default.rp_filter=0 # 将eth0替换为你节点上接入10.10.100.x/10.10.150.x网段的物理网卡名 sysctl -w net.ipv4.conf.eth0.rp_filter=0 sysctl -w net.ipv4.conf.docker0.rp_filter=0
执行完成后立即测试跨网段访问服务,如果恢复正常则执行永久配置:
- 永久生效方案:编辑所有节点的
/etc/sysctl.conf文件,添加以下配置:
net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.docker0.rp_filter = 0
保存后执行sysctl -p使配置生效即可。
2. 确认所有节点Swarm宣告地址配置正确
如果部署Swarm时未显式指定--advertise-addr参数,节点会默认选择首个网卡的IP对外宣告,可能导致跨网段节点无法通过宣告地址路由到目标节点。
- 解决方法:重建集群时所有节点显式指定对端网段可路由的本机IP作为宣告地址:
管理节点初始化命令示例:docker swarm init --advertise-addr 10.10.100.10 --default-addr-pool 172.100.0.0/16
工作节点加入命令示例:docker swarm join --advertise-addr 10.10.150.20 <集群管理节点token> 10.10.100.10:2377
3. 排查VXLAN配置冲突
执行docker network inspect ingress查看Ingress网络配置,确认Options字段下的com.docker.network.driver.overlay.vxlanid_list值为4096,没有和内网其他VXLAN隧道的ID冲突。同时检查所有节点的/etc/docker/daemon.json配置,确认其中的bip、default-address-pools等网段配置,没有和10.10.100.x/24、10.10.150.x/24以及配置的172.100.0.0/16地址池重叠。
内容的提问来源于stack exchange,提问作者suchoss
相关产品推荐
相关产品推荐

