背景
有些部署在国内的业务,有海外用户访问国内的场景,这时候,发现海外无法访问国内;但是在国内访问是正常的;
进一步实验,发现国内跨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
- 修改容器内的该参数是否可行?
验证结果是不行,ipvs的snat发生在主机层面,修改容器内的无效
- 策略路由针对特定IP和端口是否可行
验证结果是可行
-
策略路由针对网段是否可行
企业微信截图_17231022158527.png
验证结果是可行
最后关于ip命令版本:
ip utility, iproute2-5.19.0
网友评论