Ip rule策略路由在ipvs下不生效

2024-08-12  本文已影响0人  Teddy_b

背景

有些部署在国内的业务,有海外用户访问国内的场景,这时候,发现海外无法访问国内;但是在国内访问是正常的;

进一步实验,发现国内跨ISP时也无法访问,比如出现移动无法访问联通的情况。

通过验证各种场景下的连通性情况,发现只要经过内部的transparentrouter基础服务的都会不通,而不经过transparentrouter的基本上可以正常访问。

Ip rule

首先查看了宿主机上当前的策略路由

xxx@VM-0-16-ubuntu:~$ /home/xxx/ip rule list
0:      from all lookup local
32000:  from all ipproto udp lookup main
32001:  from all lookup transparentrouter
32766:  from all lookup main
32767:  from all lookup default

按照当前的策略路由,所有的tcp包都会经过transparentrouter这个路由表,而不会经过默认的main路由表

添加策略让特定端口80和30720不经过transparentrouter,转而走默认路由,这里的80端口是容器的监听端口,30720是容器通过Service的NodePort暴露的端口

xxx@VM-0-16-ubuntu:~$ /home/xxx/ip rule add ipproto tcp sport 80 lookup main

xxx@VM-0-16-ubuntu:~$ /home/xxx/ip rule list
0:      from all lookup local
31998:  from all ipproto tcp sport 30720 lookup main
31999:  from all ipproto tcp sport 80 lookup main
32000:  from all ipproto udp lookup main
32001:  from all lookup aprouter
32766:  from all lookup main
32767:  from all lookup default

添加规则后,发现没用,仍然无法访问。

为了简化问题,决定将容器的部署模式改为HostNetwork,然后直接注册容器的IP和端口到Loadbalancer上面;(目前是容器网络模式为calico,然后注册的是NodePort到Loadbalancer上面)

上述将LB的RS改为容器端口后,发现问题解决了,访问正常了。

容器继续使用HostNetwork,但是中间再加一层Service,然后注册Service的NodePort到Loadbalancer上面,发现又不通了;

可以看出问题出在Service这一层;集群里的kube-proxy是ipvs模式部署的,问题可能出在ipvs这里。

ipvs snat_reroute

后来发现可能是宿主机ipvs的配置对策略路由选择有影响


企业微信截图_1723026696265(1).png

参考链接:
https://www.kernel.org/doc/html/latest/networking/ipvs-sysctl.html
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-NAT.html

最终将该配置修改为0后,访问均正常了。

ip rule进一步调整

进一步的测试了几种case

image.png

验证结果是不行,ipvs的snat发生在主机层面,修改容器内的无效

企业微信截图_17231021535526.png

验证结果是可行

验证结果是可行

最后关于ip命令版本:

ip utility, iproute2-5.19.0

上一篇 下一篇

猜你喜欢

热点阅读