kube-proxy是Kubernetes集群的關鍵組件,負責Service和其后端容器Pod之間進行負載均衡轉發。
CCE當前支持iptables和IPVS兩種轉發模式,各有優缺點。
- IPVS: 吞吐更高,速度更快的轉發模式。適用于集群規模較大或Service數量較多的場景。
- iptables: 社區傳統的kube-proxy模式。適用于Service數量較少或客戶端會出現大量并發短鏈接的場景。
約束與限制
IPVS模式集群下,Ingress和Service使用相同ELB實例時,無法在集群內的節點和容器中訪問Ingress,因為kube-proxy會在ipvs-0的網橋上掛載LB類型的Service地址,Ingress對接的ELB的流量會被ipvs-0網橋劫持。建議Ingress和Service使用不同ELB實例。
iptables
iptables 是一個 Linux 內核功能,提供了大量的數據包處理和過濾方面的能力。它可以在核心數據包處理管線上用 Hook 掛接一系列的規則。iptables 模式中 kube-proxy 在 NAT pre-routing Hook 中實現它的 NAT 和負載均衡功能。
kube-proxy 的用法是一種 O(n) 算法,其中的 n 隨集群規模同步增長,這里的集群規模,更明確的說就是服務和后端 Pod 的數量。
IPVS
IPVS(IP Virtual Server)是在Netfilter上層構建的,并作為Linux內核的一部分,實現傳輸層負載均衡。IPVS可以將基于TCP和UDP服務的請求定向到真實服務器,并使真實服務器的服務在單個IP地址上顯示為虛擬服務。
IPVS 模式下,kube-proxy 使用 IPVS 負載均衡代替了 iptables。這種模式同樣有效,IPVS 的設計就是用來為大量服務進行負載均衡的,它有一套優化過的 API,使用優化的查找算法,而不是簡單的從列表中查找規則。
kube-proxy 在 IPVS 模式下,其連接過程的復雜度為 O(1)。換句話說,多數情況下,他的連接處理效率是和集群規模無關的。
IPVS 包含了多種不同的負載均衡算法,例如輪詢、最短期望延遲、最少連接以及各種哈希方法等。而 iptables 就只有一種隨機平等的選擇算法。
IPVS相較于iptables的優勢大致如下:
- 為大型集群提供了更好的可擴展性和性能
- 支持比iptables更好的負載均衡算法
- 支持服務器健康檢查和連接重試等功能