kube-proxy 運行在每個節點上,監聽 API Server 中服務對象的變化,再通過管理 IPtables 來實現網絡的轉發。
Kube-Proxy 不同的版本可支持三種工作模式:
UserSpace
k8s v1.2 后就已經淘汰
IPtables
目前默認方式
IPVS
需要安裝ipvsadm、ipset 工具包和加載 ip_vs 內核模塊
啟動腳本:
[Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] # kube-proxy 根據 --cluster-cidr 判斷集群內部和外部流量,指定 --cluster-cidr 或 --masquerade-all 選項后 # kube-proxy 會對訪問 Service IP 的請求做 SNAT,這個特性與calico 實現 network policy沖突,因此禁用 WorkingDirectory=/var/lib/kube-proxy ExecStart=/usr/bin/kube-proxy \ --bind-address=172.16.99.124 \ --hostname-override=172.16.99.124 \ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ --logtostderr=true \ --proxy-mode=iptables Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
iptables:
Kube-Proxy 監聽 Kubernetes Master 增加和刪除 Service 以及 Endpoint 的消息。對於每一個 Service,Kube
Proxy 創建相應的 IPtables 規則,並將發送到 Service Cluster IP 的流量轉發到 Service 后端提供服務的 Pod 的相
應端口上。 注: 雖然可以通過 Service 的 Cluster IP 和服務端口訪問到后端 Pod 提供的服務,但該 Cluster IP 是
Ping 不通的。 其原因是 Cluster IP 只是 IPtables 中的規則,並不對應到一個任何網絡設備。 IPVS 模式的 Cluster
IP 是可以 Ping 通的。

IPVS:
kubernetes從1.9開始測試支持ipvs(Graduate kube-proxy IPVS mode to beta),https://github.com/kubernetes/
kubernetes/blob/master/CHANGELOG-1.9.md#ipvs,從1.11版本正式支持ipvs(IPVS-based in-cluster load
balancing is now GA),https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#ipvs。
IPVS 相對 IPtables 效率會更高一些,使用 IPVS 模式需要在運行 Kube-Proxy 的節點上安裝 ipvsadm、ipset 工具
包和加載 ip_vs 內核模塊,當 Kube-Proxy 以 IPVS 代理模式啟動時,Kube-Proxy 將驗證節點上是否安裝了 IPVS 模
塊,如果未安裝,則 Kube-Proxy 將回退到 IPtables 代理模式。
使用IPVS模式,Kube-Proxy會監視Kubernetes Service對象和Endpoints,調用宿主機內核Netlink接口以
相應地創建IPVS規則並定期與Kubernetes Service對象 Endpoints對象同步IPVS規則,以確保IPVS狀態與
期望一致,訪問服務時,流量將被重定向到其中一個后端 Pod,IPVS使用哈希表作為底層數據結構並在內核空間
中工作,這意味着IPVS可以更快地重定向流量,並且在同步代理規則時具有更好的性能,此外,IPVS 為負載均
衡算法提供了更多選項,例如:rr (輪詢調度)、lc (最小連接數)、dh (目標哈希)、sh (源哈希)、sed (最
短期望延遲)、nq(不排隊調度)等。

實戰修改kube-proxy
修改iptables為ipvs(要修改所有master和node節點)
root@k8s-n2:~# cat /etc/systemd/system/kube-proxy.service
[Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] # kube-proxy 根據 --cluster-cidr 判斷集群內部和外部流量,指定 --cluster-cidr 或 --masquerade-all 選項后 # kube-proxy 會對訪問 Service IP 的請求做 SNAT,這個特性與calico 實現 network policy沖突,因此禁用 WorkingDirectory=/var/lib/kube-proxy ExecStart=/usr/bin/kube-proxy \ --bind-address=172.16.99.124 \ --hostname-override=172.16.99.124 \ --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ --logtostderr=true \ --proxy-mode=ipvs Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
root@k8s-n2:~# systemctl daemon-reload
root@k8s-n2:~# systemctl restart kube-proxy
root@k8s-n2:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 127.0.0.1:30001 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 172.16.99.124:30001 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 172.16.100.24:30001 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 172.17.0.1:30001 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 172.31.111.192:30001 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 10.20.0.1:443 rr -> 172.16.99.121:6443 Masq 1 0 0 TCP 10.20.95.6:8086 rr -> 172.31.111.217:8086 Masq 1 0 0 TCP 10.20.138.198:80 rr -> 172.31.215.91:8082 Masq 1 0 0 TCP 10.20.161.23:443 rr -> 172.31.215.80:8443 Masq 1 0 0 TCP 10.20.222.142:80 rr -> 172.31.215.90:3000 Masq 1 0 0 TCP 10.20.254.254:53 rr -> 172.31.111.209:53 Masq 1 0 0 UDP 10.20.254.254:53 rr -> 172.31.111.209:53 Masq 1 0 0