K8S之ipvs负载均衡原理

发布时间 2023-09-08 14:32:08作者: 属于我的梦,明明还在
1、iptables 、ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个IP 地址上显示为虚拟服务。

2、iptables 模式在 v1.1 中就添加支持了,从 v1.2版本开始 iptables 就是 kube-proxy 默认的操作模式,

ipvs 和iptables 都是基于netfilter的。ipvs 会使用 iptables 进行包过滤、SNAT、masquared。

具体来说,ipvs 将使用ipset来存储需要DROP或masquared的流量的源或目标地址,
以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了。
3、启动ipvs的要求:
k8s版本 >= v1.11
使用ipvs需要安装相应的工具来处理”yum install ipset ipvsadm -y“
确保 ipvs已经加载内核模块, ip_vs、ip_vs_rr、ip_vs_wrr、ip_vs_sh、
nf_conntrack_ipv4。如果这些内核模块不加载,当kube-proxy启动后,会退回到iptables模式。

4、ipvs kube-proxy原理分析:

iptables规则表的DNAT->SNAT方式来处理外部客户端到k8s集群pod内的流量

DNAT 规则:用于将外部客户端发起的请求转发到 K8s 集群中的 Pod。这个规则将通过目的 IP 地址和端口号来匹配外部客户端请求,并将其目标地址和端口修改为相应的 Pod IP 地址和 Pod 端口。

SNAT 规则:用于修改返回流量中的源 IP 为 K8s 集群中的节点 IP。这个规则将通过目的 IP 地址和端口号来匹配返回流量,并将其源 IP 修改为相应的节点 IP。

通俗理解为:外部客户端通过公共 IP 地址和端口(Public IP:Port)发起请求。当流量到达 Kubernetes 集群时,iptables DNAT 规则将目标 IP 地址和端口修改为对应的 Pod IP 地址和 Pod 端口,实现请求的转发。返回的响应流量经过iptables SNAT 规则,源 IP 地址被修改为节点的 IP 地址,确保返回流量正确路由回外部客户端。

ipvs 则是对对虚拟服务(也称为 VIP,即 Virtual IP)进行管理,为了让内核识别 VIP,Kubernetes 会将 Service 的 Cluster IP 绑定到一个虚拟网卡(kube-ipvs0)上。每个 Service 都有一个 Cluster IP,这是一个虚拟 IP 地址,用于代表该 Service。这个 Cluster IP 是负责转发流量到后端 Pod 的 IPVS 虚拟服务的目标地址。