kube-proxy支持的三种工作模式
userspace模式
userspace模式下,kube-proxy会为每一个service创建一个监听端口,用户请求首先发送给Cluster IP,然后由iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的pod并和其建立连接
该模式下,kube-proxy充当了一个四层负载均衡器的角色,由于kube-proxy运行在userspace下,在转发的过程中会增加内核和用户空间之间的数据拷贝,虽然稳定但是效率比较低
iptables模式
iptables模式下,kube-proxy为service后端的每个pod创建对应的iptables规则,当用户请求时,首先将请求发给cluster IP,然后根据iptables规则,转发到具体的pod上
该模式下kube-proxy的作用仅仅是监听service的变化,生成最新的iptables规则,此时kube-proxy不再承担四层负载均衡器的角色,该模式的优点较userspace模式效率更高,但是不能提供灵活的LB策略,当其中一个pod异常,iptables还是会转发在异常的pod上,并且不会重试
ipvs模式
ipvs模式和iptables模式类似,kube-proxy监控service、pod的变化并创建对应的ipvs规则,ipvs相对于iptables转发效率更高,除此之外,ipvs支持更多的LB算法
开启ipvs模式
1.修改kube-proxy的configmap设置mode为ipvs
[root@k8s-master ~]# kubectl edit cm kube-proxy -n kube-system
44 mode: "ipvs" #在44行左右
configmap/kube-proxy edited
2.重建所有关于kube-proxy的pod
#-l表示根据标签找到对应的pod
[root@k8s-master ~]# kubectl delete pod -l k8s-app=kube-proxy -n kube-system
pod "kube-proxy-4lvxw" deleted
pod "kube-proxy-lkm8r" deleted
pod "kube-proxy-whmll" deleted
3.查看ipvs规则
[root@k8s-master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.81.210:30376 rr
TCP 192.168.122.1:30376 rr
TCP 10.96.0.1:443 rr
-> 192.168.81.210:6443 Masq 1 0 0
TCP 10.96.0.10:53 rr
-> 10.244.0.18:53 Masq 1 0 0
-> 10.244.0.19:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr
-> 10.244.0.18:9153 Masq 1 0 0
-> 10.244.0.19:9153 Masq 1 0 0
TCP 10.101.187.80:80 rr
TCP 10.102.142.245:80 rr
-> 10.244.1.198:8080 Masq 1 0 0
TCP 10.103.231.226:80 rr persistent 10800
-> 10.244.1.202:8080 Masq 1 0 0
TCP 10.111.44.36:443 rr
-> 192.168.81.230:443 Masq 1 1 0
TCP 10.111.227.155:80 rr persistent 10800
TCP 10.244.0.0:30376 rr
TCP 10.244.0.1:30376 rr
TCP 127.0.0.1:30376 rr
TCP 172.17.0.1:30376 rr
UDP 10.96.0.10:53 rr
-> 10.244.0.18:53 Masq 1 0 0
-> 10.244.0.19:53 Masq 1 0 0
以ipvs为例解释
[root@k8s-master ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.96.0.10:53 rr -> 10.244.0.18:53 Masq 1 0 0 -> 10.244.0.19:53 Masq 1 0 0
- 10.96.0.10:53为service的ip,rr表示轮询,下面10.244.0.18、10.244.0.19都是pod的ip地址
- 当访问这个service ip时,kube-proxy会根据ipvs策略通过轮询的方式转发给后端的pod
- 这套规则会在集群上任意节点都生成,因此访问集群任意节点都可以访问到内部的pod