本頁面說明如何將私人使用的公開 IP (PUPI) 位址套用至 Google Kubernetes Engine (GKE) Pod 位址區塊。
私下使用的公用 IP (PUPI) 位址,是指您可以在 Google Cloud 虛擬私有雲 (VPC) 網路中私下使用的位址。這些 IP 位址並非 Google 所有。您不必擁有這些公開 IP 位址,即可私下使用。
總覽
GKE 叢集需要節點、Pod 和服務專用的 IP 位址範圍。隨著基礎架構擴充,您可能會面臨標準內部 IP 位址空間 (RFC 1918) 耗盡的問題。如要避免私人 RFC 1918 位址耗盡,其中一個方法是為 GKE Pod CIDR 區塊使用私人使用的公開 IP (PUPI) 位址。PUPI 是 GKE Pod 網路的替代方案,可為其他叢集元件保留私人 IP 位址。
單一叢集:如果您只建立一個 GKE 叢集,可以啟用私人使用的外部 IP 位址範圍,藉此啟用 PUPI。
多個叢集:如果您要處理透過 VPC 對等互連連線的多個 GKE 叢集 (服務供應商的常見情境),則需要更複雜的設定。下圖範例說明公司 (供應商) 如何使用 PUPI 搭配虛擬私有雲對接,向客戶 (消費者) 提供代管服務。

