Kube:使用IPVS和External IP对K8S集群进行外部负载均衡
为什么IPVS DR和External IP可以结合在一起使用
IPVS DR方式转发的原理如下:
数据包在LB转发过程中,源/目的IP端口都不会变化,LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS,所以每台RS上都必须在环回网卡上绑定LB的虚拟服务IP。
因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!
RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致。因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。
RS处理完请求后,响应直接回给客户端,不再经过LB,因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。
LB和RS须位于同一个子网,因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。
在为k8s service配置external ip,并将external ip设置为ipvs vip后,会在k8s主机的iptables中增加该ip相关的nat条目,在k8s主机接收到目的ip为external ip的数据包后,会直接交由iptables处理,从而满足了ipvs dr相关的转发规则,使数据包得到正确的处理。
使用IPVS DR对K8S Service进行负载均衡
配置lb为192.168.0.63:80。
配置rs为k8s主机ip加80端口,即192.168.0.74:80,192.168.0.75:80,192.168.0.76:80。
配置转发类型为direct routing。
配置service的type为ClusterIP。
配置service的externalIPs为192.168.0.63,与lb地址相同。
配置service的端口为80。
检查service状态。
service的cluster ip为10.233.149.97。
在service中使用external ip后,会生成相应的iptables条目。
将目的地址为192.168.0.63的数据包转发给相应的pod,包括:10.234.0.4,10.234.2.4和10.234.5.5。
测试访问。
request uri为http://192.168.0.63:8080/。
pod地址为10.234.0.4。
在请求从192.168.0.172到达192.168.0.63后,由主机akw-ebd253b1-c515-57c3-b19a-111b1b4dd7a1将请求转发给10.234.0.4。
回复由192.168.0.63直接转发给192.168.0.172,不再经过ipvs。
使用IPVS DR对K8S Ingress Controller进行负载均衡
配置lb为192.168.0.64:80。
配置rs为k8s主机ip加80端口,即192.168.0.74:80,192.168.0.75:80,192.168.0.76:80。
配置转发类型为direct routing。
配置ingress controller的service type为ClusterIP。
配置ingress controller的service externalIPs为192.168.0.64,与lb地址相同。
配置service的端口为80。
检查ingress controller的service状态。
ingress controller的service cluster ip为10.233.148.68。
在ingress中配置到echoheaders服务80端口的路径为/echoheaders。
检查生成的ingress信息。
在ingress controller的service中使用external ip后,会生成相应的iptables条目。
将目的地址为192.168.0.64的数据包转发给相应的pod,包括:110.234.0.3,10.234.2.3和10.234.5.4。
测试访问。
request uri为http://192.168.0.64:8080/。
pod地址为10.234.0.4。
在请求从192.168.0.172到达192.168.0.64后,由主机akw-ebd253b1-c515-57c3-b19a-111b1b4dd7a1将请求转发给ingress controller 10.234.5.4。
ingress controller将请求转发给10.234.0.4。
回复由192.168.0.64直接转发给192.168.0.172,不再经过ipvs。
领取专属 10元无门槛券
私享最新 技术干货