因为有客户在搭建集群过程中,问了一下这个k8s流量负载均衡的问题,之前也没有这样深入的了解过这个原理,刚好在b站学习的时候,刚好老师讲到这个知识点,因此学习记录敲一下,这里仅从iptables的数据转发规则来看哈。

环境信息:

访问nginx-svc,映射到后端pod的流量基本上均分

 

 示例图如下:

这里我们就理解一下这个百分之五十是怎么来的?

这里我们重点关注一个组件 kube-proxy

以下来自官方解释:

service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。

kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。

举个例子,现在有podA,podB,podC和serviceAB。serviceAB是podA,podB的服务抽象(service)。

那么kube-proxy的作用就是可以将pod(不管是podA,podB或者podC)向serviceAB的请求,进行转发到service所代表的一个具体pod(podA或者podB)上。

请求的分配方法一般分配是采用轮询方法进行分配。

是的,当然我们kube-proxy的主要功能就是维护集群中iptables规则来保证上述的实现,现在我们来追一下这个负载均衡的规则。

首先查看本地关于目标ip地址的规则,即如果目的地址是10.1.201.93,则进入到以下链

[root@master1 svc]# iptables-save |grep 10.1.201.93 
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.1.201.93/32 -p tcp -m comment --comment "default/nginx-svc:http cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.1.201.93/32 -p tcp -m comment --comment "default/nginx-svc:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-ELCM5PCEQWBTUJ2I

KUBE-MARK-MASQ像这种带MARK的意义不是特别大,相当于只是一个标记的作用。

我比较习惯这样看

[root@master1 svc]# iptables -nvL -t nat |grep 10.1.201.93
 pkts bytes target     prot opt in     out     source               destination         
    0     0 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.1.201.93          /* default/nginx-svc:http cluster IP */ tcp dpt:80
    0     0 KUBE-SVC-ELCM5PCEQWBTUJ2I  tcp  --  *      *       0.0.0.0/0            10.1.201.93          /* default/nginx-svc:http cluster IP */ tcp dpt:80
[root@master1 svc]# 

 然后继续跳转到KUBE-SVC-ELCM5PCEQWBTUJ2I这条链,这里开始区分流量往哪里走了

关于iptables的负载均衡资料如下:

在Linux中使用iptables完成tcp的负载均衡有两种模式:随机、轮询

The statistic module support two different modes:

random:(随机)

the rule is skipped based on a probability

nth:(轮询)

the rule is skipped based on a round robin algorithm

这里的模式是random随机模式,因为规则中指定 --probability 0.5,所以表示有百分之五十的概率会进入到KUBE-SEP-KHPHCKBDJSOBPFFD链中

这里有个目的地址的转换的规则,10.244.0.53:80是我们deply-1的pod的IP地址。即流量有百分之五十的概率访问的是10.244.0.53:80这个地址+端口。

若上面的都不符合,那么就剩下0.5的概率跳转到KUBE-SEP-3ZZCLQK2JUJX66TW这条链中

我们查看一下这个链

 10.244.0.54:80是我们的deploy-2的IP地址+端口。 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