当访问Service的IP地址时,流量会转发到后端Pod,那这个转发是怎么实现的呢?Service是一个抽象的资源对象,主要用于定义端口映射规则。具体的流量转发工作由kube-proxy组件负责,它利用主机上的iptables和IPVS技术来实现具体的网络转发,如下图所示:
kube-proxy组件默认使用iptables作为代理模式,通过在节点上自动配置iptables规则来实现Pod的负载均衡和网络转发。在使用IPVS作为代理模式时,kube-proxy组件在节点上自动配置IPVS规则来实现Pod的负载均衡和网络转发
1、iptables
当创建一个Service时,kube-proxy组件会在节点上创建一系列iptables规则,这些规则可以在任意节点上通过iptables-save命令进行查看。由于规则比较多,可以结合grep命令过滤出与指定Service名称相关的规则。例如,要查看与名为java-web-demo的Service相关的iptables规则,则执行iptables-save|grep java-web-demo|grep 命令,在输出结果中包含着一条规则
[root@v-k8s-node01-172 ~]# iptables-save | grep java-web-demo | grep KUBE-SERVICES
-A KUBE-SERVICES -d 10.100.86.184/32 -p tcp -m comment --comment "default/java-web-demo cluster IP" -m tcp --dport 80 -j KUBE-SVC-WEIBUWJB5IEUBC6W
这条规则的作用是将目标IP地址10.100.86.184和目标端口80的tcp流量转到KUBE-SVC-WEIBUWJB5IEUBC6W链中进一步处理
- 各部分的含义具体如下:
- -A KUBE-SERVICES:这条规则在 KUBE-SERVICES 链中,该链是专门为Service创建的
- -d 10.100.86.184/32:匹配目标地址为-d 10.100.86.184的流量
- -p tcp:仅处理tcp流量
- --comment "default/java-web-demo cluster IP":这是一个注释,用于对规则进行描述,以方便我们对其进行管理
- -m tcp --dport 80:匹配目标端口为80的tcp流量
- -j KUBE-SVC-WEIBUWJB5IEUBC6W:如果上述条件匹配,则将流量跳转到 KUBE-SVC-WEIBUWJB5IEUBC6W链
继续查看链 KUBE-SVC-WEIBUWJB5IEUBC6W中的规则,执行iptables-save | grep KUBE-SVC-WEIBUWJB5IEUBC6W命令,在输出结果中包含着三条规则
-A KUBE-SVC-WEIBUWJB5IEUBC6W -m comment --comment "default/java-web-demo -> 10.244.116.113:8080" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-QGIX66R4FOPYF4JB
-A KUBE-SVC-WEIBUWJB5IEUBC6W -m comment --comment "default/java-web-demo -> 10.244.184.106:8080" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-I573FBOIRRCRPSA5
-A KUBE-SVC-WEIBUWJB5IEUBC6W -m comment --comment "default/java-web-demo -> 10.244.184.107:8080" -j KUBE-SEP-6GBGHVPUGTGNFTCS
这一组规则用于将流量跳转到指定的链,这里是实现负载均衡的关键所在
iptables规则是按照顺序从上到下匹配的,如果有多条相同条件规则,则会始终匹配到第一条规则。kubernetes为了实现负载均衡的能力,在上述相同条件规则中添加了-m statistic --mode random --probability参数,这表示以随机的方式按照给定的概率选择是否匹配这条规则。距离来说,第一条规则有33.33%的概率被匹配,如果第一条没有被匹配(既未被选中),那么第二条规则酱油50%的概率被匹配,如果前两条规则都没有被匹配(既未被选中),则匹配第三条规则,从而实现了简单的负载均衡算法,确保了这些规则被均匀匹配例如,匹配第一条规则,流量会被调整到KUBE-SEP-QGIX66R4FOPYF4JB链,执行iptables-save|grep KUBE-SEP-QGIX66R4FOPYF4JB命令查看该链规则,其输出结果包含这一条规则
-A KUBE-SEP-QGIX66R4FOPYF4JB -p tcp -m comment --comment "default/java-web-demo" -m tcp -j DNAT --to-destination 10.244.116.113:8080
这条规则的作用是通过DNAT(目标地址转换)将流量重定向到目标IP地址10.244.116.113的tcp端口8080,既其中一个后端PodIP和端口