kube-proxy 以 DaemonSet 的形式运行在集群的所有节点中,负责管理集群外到 Service,以及 Service 到 Pod 的流量转发。
kube-proxy 有三种模式:
- userspace
- iptables
- ipvs
在运行了 kube-proxy 的节点上,可以通过下面的命令查看 kube-proxy 的运行模式:
1
| curl localhost:10249/proxyMode
|
iptables
通过 kube-proxy 的 cm 可以查看 mode

我们都知道 SVC 有多种类型,常用的有 ClusterIP、NodePort、Headless、LoadBalancer 等等,这里我们通过创建类型的 SVC,查看 kube-proxy 下发的iptables 规则
ClusterIP

通过 iptables-save 命令打印这个 SVC 的规则

PodIP: 10.233.74.106
ClusterIP: 10.233.54.175
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| -A KUBE-SEP-EUB75IW55XDW6EHN -s 10.233.74.106/32 -m comment --comment "default/nginx:tcp-80" -j KUBE-MARK-MASQ
-A KUBE-SEP-EUB75IW55XDW6EHN -p tcp -m comment --comment "default/nginx:tcp-80" -m tcp -j DNAT --to-destination 10.233.74.106:80
-A KUBE-SERVICES -d 10.233.54.175/32 -p tcp -m comment --comment "default/nginx:tcp-80 cluster IP" -m tcp --dport 80 -j KUBE-SVC-XX3NNXKPRC7N6OJH
-A KUBE-SVC-XX3NNXKPRC7N6OJH ! -s 10.233.64.0/18 -d 10.233.54.175/32 -p tcp -m comment --comment "default/nginx:tcp-80 cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SVC-XX3NNXKPRC7N6OJH -m comment --comment "default/nginx:tcp-80 -> 10.233.74.106:80" -j KUBE-SEP-EUB75IW55XDW6EHN
|
NodePort
把这个 SVC 类型改成 NodePort

通过 iptables-save 命令打印这个 SVC 的规则,多了两条规则

1 2 3 4 5
| -A KUBE-EXT-XX3NNXKPRC7N6OJH -m comment --comment "masquerade traffic for default/nginx:tcp-80 external destinations" -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx:tcp-80" -m tcp --dport 32594 -j KUBE-EXT-XX3NNXKPRC7N6OJH
|
IPVS
通过 kube-proxy 的 cm 可以查看 mode

来自 GPT 的回答: IPVS 是 Linux 内核中实现的虚拟服务器技术,它可以将网络流量负载均衡到多台服务器上,从而提高服务性能和可靠性。
ClusterIP
PodIP: 10.233.76.138
ClusterIP: 10.233.27.36
通过 ipvsadm 命令查看这个虚拟服务器

1 2 3 4 5 6 7 8 9 10
| Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP nginx.default.svc.cluster.lo rr -> 10-233-76-138.nginx.default. Masq 1 0 0
TCP 10.233.27.36:80 rr -> 10.233.76.138:80 Masq 1 0 0
|
NodePort
通过 ipvsadm 命令查看这个虚拟服务器,多了三条规则

1 2 3 4 5 6 7 8 9 10 11
| TCP 169.254.25.10:30229 rr -> 10.233.76.138:80 Masq 1 0 0
TCP 192.168.159.11:30229 rr -> 10.233.76.138:80 Masq 1 0 0
TCP 10.233.74.64:30229 rr -> 10.233.76.138:80 Masq 1 0
|