Kubernetes服务service的负载均衡分析.md
Kubernetes是如何实现service中不同Pod的负载均衡呢?
由于Kubernetes的service是通过iptables实现的,所以需要分析iptable规则。
创建测试环境
我们创建了一个deployment,包含4个Pod,然后分别创建了2个service,类型是ClusterIP和NodePort都指向同一个deployment 'stilton'。如下,
[root@idc-sm-rd-k8s-m-1 ~]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
stilton 4 4 4 4 6d
[root@idc-sm-rd-k8s-m-1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 6d
stilton ClusterIP 10.254.206.15 <none> 80/TCP 6d
stilton02 NodePort 10.254.192.239 <none> 80:30735/TCP 3d
分析iptables规则
使用iptables-save打印所有的iptables规则,我们可以发现如下相关内容
-A KUBE-SVC-W6WAXM5BH6NL6XVI -m comment --comment "default/stilton:http" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-CNYVGC2BVT2LZTTQ
-A KUBE-SVC-W6WAXM5BH6NL6XVI -m comment --comment "default/stilton:http" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-JIUL6WA4RDBFQM3A
-A KUBE-SVC-W6WAXM5BH6NL6XVI -m comment --comment "default/stilton:http" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-N7FRCVWSMEQSSPP6
-A KUBE-SVC-W6WAXM5BH6NL6XVI -m comment --comment "default/stilton:http" -j KUBE-SEP-4IO5BXFRFMJKHYHX
关键之处就在-m statistic --mode random --probability 0.25 这个地方了,很久以前我们曾经使用这个状态来实现概率性丢包(模拟较差的网络环境)
# for randomly dropping 10% of incoming packets:
iptables -A INPUT -m statistic --mode random --probability 0.1 -j DROP
这里Kubernetes使用了概率来实现负载均衡。
一共4个容器,第一个容器分到了1/4的流量。
第二个容器,因为剩余3/4,所以乘以1/3,所以也是1/4的流量。
第三个容器是,1/2乘以1/2,也会得到1/4的流量。
第四个容器,获取剩余的1/4。
转载请注明:IPCPU-网络之路 » Kubernetes服务service的负载均衡分析