在 Kubernetes 中,kube-proxy
使用不同模式來實現其功能,其中 iptables
模式是早期廣泛使用的模式之一。下面詳細介紹 kube-proxy
使用 iptables
模式的基本原理。
1. iptables
原理概述
iptables
是 Linux 核心的一部分,用於定義網路封包過濾規則。它是一個使用者空間的應用程式,用來設定 Linux 核心中的 IP 傳輸規則表。iptables
規則集由一系列的鏈(chain)組成,每個鏈包含了一系列的規則(rule),規則決定了資料包如何被處理。
2. kube-proxy
使用 iptables
模式的原理
當 kube-proxy
使用 iptables
模式時,它會在 Linux 主機的 iptables
表中新增特定的規則,以實現服務發現和服務間的通訊。以下是具體的步驟:
-
建立
KUBE-SERVICES
鏈:
kube-proxy
會在NAT
表中的PREROUTING
鏈中新增規則,並指向一個名為KUBE-SERVICES
的自定義鏈。所有入站流量都會先經過PREROUTING
鏈,然後根據規則被重定向到KUBE-SERVICES
鏈。 -
服務規則新增:
對於每一個 Kubernetes 服務(Service),kube-proxy
會在KUBE-SERVICES
鏈中新增規則,這些規則會根據服務的標籤選擇器(selector)匹配到對應的後端 Pod。 -
建立
KUBE-NODEPORTS
和KUBE-SVC[service-name]
鏈:
如果服務啟用了 NodePort 或者 LoadBalancer 型別,kube-proxy
還會建立KUBE-NODEPORTS
鏈,以及針對每個服務的自定義鏈KUBE-SVC[service-name]
。規則會根據 NodePort 將流量重定向到正確的服務鏈。 -
埠對映:
在KUBE-SVC[service-name]
鏈中,kube-proxy
新增規則將流量對映到實際的後端 Pod 上。這通常涉及到使用RANDOM
或者ROUND_ROBIN
策略來選擇後端 Pod,並且透過 DNAT(目的地網路地址轉換)將目標 IP 地址更改為所選 Pod 的 IP 地址。 -
直接返回或繼續處理:
在OUTPUT
鏈中,如果流量是從本地發出的,那麼kube-proxy
可能會在KUBE-SERVICES
鏈中新增規則直接返回給本地程序,或者繼續處理以到達叢集內的其他節點。
3. 綜上所述
綜上所述,使用 iptables
模式,kube-proxy
可以在不改變應用程式碼的情況下,透過修改網路層的規則來實現服務發現、負載均衡和安全策略。然而,隨著 Kubernetes 叢集規模的增長,大量的 iptables
規則可能會導致效能瓶頸。因此,在某些情況下,使用 ipvs
模式或者第三方解決方案可能會提供更好的效能。