本文主要會闡述 kube-proxy 目前幾種代理模式。
userspace 模式
客戶端訪問 service-ip (clusterIP)請求會先從用戶態(tài)切換到內(nèi)核的 iptables 鲜锚,然后回到用戶態(tài) kube-proxy,kube-proxy 負(fù)責(zé)代理轉(zhuǎn)發(fā)工作漫雷,具體的細(xì)節(jié)如下:
每個(gè) service 都會由 kube-proxy 在 node 節(jié)點(diǎn)上起一個(gè)隨機(jī)的代理端口,iptables 會捕獲 clusterIP 上的端口(targetPort)流量重定向到代理端口鳍咱,任何訪問代理端口的流量都會被代理到 service 后端的一個(gè) Pod 上降盹,默認(rèn)情況下,對后端 Pod 的選擇是輪詢的谤辜。
userspace 模式蓄坏,所有的轉(zhuǎn)發(fā)都是通過 kube-proxy 軟件來實(shí)現(xiàn),如下所示:
iptables 模式
客戶端訪問 service-ip ( clusterIP ) 請求會由 iptables 直接重定向到后端對應(yīng)的 Pod 上丑念,具體的細(xì)節(jié)如下:
每個(gè) service 都會由 kube-proxy 生成對應(yīng)的 iptables 規(guī)則涡戳,iptables 會捕獲 clusterIP 上的端口 (targetPort ) 流量重定向到后端的一個(gè) Pod 上,默認(rèn)情況下脯倚,對后端 Pod 的選擇是隨機(jī)的妹蔽,也可以設(shè)置會話保持。
iptables 模式挠将,所有的轉(zhuǎn)發(fā)都是通過 iptables 內(nèi)核模塊來實(shí)現(xiàn)的胳岂,而 kube-proxy 只負(fù)責(zé)生成相應(yīng)的 iptables 規(guī)則,如下所示:
userspace 模式 和 iptables 模式舔稀,很顯然 iptables 性能和可靠性更好乳丰,iptables 模式不需要 userspace 和 kernal space 的切換,在數(shù)據(jù)轉(zhuǎn)發(fā)上有更高的效率内贮。
ipvs 模式
從 k8s 1.8 版本之后产园,新增 kube-proxy 對 ipvs 的支持,并且在新版本的 k8s 1.11 版本中被納入 GA夜郁。之所以會有 ipvs 這種模式什燕,是因?yàn)?iptables 添加規(guī)則是不增量的,先把當(dāng)前的 iptables 規(guī)則都拷貝出現(xiàn)竞端,再做修改屎即,然后再把修改后的 iptables 規(guī)則保存回去,這樣一個(gè)過程的結(jié)果就是事富,iptables 在更新一條規(guī)則時(shí)技俐,會把 iptables 鎖住,這樣的結(jié)果在服務(wù)數(shù)量達(dá)到一定量級時(shí)统台,性能基本上是不可接受的雕擂。
關(guān)于 ipvs 模式的介紹可以參考以下這篇博客:
ipvs 模式