最新消息:

Kubernetes服务service的负载均衡分析

Linux ipcpu 4577浏览

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的负载均衡分析