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