本頁說明如何將其他子網路指派給 VPC 原生叢集。指派給叢集的額外子網路可讓您建立新的節點集區,其中節點和 Pod 的 IPv4 位址都來自額外子網路範圍。
本頁面適用於負責為機構設計和建構網路的網路專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
總覽
建立新的 VPC 原生 GKE 叢集時,請選取叢集的預設子網路。如「虛擬私有雲原生叢集的 IP 位址範圍」一文所述,叢集的預設子網路會為節點、Pod 和 Service 提供 IPv4 位址。
您最多可以為虛擬私有雲原生叢集指派八個額外的子網路,大幅擴充叢集。每個新指派的額外子網路都稱為「非預設子網路」。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
需求條件和限制
本節說明為叢集指派及使用額外子網路時的相關規定和限制。您必須符合所有規定,才能指派其他子網路。
- 請確認 GKE 叢集是 VPC 原生叢集,且執行 GKE 1.30.3-gke.1211000 以上版本。使用路由的叢集和舊版網路上的叢集不支援額外子網路。
- 每個叢集最多可指派八個額外子網路。
- 額外子網路只會為節點和 Pod 提供 IPv4 位址。額外的子網路無法用於為節點或 Pod 提供 IPv6 位址。
- 只有新的節點集區可以使用額外子網路,現有節點集區則無法使用。 建立新的節點集區時,如果有多個非預設子網路可用,GKE 會根據 IP 位址需求和所有叢集子網路中 IP 位址的可用性,為節點集區選取最佳子網路。
- 您無法控制新節點集區使用的非預設子網路。 舉例來說,如果叢集有預設子網路 (叢集建立時使用的子網路) 和兩個非預設子網路,您就無法指定新節點集區應使用哪個非預設子網路。
- 非預設子網路中的子網路次要 IPv4 位址範圍,只能供單一叢集使用。
- 額外子網路可能無法與多叢集閘道搭配使用。
- 如果您使用 Pod 的多重網路支援,額外子網路的主要和 Pod IPv4 位址範圍不得與多重網路設定中設定的任何 CIDR 範圍重疊。您設定的額外子網路只會套用至預設網路。這項限制表示節點和 Pod 上的任何額外網路介面,都無法使用這些額外子網路提供的 IP 位址。
- 如果叢集已啟用 Cloud Service Mesh,當您在叢集中新增子網路時,網格無法將流量轉送至非預設子網路中的 Pod。
具有額外子網路的叢集負載平衡器需求
本節說明在叢集上使用其他子網路時,負載平衡器的適用規定。每次建立外部 Ingress、外部 Gateway 或外部 LoadBalancer 服務時,都必須符合這些規定。
- 如要在具有額外子網路的叢集中使用外部 Ingress、Gateway 或 LoadBalancer 服務,叢集必須執行 GKE 1.33.2-gke.4780000 以上版本。
- 使用 GKE Ingress 控制器的外部 Ingress 物件必須使用容器原生負載平衡。
- 啟用 GKE 子設定,適用於內部 LoadBalancer 服務。GKE 子設定只會影響新的內部 LoadBalancer Service。因此,啟用 GKE 子集後,您必須刪除並重新建立叢集中的所有現有服務。
如要建立以後端服務為基礎的外部直通式網路負載平衡器,新的外部 LoadBalancer 服務必須包含
cloud.google.com/l4-rbs: "enabled"註解。這項註解只會影響新的外部 LoadBalancer 服務,不會套用至現有的外部 LoadBalancer 服務。刪除並重新建立所有未使用cloud.google.com/l4-rbs: "enabled"註解建立的外部 LoadBalancer 服務。使用的後端類型 (
GCE_VM_IPNEG 後端或執行個體群組後端) 取決於您建立外部 LoadBalancer 服務時的 GKE 版本。詳情請參閱「節點分組」。
新增一個子網路,並包含一個 Pod IPv4 位址範圍
建立新的子網路,並新增子網路次要 IPv4 位址範圍。子網路必須與叢集位於相同區域和 VPC 網路:
gcloud compute networks subnets create SUBNET_NAME \ --network=NETWORK \ --region=REGION \ --range=PRIMARY_RANGE \ --secondary-range=POD_RANGE_NAME=SECONDARY_RANGE \ --enable-private-ip-google-access更改下列內容:
SUBNET_NAME:新子網路的名稱。NETWORK:包含新子網路的虛擬私有雲網路名稱。REGION:子網路所在的地區。PRIMARY_RANGE:新子網路的主要 IPv4 範圍,採用 CIDR 標記法。詳情請參閱「IPv4 子網路範圍」。POD_RANGE_NAME:次要範圍的名稱。SECONDARY_RANGE:次要 IPv4 範圍,採用 CIDR 標記法。如需有效範圍,請參閱「IPv4 子網路範圍」。
詳情請參閱「使用子網路」。
使用 gcloud CLI 更新叢集,改用額外的子網路:
gcloud container clusters update CLUSTER_NAME \ --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME更改下列內容:
CLUSTER_NAME:現有叢集的名稱。SUBNET_NAME:您建立的新子網路名稱。POD_RANGE_NAME:您要用於 Pod IPv4 位址範圍的子網路次要 IPv4 位址範圍名稱。
新增具有多個 Pod IPv4 位址範圍的子網路
在與叢集相同的區域和虛擬私有雲網路中建立新的子網路。將子網路主要 IPv4 位址範圍設為節點的額外 IPv4 位址範圍。
如要新增 Pod IPv4 位址範圍,請為上一個步驟建立的子網路新增子網路次要 IPv4 位址範圍。
使用 gcloud CLI 更新叢集,改用額外子網路。以下範例新增一個子網路,其中包含兩個 Pod 的子網路次要 IPv4 位址範圍。
gcloud container clusters update CLUSTER_NAME \ --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_1 \ --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_2更改下列內容:
CLUSTER_NAME:現有叢集的名稱。SUBNET_NAME:您建立的新子網路名稱。POD_RANGE_NAME_1和POD_RANGE_NAME_2:您要用於 Pod IPv4 位址範圍的子網路次要 IPv4 位址範圍名稱。
驗證子網路
依叢集:如要查看與叢集相關聯的所有子網路詳細資料,請執行下列指令:
gcloud container clusters describe CLUSTER_NAME
將 CLUSTER_NAME 替換為叢集名稱。
輸出結果會與下列內容相似:
ipAllocationPolicy:
additionalIPRangesConfig:
- podIpv4RangeNames:
- pod-range-1
subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets
依節點集區:如要查看與節點集區相關聯的所有子網路詳細資料,請執行下列指令:
gcloud container node-pools describe POOL_NAME \
--cluster=CLUSTER_NAME \
更改下列內容:
POOL_NAME:節點集區的名稱。CLUSTER_NAME:叢集名稱。
輸出結果會與下列內容相似:
name: pool-1
networkConfig:
podRange: pod-range-1
subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets
移除非預設子網路
從叢集中移除非預設子網路後,叢集就不會再於任何叢集節點集區中使用該子網路的範圍。移除後會產生下列影響:
- 非預設子網路的主要 IPv4 位址範圍,無法用於節點 IPv4 位址範圍。
- 非預設子網路中的子網路次要 IPv4 範圍,無法用於 Pod IPv4 範圍。
移除非預設子網路前,請先刪除使用該子網路的所有節點集區。建議先將子網路設為排空狀態。 處於排空狀態的子網路不會納入新建立節點集區的考量。這樣一來,叢集自動配置器作業 (例如節點集區擴充) 就不會選取您要移除的子網路,且不必為整個叢集停用自動調度資源。
移除子網路的步驟如下:
- 將非預設子網路設為排空狀態。這樣可避免新節點集區選取這個子網路,在叢集上啟用自動調度資源功能時,這項設定就非常實用。
- 刪除使用這個子網路的所有節點集區。
- 從叢集中移除子網路。
如要從叢集中移除非預設子網路,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--remove-additional-ip-ranges=subnetwork=SUBNET_NAME
更改下列內容:
CLUSTER_NAME:叢集名稱。SUBNET_NAME:要從叢集移除的子網路名稱。
如要將非預設子網路的狀態設為排空,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--drain-additional-ip-ranges=subnetwork=SUBNET_NAME
更改下列內容:
CLUSTER_NAME:叢集名稱。SUBNET_NAME:要設為排空狀態的子網路名稱。
如要取消排空非預設子網路,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--undrain-additional-ip-ranges=subnetwork=SUBNET_NAME
更改下列內容:
CLUSTER_NAME:叢集名稱。SUBNET_NAME:要取消排空的子網路名稱。
從叢集移除非預設子網路後,即可刪除非預設子網路。
移除非預設子網路的次要 IPv4 範圍
從叢集移除非預設子網路次要 IPv4 範圍時,GKE 會指示叢集不要在任何節點集區中,將該範圍用於 Pod IPv4 範圍。如果移除的非預設子網路次要 IPv4 範圍,是這個叢集使用的唯一非預設子網路範圍,GKE 也會指示叢集停止使用這個子網路的主要 IPv4 位址做為節點 IPv4 位址。
移除非預設子網路次要 IPv4 範圍前,請務必刪除所有使用該範圍做為 Pod IPv4 位址的節點集區。
如要從叢集移除非預設子網路的次要 IPv4 範圍,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--remove-additional-ip-ranges=\
subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME
更改下列內容:
CLUSTER_NAME:叢集名稱。SUBNET_NAME:非預設子網路的名稱。POD_RANGE_NAME:要從叢集移除的非預設子網路次要 IPv4 範圍名稱。
從叢集移除非預設子網路次要 IPv4 範圍後,即可刪除非預設子網路次要 IPv4 範圍。
在共用虛擬私有雲中使用其他子網路
繼續操作前,請確認您具備以下項目:
- 主專案和服務專案已連結的共用虛擬私有雲環境。如需操作說明,請參閱「使用共用虛擬私有雲設定叢集」。
- 服務專案中正在執行的 GKE 叢集。
- 主專案和服務專案都已啟用所有必要的 API。
在 GKE 叢集的相同網路下,於主專案中建立額外的子網路:
gcloud compute networks subnets create ADDITIONAL_SUBNET_NAME \ --project HOST_PROJECT_ID \ --network shared-net \ --range 172.16.4.0/22 \ --region COMPUTE_REGION \ --secondary-range ADDITIONAL_SUBNET_NAME-services=172.16.16.0/20,ADDITIONAL_SUBNET_NAME-pods=172.20.0.0/14取得 IAM 政策。如要讓服務專案中的 GKE 叢集存取主專案共用 VPC 內的其他子網路,您必須設定必要的 IAM 權限。如果尚未設定權限,請按照下列步驟操作。如果權限已存在,則無須採取任何行動。
gcloud compute networks subnets get-iam-policy ADDITIONAL_SUBNET_NAME \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION輸出結果含有一個
etag欄位,請記下etag的值。建立名為 ADDITIONAL_SUBNET_NAME-policy.yaml 的檔案,並在當中加入下列內容:
bindings: - members: - serviceAccount:SERVICE_PROJECT_NUM@cloudservices.gserviceaccount.com - serviceAccount:service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com role: roles/compute.networkUser etag: ETAG_STRING將
ETAG_STRING換成您先前記下的etag值。設定 ADDITIONAL_SUBNET_NAME 子網路的 IAM 政策:
gcloud compute networks subnets set-iam-policy ADDITIONAL_SUBNET_NAME \ ADDITIONAL_SUBNET_NAME-policy.yaml \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION如這篇文章所述,驗證可用的子網路和次要 IP 位址範圍。
更新額外子網路的共用虛擬私有雲叢集:
gcloud container clusters update CLUSTER_NAME \
--project=SERVICE_PROJECT_ID \
--location=CONTROL_PLANE_LOCATION \
--additional-ip-ranges=subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/ADDITIONAL_SUBNET_NAME,pod-ipv4-range=ADDITIONAL_SUBNET_NAME-pods
更改下列內容:
- :服務專案中的 GKE 叢集名稱。CLUSTER_NAME
- ADDITIONAL_SUBNET_NAME:您在主專案中建立的額外子網路名稱 (例如 tier-2)。
- HOST_PROJECT_ID:主機專案 ID。
- SERVICE_PROJECT_NUM:服務專案名稱。
- COMPUTE_REGION:子網路所在的地區。
這樣一來,您就能在共用虛擬私有雲環境中使用其他子網路。
後續步驟
- 進一步瞭解虛擬私人雲端原生叢集。
- 進一步瞭解如何新增 Pod IPv4 位址範圍。
- 如要進一步瞭解如何最佳化 IP 位址分配,請參閱設定每個節點的最大 Pod 數。