本頁說明 Google Kubernetes Engine (GKE) 中的 IP 位址偽裝功能運作方式,並提供不同情境的設定選項。
IP 偽裝總覽
IP 偽裝是一種來源網路位址轉譯 (SNAT) 形式,會進行多對一 IP 位址轉譯。GKE 可以使用 IP 位址偽裝,變更從 Pod 傳送的封包來源 IP 位址。
如要大致瞭解任何 Kubernetes 實作中的 IP 偽裝,請參閱 IP 偽裝代理程式使用者指南。
GKE IP 偽裝
當 IP 偽裝套用至 Pod 發出的封包時,GKE 會將封包的來源 IP 位址從 Pod IP 位址變更為基礎節點的 IP 位址。如果收件者設定為只接收來自叢集節點 IP 位址的封包,偽裝封包的來源 IP 位址就非常實用。
在 Linux 節點上,GKE 會設定 iptables
規則。GKE 會使用 ip-masq-agent
DaemonSet 設定適當的資料平面。
Windows Server 節點集區不支援 IP 偽裝。
標準叢集的 IP 偽裝
在 Standard 叢集中,叢集的 IP 偽裝行為取決於三個因素:
- 您是否已在叢集中部署
ip-masq-agent
DaemonSet,或是 GKE 是否已自動部署。如要瞭解 GKE 自動部署ip-masq-agent
DaemonSet 的情況,請參閱「自動部署ip-masq-agent
的時機」。 - 您是否已在 configMap 中建立
nonMasqueradeCIDRs
自訂清單。ip-masq-agent
- 如果叢集中未部署
ip-masq-agent
DaemonSet,請檢查您是否使用--disable-default-snat
標記建立叢集。如要進一步瞭解這個標記,請參閱「--disable-default-snat
標記的影響」。
下表摘要說明 Standard GKE 叢集的 IP 偽裝設定:
叢集設定 | 產生的 SNAT 行為 |
---|---|
叢集中有 |
對於傳送至 對於傳送至 |
叢集中有 |
對於傳送至一組預設非偽裝目的地的封包,GKE 會保留來源 Pod IP 位址。 對於傳送至預設非偽裝目的地以外的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。 |
叢集中 |
對於傳送至一組預設非偽裝目的地的封包,GKE 會保留來源 Pod IP 位址。 對於傳送至預設非偽裝目的地以外的封包,GKE 會將來源 Pod IP 位址變更為來源節點 IP 位址。 |
叢集中 |
GKE 會保留傳送至所有目的地的封包來源 Pod IP 位址。 如要保留 Pod IPv4 來源位址,並將封包路由至網際網路,請參閱「保留 Pod IPv4 位址來源至網際網路目的地」一文,瞭解重要的路由考量事項。 |
Autopilot 叢集的 IP 偽裝
在 Autopilot 叢集中,GKE 一律會部署 ip-masq-agent
DaemonSet。除了 Pod 傳送至叢集節點、Pod 或服務範圍的封包外,您可以使用 EgressNATPolicy
控制 IP 偽裝行為。如要使用 EgressNATPolicy
,Autopilot 叢集必須符合下列兩項需求:
- 叢集必須使用 GKE 1.23.4-gke.1600 以上版本,或 1.22.7-gke.1500 以上版本。
- 叢集必須啟用 GKE Dataplane V2 才能建立。
下表摘要說明 Autopilot GKE 叢集的 IP 偽裝設定:
Autopilot 叢集設定 | 產生的 SNAT 行為 |
---|---|
叢集包含自訂 |
對於傳送至 對於傳送至 |
叢集不包含自訂
|
預設
|
設定範例
展開下列各節,即可查看根據叢集類型提供的 IP 偽裝和設定範例。
進階設定參考資料
ip-masq-agent
自動部署時
在 Autopilot 模式叢集中,GKE 一律會部署 ip-masq-agent
DaemonSet。
在 Standard 叢集中,如果��旗標未設定,且叢集使用下列其中一種設定組合,GKE 就會部署 DaemonSet:ip-masq-agent
--disable-default-snat
叢集未使用 GKE Dataplane V2,且網路政策強制執行已啟用。
叢集使用的 Pod IP 位址範圍不符合
10.0.0.0/8
。
如要讓 ip-masq-agent
DaemonSet 生效,您也必須在 ip-masq-agent
ConfigMap 中指定 nonMasqueradeCIDRs
清單。詳情請參閱如何設定 IP 偽裝代理程式。
當叢集中有 ip-masq-agent
DaemonSet 時,GKE 會更新及調解叢集每個節點上的服務 Pod。
預設非偽裝目的地
預設非偽裝目的地如下:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4
預設非偽裝目的地適用於具有下列設定的叢集:
您的叢集有
ip-masq-agent
DaemonSet,但其ip-masq-agent
ConfigMap 中未指定nonMasqueradeCIDRs
清單。包括叢集有ip-masq-agent
DaemonSet,但完全沒有ip-masq-agent
ConfigMap 的情況。您的叢集「沒有」
ip-masq-agent
DaemonSet,且未設定--disable-default-snat
標記。
預設非偽裝目的地不適用於具有下列設定的叢集:
叢集具有
ip-masq-agent
DaemonSet,且您在ip-masq-agent
ConfigMap 中指定了自訂nonMasqueradeCIDRs
清單。如果叢集有ip-masq-agent
DaemonSet,自訂nonMasqueradeCIDRs
清單一律會覆寫預設的非偽裝目的地。您的叢集沒有
ip-masq-agent
DaemonSet,且已設定--disable-default-snat
旗標。如要進一步瞭解這項設定,請參閱「--disable-default-snat
旗標的影響」。
--disable-default-snat
旗幟的影響
--disable-default-snat
標記會變更 預設 GKE SNAT 行為,以便保留傳送至所有目的地的封包來源 Pod IP 位址。GKE 不會在叢集中部署任何 ip-masq-agent
DaemonSet,藉此實作預設 SNAT 行為。
如果叢集包含 ip-masq-agent
DaemonSet,--disable-default-snat
旗標就不會生效:
由於 Autopilot 叢集一律包含
ip-masq-agent
DaemonSet,因此--disable-default-snat
旗標對 Autopilot 叢集沒有影響。標準叢集:如果您部署
ip-masq-agent
DaemonSet,或 GKE 自動部署ip-masq-agent
DaemonSet,即使設定了--disable-default-snat
,該旗標對叢集也沒有意義。--disable-default-snat
如果叢集中有ip-masq-agent
DaemonSet,非偽裝目的地會明確指定在ip-masq-agent
ConfigMap 的nonMasqueradeCIDRs
清單中,或是在未定義nonMasqueradeCIDRs
清單時,指定在預設非偽裝目的地中。
叢集建立後,您可以更新叢集來設定 --disable-default-snat
標記。如果叢集未部署 ip-masq-agent
DaemonSet,停用預設 SNAT 後,叢集必須先替換所有節點,變更才會生效 (有時需要數小時)。這是因為 GKE 會在更換叢集中的節點時,遵守您設定的維護期間。如果尚未設定任何維護時間範圍,您必須先手動循環叢集中的節點,--disable-default-snat
標記才會生效。
連結本機偽裝
169.254.0.0/16
範圍用於連結本機 IP 位址。連結本機偽裝是指將傳送至 169.254.0.0/16
目的地的封包來源 Pod IP 位址,變更為來源節點 IP 位址。
Autopilot 叢集一律會保留傳送至 169.254.0.0/16
目的地的封包來源 Pod IP 位址。
根據預設,標準叢集也會保留傳送至169.254.0.0/16
目的地的封包來源 Pod IP 位址。
如要在 Standard 叢集中啟用本機連結 IP 位址偽裝,請執行下列兩項操作:
- 確認
masqLinkLocal
參數存在,且在ip-masq-agent
configMap 中設為True
。如果ip-masq-agent
configMap 中沒有masqLinkLocal
參數,則預設值為False
。如需相關指引,請參閱「檢查ip-masq-agent
ConfigMap」、「建立ip-masq-agent
ConfigMap」和「編輯現有ip-masq-agent
ConfigMap」。 - 確認叢集已部署
ip-masq-agent
DaemonSet。如需相關指引,請參閱「檢查ip-masq-agent
DaemonSet」和「部署ip-masq-agent
DaemonSet」。
使用 hostNetwork: true
的診斷容器和 Pod
除非您為封包指定自訂來源 IP 位址,否則使用 hostNetwork: true
和診斷容器執行的 Pod 會傳送來源與節點 IP 位址相符的封包。對於以 hostNetwork: true
執行的 Pod,GKE 會將節點的 IP 位址指派給 Pod。GKE 不會管理診斷容器的 IP 位址,包括使用工具箱偵錯節點問題的容器。
Autopilot 叢集不支援執行具有 spec.hostNetwork: true
的 Pod。由於無法使用 SSH 存取 Autopilot 叢集的節點,因此您無法在節點上執行診斷容器。
保留傳送至網際網路目的地的 Pod IPv4 位址來源
如果叢集的 IP 位址偽裝設定符合下列任一條件,GKE 會保留傳送至所有目的地 (包括網際網路目的地) 的封包 Pod IP 位址來源:
- 在具有
ip-masq-agent
DaemonSet 的標準叢集中,如果您已在ip-masq-agent
ConfigMap 中將nonMasqueradeCIDRs
設為0.0.0.0
。 - 在沒有
ip-masq-agent
DaemonSet 的 Standard 叢集中,如果您已設定--disable-default-snat
標記。 - 在 Autopilot 叢集中,如果編輯預設的 EgressNATPolicy,使
spec.action
為NoSNAT
,且spec.destinations
包含Cidr: 0.0.0.0/0
。
Pod IPv4 來源是內部 IPv4 位址,因此無法在網際網路上路由傳送。因此,當您為傳送到網際網路的封包保留來源 Pod IPv4 位址時,需要使用下列其中一種技術,才能在封包離開叢集節點後進行路由:
- 請確認虛擬私有雲端網路具有預設路徑,且預設網際網路閘道為下一個躍點,並設定 Cloud NAT 閘道,為叢集中 Pod 使用的子網路次要 IPv4 位址範圍提供公開 NAT 服務。詳情請參閱 Cloud NAT 總覽中的「GKE 互動」。
- 將虛擬私有雲網路設為使用自訂預設路徑,下一個躍點為 VM 執行個體或內部直通式網路負載平衡器,且 VM 或負載平衡器的後端已設為代表 Pod 將封包轉送至網際網路。
還原為預設 SNAT 行為
如要在叢集中存在 ip-masq-agent
DaemonSet 時還原為預設 SNAT 行為,請刪除相關聯的 ip-masq-agent
ConfigMap。ip-masq-agent
DaemonSet 會在管理的節點上還原預設的 IP 偽裝行為。
如要在叢集中沒有 ip-masq-agent
DaemonSet 時還原為預設 SNAT 行為,您必須升級節點集區 (請確認叢集未設定 --disable-default-snat
)。
Autopilot 叢集中的 Egress NAT 政策效果
透過 GKE 輸出 NAT 政策,您可以在 Autopilot 叢集上設定 IP 偽裝。您可以使用 GKE 輸出 NAT 政策自訂資源定義 (CRD),變更從 Pod 傳送的封包來源 IP 位址。
基於安全或 IP 位址耗盡等原因,您可以將 Pod 的 IP 位址偽裝成節點 IP 位址範圍,以利傳送至內部部署網路的出站流量。舉例來說,您可以為 Autopilot 叢集使用非 RFC-1918 範圍,並為節點使用 RFC-1918 範圍。不過,如果 Pod 必須與也使用非 RFC-1918 範圍的內部部署網路通訊,IP 位址可能會重疊。為避免流量遺失,您可以設定輸出 NAT 政策,不要將 Pod 的非 RFC-1918 範圍通告至內部部署網路。Egress NAT 政策會偽裝 Pod 的非 RFC-1918 範圍,改用節點的 RFC-1918 範圍。請確認節點範圍不會與任何地端範圍重疊,否則可能會導致流量迴圈。
GKE 會透過下列程序,對 Autopilot 叢集強制執行 IP 位址偽裝行為:
- GKE 會部署 Egress NAT 控制器和
ip-masq-agent
。 - 建立輸出 NAT 政策。
- GKE 控制器會將政策轉換為
ip-masq-agent
ConfigMap。 ip-masq-agent
DaemonSet 會讀取 ConfigMap,然後 GKE 會強制執行 IP 位址偽裝行為。
自動產生的政策
GKE 支援下列兩種自動產生的輸出 NAT 政策:
- 預設:這些政策可編輯。
- 由 GKE 管理:這些政策是固定值,無法編輯。
預設政策
GKE 會預先定義一組預設 IP 位址範圍。當封包傳送至這些目的地時,叢集不會偽裝 IP 位址來源,並會保留來源 Pod IP 位址。如要變更這些預設 IP 位址範圍,請參閱「編輯及部署 Egress NAT 政策」。
下列資訊清單說明預設的 Egress NAT 政策:
Name: default
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:45Z
Generation: 2
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:45Z
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
f:destinations:
Manager: kubectl
Operation: Update
Time: 2022-03-17T01:58:13Z
Resource Version: 189346
UID: 06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.0.0.0/8
Cidr: 172.16.0.0/12
Cidr: 192.168.0.0/16
Cidr: 240.0.0.0/4
Cidr: 192.0.2.0/24
Cidr: 198.51.100.0/24
Cidr: 203.0.113.0/24
Cidr: 100.64.0.0/10
Cidr: 198.18.0.0/15
Cidr: 192.0.0.0/24
Cidr: 192.88.99.0/24
Status:
Events: <none>
CIDR 範圍與預設非偽裝目的地範圍相同。
由 GKE 政策管理
GKE Egress NAT 政策會保留叢集運作所需的靜態 IP 位址範圍。這個靜態範圍包含叢集的 Pod、服務和節點 IP 位址範圍,可能與預設政策重疊。
您可以透過 GKE 指派的動態 8 位元組雜湊值 (gke-{CLUSTER_SHORT_HASH}
) 識別這項政策。你無法編輯這項政策。
下列資訊清單說明名為 gke-bbfa6c0e-1
的 GKE 管理政策:
Name: gke-bbfa6c0e-1
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:46Z
Generation: 1
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:destinations:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:46Z
Resource Version: 11699
UID: 0201b5de-a6f6-4926-822b-31ed7cdee2c6
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.119.128.0/17
Cidr: 10.120.0.0/22
Cidr: 10.128.0.0/20
Status:
Events: <none>