kube-proxy的userspace, iptables,ipvs模式

1,068 阅读3分钟

kube-proxy总共有3种模式,分别是userspace、iptables、ipvs。 kube-proxy一般是通过daemonset模式部署在节点上。

userspace

官方对userspace模式的介绍: kubernetes.io/zh/docs/con…

在userspace模式下,kube-proxy监听节点上service和endpoints的添加/移除操作,对于每个service,在本地宿主机上随机选择一个TCP端口,任何连接到该端口的请求都会被代理路由到该service对应的其中某个pod。如果该service对应多个后端pod,则kube-proxy通过SessionAffinity 决定选择具体某个pod。最后,kube-proxy安装路由规则获取来自service clusterIp和端口的流量,通过本地随机选择的端口转发流量到后端pod。

userspace模式采用的是轮询算法。 userspace模式已经废弃了。

iptables

官方对iptables模式的介绍: kubernetes.io/zh/docs/con…

iptables模式目前是kube-proxy的默认模式

在iptables模式下,kube-proxy监听节点上service和endpoints的添加和移除操作,并为每一个新增的service在工作节点上随机选择一个TCP端口。然后在这个工作节点上的iptables将流量从该端口发送到集群service服务在iptables中对应的chain,通过该chain将流量发送到对应的后端pod。

后端pod是随机选择的。

这种模式下系统开销小,因为所有的操作都是在内核(kernel)中的netfilter模块完成的。同时这种模式下工作更快更可靠,没有中间商(kube-proxy本身)赚差价。

如果随机选中的pod没有响应,此次连接就失败了,但是在userspace模式下:一旦初次选择的pod没有响应,则还会通过轮询方式继续选择剩下的pod。

ipvs

官方对ipvs模式的介绍: kubernetes.io/zh/docs/con…

使用内核的netlink模块,为新的service创建ipvs规则。在内核中工作。相比于iptables模式,ipvs模式下的kube-proxy重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。

部署nginx服务查看kube-proxy生成的iptables规则

部署nginxdeployment,副本为1

kubectl create deploy nginx --image=nginx:1.15

nginx服务通过NodePort方式暴露

kubectl expose deploy/nginx --port 80 --target-port 80 --type NodePort

查看nginx服务

该nginx服务对应的service ip为10.21.212.148; 随机生成的端口为30716; 对应的endpoints为10.20.0.23:80。

[root@m1 ~]# kd svc nginx
Name:                     nginx
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP:                       10.21.212.148
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30716/TCP
Endpoints:                10.20.0.23:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

kube-proxy为nginx服务创建的iptables

[root@m1 ~]# iptables -L KUBE-NODEPORTS -t nat -n|grep 30716
KUBE-MARK-MASQ  tcp  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx: */ tcp dpt:30716
KUBE-SVC-4N57TFCL4MD7ZTDA  tcp  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx: */ tcp dpt:30716

经过端口30716的数据包会首先被KUBE-MARK-MASQ处理,然后被KUBE-SVC-4N57TFCL4MD7ZTDA处理。

[root@m1 ~]# iptables -L KUBE-SVC-4N57TFCL4MD7ZTDA -t nat -n 
Chain KUBE-SVC-4N57TFCL4MD7ZTDA (1 references)
target     prot opt source               destination         
KUBE-SEP-ANLWGT673S23U3DF  all  --  0.0.0.0/0            0.0.0.0/0 

KUBE-SEP-ANLWGT673S23U3DF里面包含两条rule,经过这两条规则,数据包就会抵达真正的后端nginx pod了。

[root@m1 ~]# iptables -L KUBE-SEP-ANLWGT673S23U3DF -t nat -n
Chain KUBE-SEP-ANLWGT673S23U3DF (1 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  all  --  10.20.96.7           0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp to:10.20.96.7:80