在Kubernetes(K8S)中,kube-proxy
的 IPVS
模式是一種高效能的負載均衡解決方案,它利用 Linux 核心的 IPVS(IP Virtual Server)功能來實現服務的負載均衡。以下是 kube-proxy
在 IPVS
模式下的工作原理:
-
監聽API伺服器:
kube-proxy
啟動後會持續監聽 Kubernetes API伺服器上的Service
資源物件的變化。每當有新的Service
建立、更新或刪除時,kube-proxy
都會收到通知。 -
配置IPVS規則:當一個新的
Service
被建立時,kube-proxy
會根據Service
的定義資訊,在核心中的IPVS表中建立相應的虛擬服務(Virtual Server)。這個虛擬服務對應的是Service
的Cluster IP和埠。 -
後端Endpoint管理:同樣地,
kube-proxy
會關注Endpoints
資源的變化,即Pod的IP地址和埠集合。當匹配Service
選擇器的Pod發生變化時(例如Pod建立或銷燬),kube-proxy
會動態地將這些Pod的實際IP和埠新增到或從IPVS的Real Server列表中移除,確保虛擬服務與實際後端Pod保持同步。 -
負載均衡策略:IPVS提供了多種負載均衡演算法,如輪詢(round-robin)、最少連線(least connection)、源雜湊(source hashing)等。
kube-proxy
可以根據Service
配置選擇合適的負載均衡策略,並將其應用於IPVS規則中。 -
資料包轉發:網路流量到達
Service
的Cluster IP時,核心中的IPVS模組會根據已配置的虛擬服務和真實伺服器列表進行負載均衡處理,將流量透明地轉發至正確的後端Pod。 -
IPVS與iptables的協同工作:雖然
IPVS
用於負載均衡,但它無法處理kube-proxy
中的其他問題,例如包過濾、資料包偽裝(SNAT)等。因此,IPVS
模式下的kube-proxy
仍然會利用iptables
來處理這些場景。iptables
規則數量在IPVS
模式中是恆定的,因為IPVS
本身已經處理了大部分的負載均衡工作。 -
使用ipset提高效率:為了減少
iptables
規則的數量,IPVS
模式下的kube-proxy
使用ipset
來管理IP地址集合,這樣可以更高效地處理大量的服務和端點。 -
服務的虛擬IP地址機制:
IPVS
模式下,kube-proxy
確保節點中存在虛擬介面(預設為kube-ipvs0
),將服務IP地址繫結到虛擬介面,併為每個服務IP地址建立IPVS虛擬伺服器。
綜上所述,透過這種方式,kube-proxy
在IPVS
模式下利用Linux核心的高效負載均衡能力來提供高可擴充套件性和高效能的服務發現與負載均衡機制,使得Kubernetes叢集內的應用服務能夠穩定、可靠地執行。