在K8S中,kube-proxy iptables原理是什麼?

黄嘉波發表於2024-10-07

在 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 表中新增特定的規則,以實現服務發現和服務間的通訊。以下是具體的步驟:

  1. 建立 KUBE-SERVICES
    kube-proxy 會在 NAT 表中的 PREROUTING 鏈中新增規則,並指向一個名為 KUBE-SERVICES 的自定義鏈。所有入站流量都會先經過 PREROUTING 鏈,然後根據規則被重定向到 KUBE-SERVICES 鏈。

  2. 服務規則新增
    對於每一個 Kubernetes 服務(Service),kube-proxy 會在 KUBE-SERVICES 鏈中新增規則,這些規則會根據服務的標籤選擇器(selector)匹配到對應的後端 Pod。

  3. 建立 KUBE-NODEPORTSKUBE-SVC[service-name]
    如果服務啟用了 NodePort 或者 LoadBalancer 型別,kube-proxy 還會建立 KUBE-NODEPORTS 鏈,以及針對每個服務的自定義鏈 KUBE-SVC[service-name]。規則會根據 NodePort 將流量重定向到正確的服務鏈。

  4. 埠對映
    KUBE-SVC[service-name] 鏈中,kube-proxy 新增規則將流量對映到實際的後端 Pod 上。這通常涉及到使用 RANDOM 或者 ROUND_ROBIN 策略來選擇後端 Pod,並且透過 DNAT(目的地網路地址轉換)將目標 IP 地址更改為所選 Pod 的 IP 地址。

  5. 直接返回或繼續處理
    OUTPUT 鏈中,如果流量是從本地發出的,那麼 kube-proxy 可能會在 KUBE-SERVICES 鏈中新增規則直接返回給本地程序,或者繼續處理以到達叢集內的其他節點。

3. 綜上所述

綜上所述,使用 iptables 模式,kube-proxy 可以在不改變應用程式碼的情況下,透過修改網路層的規則來實現服務發現、負載均衡和安全策略。然而,隨著 Kubernetes 叢集規模的增長,大量的 iptables 規則可能會導致效能瓶頸。因此,在某些情況下,使用 ipvs 模式或者第三方解決方案可能會提供更好的效能。

相關文章