本文說明如何為 Google Distributed Cloud 設定輸出 NAT 閘道。這個閘道會為叢集的輸出流量提供持續性且具決定性的 SNAT IP 位址。執行具有輸出使用者流量 (叢集外部) 的工作負載時,客戶會想使用幾個確定性 IP 位址來識別這類流量。客戶可以藉此建立以 IP 為基礎的安全措施,例如允許清單政策。
本頁內容適用於負責為機構設計及建構網路,並安裝、設定及支援網路設備的網路專家。如要進一步瞭解我們在內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud
您可以使用兩個自訂資源啟用輸出 NAT 閘道。針對特定命名空間,NetworkGatewayGroup
自訂資源會指定浮動 IP 位址,這些位址可設定在選為閘道的節點網路介面上。EgressNatPolicy
自訂資源可讓您指定輸出轉送政策,控管輸出閘道上的流量。
如果未設定輸出 NAT 閘道,或輸出流量不符合流量選取規則,系統會將特定 Pod 傳送至叢集外部目的地的輸出流量,偽裝成 Pod 執行所在節點的 IP 位址。在這種情況下,我們無法保證特定 Pod 的所有輸出流量都會有相同的來源 IP 位址,或會偽裝成相同的節點 IP 位址。
輸出 NAT 閘道是建構在 Dataplane V2 上的進階網路服務。
輸出 NAT 閘道的運作方式
傳出流量選取邏輯是以命名空間選取器、Pod 選取器,以及 CIDR 區塊標記法中的一組目的地 IP 位址範圍為依據。為說明輸出 NAT 閘道的運作方式,我們以從 Pod 到外部消費者的封包流程,以及相應的回應為例。假設節點子網路的 IP 位址位於 192.168.1.0/24 CIDR 區塊。
下圖顯示透過閘道節點輸出流量的網路架構。
封包透過輸出 NAT 閘道的流程可能如下所示:
輸出流量是從 IP 位址為
10.10.10.1
的 Pod 產生,該 Pod 位於 IP 位址為192.168.1.1
的節點中。流量的目的地地址是叢集外部的端點。
如果流量符合輸出規則,eBPF 程式會將輸出流量轉送至閘道節點,而不是直接使用節點 IP 位址進行偽裝。
閘道節點會接收輸出流量。
閘道節點會使用
EgressNATPolicy
自訂資源中指定的來源輸出 IP 位址192.168.1.100
,偽裝原始流量的來源 IP 位址10.10.10.1
。回程流量會回到閘道節點,目的地為
192.168.1.100
。閘道節點會將回程流量的 conntrack 與原始輸出流量的 conntrack 相符,並將目的地 IP 位址重寫為
10.10.10.1
。10.10.10.1
會視為叢集內流量,轉送至原始節點,並傳回原始 Pod。
設定節點流量的浮動 IP 位址
Network Gateway Group 自訂資源是 Google Distributed Cloud 的組合元件。這項資源會管理一或多個浮動 IP 位址的清單,供叢集中的節點用於輸出流量。參與節點取決於指定的命名空間。網路閘道群組會盡力隨時提供浮動 IP 位址。如果使用浮動 IP 位址的節點發生故障,進階網路營運商會將指派的 IP 位址移至下一個可用的節點。使用該 IP 位址的所有工作負載輸出流量也會一併轉移。
建立新的 1.32.100-gke.106 叢集時,請在叢集設定檔中加入 Network Gateway Group 詳細資料 (註解和規格)。
建立 NetworkGatewayGroup
自訂資源
建立叢集時,請在叢集設定檔中將 spec.clusterNetwork.advancedNetworking
欄位設為 true
,即可啟用網路閘道群組,如下列範例所示:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterNetwork:
...
advancedNetworking: true
...
建立 NetworkGatewayGroup
自訂資源時,請將命名空間設為叢集命名空間,並指定浮動 IP 位址清單,如下列範例所示:
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
進階網路運算子會根據下列條件,將浮動 IP 指派給節點:
- 節點子網路:浮動 IP 位址必須與節點的子網路相符。
- 節點角色 (控制層、工作站):指派浮動 IP 位址時,工作站節點的優先順序高於控制層節點。
- 節點是否具有浮動 IP 位址:運算子會優先將節點指派給尚未指派浮動 IP 的節點。
取得 NetworkGatewayGroup
物件時,您可以在 status
區段中找到地址/節點對應。請注意,NetworkGatewayGroup
物件位於 kube-system
命名空間中。如果閘道節點故障,進階網路運算子會將浮動 IP 位址指派給下一個可用節點。
驗證閘道設定
套用閘道設定變更後,您可以使用 kubectl
檢查閘道狀態,並擷取為閘道指定的浮動 IP 位址。
使用下列指令檢查
NetworkGatewayGroup
的狀態,並查看浮動 IP 位址的分配方式:kubectl -n kube-system get networkgatewaygroups.networking.gke.io default -o yaml
如果叢集有兩個節點 (
worker1
和worker2
),回應可能如下所示:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: default spec: floatingIPs: - 192.168.1.100 - 192.168.1.101 - 192.168.1.102 status: nodes: worker1: Up worker2: Up // Or Down floatingIPs: 192.168.1.100: worker1 192.168.1.101: worker2 192.168.1.102: worker1
設定流量選取規則
EgressNATPolicy
自訂資源會指定流量選取規則,並為離開叢集的傳出流量指派確定性 IP 位址。指定自訂資源時,必須提供 egress
(至少有一項規則)、destinationCIDRs
和 egressSourceIP
。
使用 kubectl apply
建立 EgressNATPolicy
自訂資源。以下各節將提供定義規格的詳細資料和範例。
指定輸出路徑規則
EgressNatPolicy
自訂資源可讓您指定輸出流量的下列規則:
您必須在「
egress
」部分中指定一或多個輸出流量選取規則。- 每項規則都包含
podSelector
和namespaceSelector
。 - 選取依據為命名空間標籤 (
namespaceSelector.matchLabels.user
) 和 Pod 標籤 (podSelector.matchLabels.role
)。 - 如果 Pod 符合任何規則 (比對時使用 OR 關係),系統就會選取該 Pod 的輸出流量。
- 每項規則都包含
在
destinationCIDRs
區段中指定允許的目的地地址。destinationCIDRs
會接受 CIDR 區塊清單。- 如果 Pod 的傳出流量目的地 IP 位址落在任何指定 CIDR 區塊的範圍內,系統就會選取該流量做為輸出流量。
在下列範例中,只要符合下列條件,系統就會允許 Pod 的輸出流量:
- Pod 加上
role: frontend
標籤。 - Pod 位於標示為
user: alice
或user: paul
的命名空間中。 - Pod 正在與
8.8.8.0/24
CIDR 區塊中的 IP 位址通訊。
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1
metadata:
name: egress
spec:
sources:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: frontend
- namespaceSelector:
matchLabels:
user: paul
podSelector:
matchLabels:
role: frontend
action: SNAT
destinations:
- cidr: 8.8.8.0/24
gatewayRef:
name: default
namespace: kube-system
如要進一步瞭解如何使用標籤,請參閱 Kubernetes 說明文件中的「標籤和選取器」。
取得輸出流量的來源 IP 位址
EgressNATPolicy
自訂資源 (政策) 會使用 gatewayRef.name
和 gatewayRef.namespace
值來尋找 NetworkGatewayGroup
物件 (閘道)。這項政策會使用閘道的其中一個浮動 IP 位址,做為輸出流量的來源 IP 位址。如果相符的閘道有多個浮動 IP 位址,政策會使用 floatingIPs
清單中的第一個 IP 位址,並忽略任何其他 IP 位址。以範例閘道為例,floatingIPs
清單中的第一個地址是 192.168.1.100
。如果 gatewayRef
區段中的欄位或值無效,系統就無法套用政策物件。
多個輸出政策和多個閘道物件
如上一節所述,每個 egressNATPolicy
物件 (政策) 都會使用與 gatewayRef.name
和 gatewayRef.namespace
相符的閘道物件中,floatingIPs
清單的第一個 IP 位址。您可以建立多項政策,如果打算使用不同的 IP 位址,則需要建立多個 NetworkGatewayGroup
物件,並分別參照這些物件。
每個 NetworkGatewayGroup
資源都必須包含專屬的浮動 IP 位址。
如要設定多個 EgressNATPolicy
物件使用相同的 IP 位址,請為兩者使用相同的 gatewayRef.name
和 gatewayRef.namespace
。
如要設定多個輸出政策和多個閘道物件,請按照下列步驟操作:
在
kube-system
命名空間中建立閘道物件,管理每個浮動 IP 位址。一般來說,每個輸出政策都應有對應的閘道物件,確保系統分配正確的 IP 位址。然後使用
kubectl
驗證每個閘道物件,取得浮動 IP 位址的分配狀態:kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: - 192.168.1.100 status: ... floatingIPs: 192.168.1.100: worker1 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: - 192.168.1.101 status: ... floatingIPs: 192.168.1.101: worker2 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: - 192.168.1.102 status: ... floatingIPs: 192.168.1.102: worker1
建立參照閘道物件的多項政策,例如在上一個步驟中建立的
gateway1
:kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress3 spec: ... gatewayRef: name: gateway3 namespace: kube-system
(選用) 指定要放置浮動 IP 位址的節點
NetworkGatewayGroup
資源支援節點選取器。如要指定一組節點,供系統考慮是否要託管浮動 IP 位址,您可以將節點選取器新增至 NetworkGatewayGroup
物件,如下列範例所示:
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
nodeSelector:
node-type: "egressNat"
節點選取器會比對具有指定標籤的節點,且只有這些節點會納入考量,用來代管浮動 IP 位址。如果指定多個選取器,其邏輯為加法,因此節點必須符合每個標籤,才會被視為可代管浮動 IP 位址。如果沒有許多具有相符標籤的節點,節點選取器可能會降低浮動 IP 位址放置位置的高可用性 (HA) 品質。
輸出流量選取規則和網路政策
輸出 NAT 閘道與網路政策 API 相容。系統會先評估網路政策,且網路政策的優先順序高於輸出 NAT 閘道的流量選取規則。舉例來說,如果輸出流量觸發網路政策,導致封包遭到捨棄,輸出閘道規則就不會檢查封包。只有在網路政策允許封包輸出時,系統才會評估輸出流量選取規則,決定如何處理流量,也就是使用輸出 NAT 閘道,或直接以 Pod 執行的節點 IP 位址進行偽裝。
限制
目前輸出 NAT 閘道的限制包括:
輸出 NAT 閘道僅適用於 IPv4 模式。
輸出 IP 位址必須與節點 IP 位址位於相同的第 2 層網域。