上圖涉及下列考量:
- 主要 CIDR 區塊:用於節點和內部負載平衡器 (ILB) 的非 PUPI CIDR 區塊,且不得與虛擬私有雲重疊。
- 生產者次要 CIDR 區塊:用於 Pod 的 PUPI CIDR 區塊 (例如
45.45.0.0/16)。 - 消費者次要 CIDR 區塊:客戶端的任何其他 PUPI CIDR 區塊 (例如
5.5.0.0/16)。
服務供應商情境中 PUPI 的使用方式
服務供應商 (producer) 在其虛擬私有雲 (vpc-producer) 內的 GKE 叢集 (gke-2) 上執行代管服務。這個叢集使用 PUPI 範圍 45.0.0.0/8 做為 Pod IP 位址。
客戶 (消費者) 自己的虛擬私有雲 (vpc-consumer) 中也有 GKE 叢集 (gke-1),使用不同的 PUPI 範圍 (5.0.0.0/8) 做為 Pod IP 位址。
這兩個 VPC 是透過 VPC 對等互連連線,但節點、服務和內部負載平衡器仍會繼續使用標準私人 IP 位址 (RFC 1918)。
確保虛擬私有雲之間的通訊
- 消費者到生產者:根據預設,消費者的 VPC 會自動與生產者共用 RFC 1918 路由 (但不包括 PUPI)。這樣一來,消費者虛擬私有雲中的資源就能存取生產者虛擬私有雲中的服務 (通常是透過內部負載平衡器)。
- 生產者到消費者:如要讓生產者的 Pod 存取消費者 VPC 中的資源,必須進行明確設定。
- 無重疊:供應商和消費者必須確保消費者的 PUPI 範圍不會與供應商 VPC 中使用的任何 IP 位址衝突。
- 匯出/匯入:供應商必須啟用 PUPI 路徑匯出功能,用戶則必須啟用透過對等互連連線匯入這些路徑的功能。
在 PUPI 範圍重疊時啟用通訊
如果用戶的虛擬私有雲已使用與供應商相同的 PUPI 範圍,供應商 Pod 就無法直接通訊。反之,生產者可以啟用 IP 位址偽裝,將 Pod IP 位址隱藏在生產者的節點 IP 位址後方。
下表列出各虛擬私有雲的預設匯入和匯出設定。您可以使用 gcloud compute networks peerings update 指令修改預設 VPC 對等互連設定。
| 虛擬私有雲網路 | 匯入設定 | 匯出設定 | 附註 |
|---|---|---|---|
| 供應端 | 預設行為 (關閉):不會匯入具有公開 IP 位址的子網路路徑 |
預設行為 (已啟用):匯出採用公開 IP 位址的子網路路由 |
透過服務網路控制的旗標。 |
| 用戶 | 關閉 (預設) | 已開啟 (預設) | 通常由客戶管理,不需透過服務網路修改 |
這些設定會產生下列結果:
- 供應商虛擬私有雲會看到所有客戶路徑。
- 用戶端 VPC 無法看到供應商 VPC 中 Pod 子網路設定的 PUPI 路徑。
- 從生產者 Pod 傳送至
vpc-consumer網路的流量必須在生產者叢集中的節點位址後方進行轉譯。
必要條件
如要在虛擬私有雲 Pod 和另一個虛擬私有雲之間建立通訊,請確保符合下列必要條件和設定:
- GKE 叢集必須符合下列最低版本需求:
- Autopilot 叢集:GKE 1.22 以上版本
- 標準叢集:GKE 1.14 以上版本
- 選取非公開路由或 Google 擁有的 PUPI 範圍。
- 確認兩個虛擬私有雲的節點 IP 位址和主要 IP 位址範圍不會重疊。
- 如要在客戶虛擬私有雲和代管服務之間建立直接的 Pod 對 Pod 通訊,請按照下列步驟操作:
- Autopilot 叢集:為 PUPI 設定 SNAT,確保 Pod 對 Pod 的通訊。您不需要額外設定。
- Standard 叢集:使用 SNAT 將 Pod IP 位址轉換為對應的節點 IP 位址。為 PUPI 流量啟用 SNAT。詳情請參閱「啟用私下使用的外部 IP 位址範圍」。
為 GKE 叢集設定私人使用的公開 IP 位址
如要為 GKE 叢集設定 PUPI 位址,請按照下列步驟操作:
- 設定兩個虛擬私有雲網路。
- 在每個虛擬私有雲網路中設定一個子網路。
- 在每個子網路的次要位址範圍中,設定 PUPI 位址範圍。
- 在兩個虛擬私有雲網路之間建立虛擬私有雲對接關係,並設定適當的匯入和匯出設定。
- 檢查各個虛擬私有雲中的路徑。
費用
在本文件中,您將使用下列 Google Cloud計費元件:
您可以使用 Pricing Calculator,根據預測用量估算費用。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
僅使用 VPC 原生叢集。
設定虛擬私有雲對等互連所需的 IPAM 規格。
設定網路和叢集
建立虛擬私有雲網路:
建立下列兩個虛擬私有雲網路,並將 RFC-1918 設為節點的主要範圍,以及 Pod 的 PUPI 範圍。將 RFC 1918 私人位址空間 (例如
10.x.x.x、172.16.x.x或192.168.x.x) 的主要 IP 位址範圍指派給兩個 VPC。這些範圍通常用於 GKE 叢集中的工作節點。除了內部 IP 位址範圍,請為每個 VPC 指定不同的私人使用的公開 IP 位址 (PUPI) 範圍。這些 PUPI 範圍只會用於對應 GKE 叢集內的 Pod IP 位址。用戶虛擬私有雲網路:這個虛擬私有雲託管 GKE 叢集,用於執行用戶的應用程式或工作負載。您可以採用類似下列的設定:
Network: consumer Subnetwork: consumer-subnet Primary range: 10.129.0.0/24 Service range name and cidr: consumer-services, 172.16.5.0/24 Pod range name and cidr: consumer-pods, 5.5.5.0/24 Cluster name: consumer-cluster供應商虛擬私有雲網路:這個虛擬私有雲會代管 GKE 叢集,負責提供消費者使用的服務。您可以採用類似下列的設定:
Network: producer Subnetwork: producer-subnet Primary range: 10.128.0.0/24 Service range name and cidr: producer-services, 172.16.45.0/24 Pod range name and cidr: producer-pods, 45.45.45.0/24 Cluster name: producer-cluster
如要進一步瞭解如何建立虛擬私有雲網路,請參閱「建立虛擬私有雲網路」。
使用上一步中以 PUPI 範圍建立的虛擬私有雲網路和子網路,您可以建立兩個 GKE 叢集 (
producer和consumer)。使用生產者網路和子網路建立
producer叢集,步驟如下:gcloud container clusters create PRODUCER_CLUSTER_NAME \ --location=PRODUCER_CONTROL_PLANE_LOCATION \ --enable-ip-alias \ --network=PRODUCER_NETWORK_NAME \ --subnetwork=PRODUCER_SUBNETWORK_NAME \ --cluster-secondary-range-name=PRODUCER_PODS \ --services-secondary-range-name=PRODUCER_SERVICES \ --num-nodes=1 \ --project=PRODUCER_PROJECT_ID更改下列內容:
PRODUCER_CLUSTER_NAME:GKE 生產者叢集的名稱。PRODUCER_CONTROL_PLANE_LOCATION:生產者叢集控制層的 Compute Engine 位置。提供區域叢集的區域,或可用區叢集的可用區。PRODUCER_NETWORK_NAME:現有供應商虛擬私有雲網路的名稱。PRODUCER_SUBNETWORK_NAME:現有子網路的名稱。子網路的主要 IP 位址範圍用於節點。子網路必須與叢集使用的子網路位於相同區域。如果省略,GKE 會嘗試使用叢集區域中default虛擬私有雲網路的子網路。PRODUCER_PODS:PRODUCER_SUBNETWORK_NAME中現有的次要 IP 位址範圍名稱,GKE 會將這個範圍用於叢集的 Pod。PRODUCER_SERVICES:PRODUCER_SUBNETWORK_NAME中現有次要 IP 位址範圍的名稱,GKE 會將該範圍用於叢集的 Service。PRODUCER_PROJECT_ID:供應商專案的 ID。
使用下列指令,以消費者網路和子網路建立
consumer叢集:gcloud container clusters create CONSUMER_CLUSTER_NAME \ --location=CONSUMER_CONTROL_PLANE_LOCATION \ --enable-ip-alias \ --network=CONSUMER_NETWORK_NAME \ --subnetwork=CONSUMER_SUBNETWORK_NAME \ --cluster-secondary-range-name=CONSUMER_PODS \ --services-secondary-range-name=CONSUMER_SERVICES \ --num-nodes=1 \ --project=CONSUMER_PROJECT_ID更改下列內容:
CONSUMER_CLUSTER_NAME:GKE 消費者叢集的名稱。CONSUMER_CONTROL_PLANE_LOCATION:消費者叢集控制層的 Compute Engine 位置。如果是區域叢集,請提供區域;如果是可用區叢集,請提供可用區。CONSUMER_NETWORK_NAME:現有用戶虛擬私有雲網路的名稱。CONSUMER_SUBNETWORK_NAME:現有子網路的名稱。節點會使用子網路的主要 IP 位址範圍。子網路必須與叢集使用的子網路位於相同區域。如果省略,GKE 會嘗試在叢集區域的defaultVPC 網路中使用子網路。CONSUMER_PODS:CONSUMER_SUBNETWORK_NAME中現有的次要 IP 位址範圍名稱,GKE 會將這個範圍用於叢集的 Pod。CONSUMER_SERVICES:CONSUMER_SUBNETWORK_NAME中現有的次要 IP 位址範圍名稱,GKE 會將這個範圍用於叢集的服務。CONSUMER_PROJECT_ID:取用者專案的 ID。
如要進一步瞭解如何建立叢集,請參閱「建立叢集」。
按照下列步驟,在 consumer-vpc 網路和 producer-vpc 網路之間建立虛擬私有雲對接關係:
如要將
consumer網路連線至製作人,請執行下列指令:gcloud compute networks peerings create CONSUMER_PEERING_NAME \ --project=CONSUMER_PROJECT_ID \ --network=CONSUMER_NETWORK_NAME \ --peer-network=PRODUCER_NETWORK_NAME將
CONSUMER_PEERING_NAME替換為要新增至用戶網路的對接名稱。如要將
producer網路連線至消費者,請執行下列指令:gcloud compute networks peerings create PRODUCER_PEERING_NAME \ --project=PRODUCER_PROJECT_ID \ --network=PRODUCER_NETWORK_NAME \ --peer-network=CONSUMER_NETWORK_NAME \ --no-export-subnet-routes-with-public-ip \ --import-subnet-routes-with-public-ip將
PRODUCER_PEERING_NAME替換為要新增至供應商網路的對等互連名稱。
根據預設,消費者虛擬私有雲會匯出 PUPI 位址。建立供應商虛擬私有雲時,請使用下列引數,將虛擬私有雲設為匯入 PUPI 位址,但不匯出:
--no-export-subnet-routes-with-public-ip --import-subnet-routes-with-public-ip
驗證網路和子網路
驗證供應商網路:
gcloud compute networks describe PRODUCER_NETWORK_NAME \ --project=PRODUCER_PROJECT_ID輸出結果會與下列內容相似:
... kind: compute#network name: producer peerings: - autoCreateRoutes: true exchangeSubnetRoutes: true exportCustomRoutes: false exportSubnetRoutesWithPublicIp: false importCustomRoutes: false importSubnetRoutesWithPublicIp: true name: producer-peer-consumer …驗證供應商子網路:
gcloud compute networks subnets describe PRODUCER_SUBNETWORK_NAME \ --project=PRODUCER_PROJECT_ID\ --region=PRODUCER_CONTROL_PLANE_LOCATION輸出結果會與下列內容相似:
... ipCidrRange: 10.128.0.0/24 kind: compute#subnetwork name: producer-subnet … secondaryIpRanges: - ipCidrRange: 172.16.45.0/24 rangeName: producer-services - ipCidrRange: 45.45.45.0/24 rangeName: producer-pods …驗證用戶網路:
gcloud compute networks describe CONSUMER_NETWORK_NAME \ --project=CONSUMER_PROJECT_ID輸出結果會與下列內容相似:
... kind: compute#network name: consumer peerings: - autoCreateRoutes: true exchangeSubnetRoutes: true exportCustomRoutes: false exportSubnetRoutesWithPublicIp: true importCustomRoutes: false importSubnetRoutesWithPublicIp: false name: consumer-peer-producer ...驗證用戶端子網路:
gcloud compute networks subnets describe CONSUMER_SUBNETWORK_NAME \ --project=CONSUMER_PROJECT_ID\ --region=CONSUMER_CONTROL_PLANE_LOCATION輸出結果會與下列內容相似:
... ipCidrRange: 10.129.0.0/24 kind: compute#subnetwork name: consumer-subnet ... secondaryIpRanges: - ipCidrRange: 172.16.5.0/24 rangeName: consumer-services - ipCidrRange: 5.5.5.0/24 rangeName: consumer-pods ...
驗證 GKE 叢集及其資源
取得消費者叢集憑證:
gcloud container clusters get-credentials CONSUMER_CLUSTER_NAME \ --project=CONSUMER_PROJECT_ID \ --location=CONSUMER_CONTROL_PLANE_LOCATION輸出結果會與下列內容相似:
... Fetching cluster endpoint and auth data. kubeconfig entry generated for consumer-cluster. ...-
或者,您也可以將下列資訊清單儲存為
deployment.yaml:kubectl apply -f - <<'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: helloweb labels: app: hello spec: selector: matchLabels: app: hello tier: web template: metadata: labels: app: hello tier: web spec: containers: - name: hello-app image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 ports: - containerPort: 8080 resources: requests: cpu: 200m EOF 將資訊清單套用至叢集:
kubectl apply -f deployment.yaml驗證
helloweb部署作業:kubectl get deployment helloweb輸出結果會與下列內容相似:
... NAME READY UP-TO-DATE AVAILABLE AGE helloweb 1/1 1 1 10s ...
驗證解決方案
確認您已成功建立虛擬私有雲對等互連:
gcloud compute networks peerings list輸出內容大致如下,顯示名為 consumer 和 producer 的對接:
NAME NETWORK PEER_PROJECT PEER_NETWORK STACK_TYPE PEER_MTU IMPORT_CUSTOM_ROUTES EXPORT_CUSTOM_ROUTES STATE STATE_DETAILS consumer-peer-producer consumer <project_name> producer IPV4_ONLY 1460 False False ACTIVE [2023-08-07T13:14:57.178-07:00]: Connected. producer-peer-consumer producer <project_name> consumer IPV4_ONLY 1460 False False ACTIVE [2023-08-07T13:14:57.178-07:00]: Connected.確認消費者虛擬私有雲匯出 PUPI 路由:
gcloud compute networks peerings list-routes CONSUMER_PEERING_NAME \ --direction=OUTGOING \ --network=CONSUMER_NETWORK_NAME \ --region=CONSUMER_CONTROL_PLANE_LOCATION輸出內容大致如下,顯示所有三個消費者 CIDR 區塊:
DEST_RANGE TYPE NEXT_HOP_REGION PRIORITY STATUS 10.129.0.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted by peer 172.16.5.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted by peer 5.5.5.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted by peer驗證供應商虛擬私有雲匯入的 PUPI 路徑:
gcloud compute networks peerings list-routes PRODUCER_PEERING_NAME \ --direction=INCOMING \ --network=PRODUCER_NETWORK_NAME \ --region=PRODUCER_CONTROL_PLANE_LOCATION輸出內容會與下列內容相似,顯示所有三個用戶端 CIDR 區塊:
DEST_RANGE TYPE NEXT_HOP_REGION PRIORITY STATUS 10.129.0.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted 172.16.5.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted 5.5.5.0/24 SUBNET_PEERING_ROUTE us-central1 0 accepted驗證 GKE Pod 是否有 PUPI 位址:
kubectl get pod -o wide輸出內容大致如下,顯示 Pod 的 IP 位址落在 5.5.5/24 範圍內。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES helloweb-575d78464d-xfklj 1/1 Running 0 28m 5.5.5.16 gke-consumer-cluster-default-pool-e62b6542-dp5f <none> <none>
後續步驟
- 請參閱「設定私人服務存取權」指南。
- 請參閱「開始使用 Service Networking API」指南。
- 查看有關Google Cloud的參考架構、圖表和最佳做法。歡迎瀏覽我們的 Cloud Architecture Center。