建立虛擬私人雲端原生叢集

本頁面說明如何在 Google Kubernetes Engine 中設定虛擬私人雲端原生叢集

總覽

在 GKE 中,叢集可根據將流量從一個 Pod 轉送至另一個 Pod 的方式來區分叢集。使用別名 IP 的叢集稱為「虛擬私人雲端原生叢集」。使用 Google Cloud Platform 路徑的叢集稱為「路徑導向叢集」

別名 IP 的優點

使用別名 IP 位址有幾項優點:

  • Pod IP 位址本身可以在 GCP 網路中直接轉送 (包括透過虛擬私人雲端網路對等互連),不需要佔用路徑配額。
  • Pod IP 會在叢集建立之前保留在網路中,避免與其他運算資源發生衝突。
  • 針對 Pod 的防火牆控管能夠與其節點分開套用。
  • 網路層可以執行防偽檢查,確保輸出流量不會透過任意來源 IP 位址傳送。
  • Cloud Router 可透過 BGP 發布別名 IP 位址。
  • 別名 IP 位址可讓 Pod 直接存取託管的服務,無需使用 NAT 閘道。

限制

  • 您無法將虛擬私人雲端原生叢集遷移至路徑導向叢集

  • 您無法將路徑導向叢集遷移至虛擬私人雲端原生叢集。

  • 舊版網路不能搭配虛擬私人雲端原生叢集使用。如要在舊版網路中建立叢集,請建立路徑導向叢集

  • 內部 Service 的叢集 IP 僅供叢集內部使用。如要在 VPC 內從外部的叢集存取 Kubernetes Service (例如從 Compute Engine 執行個體),請使用內部負載平衡器

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新至最新版本:
    gcloud components update

次要範圍

虛擬私人雲端原生叢集會使用兩個次要 IP 位址範圍:

  • Pod 的位址範圍
  • Service 的位址範圍

虛擬私人雲端原生叢集中的 IP 分配方式與路徑導向叢集中的分配方式不同。在路徑導向叢集中,系統會將單一 CIDR 範圍同時分配給 Pod 和 Service。在虛擬私人雲端原生叢集中,系統則會將單一 CIDR 範圍分配給 Pod,並為 Service 分配獨立的 CIDR 範圍。

次要範圍管理

您可以透過兩種方法來建立次要範圍與叢集的關聯:

由 GKE 代管

您可以讓 GKE 管理次要範圍。這是您建立叢集時使用的預設模式。

建立叢集時,您可以為 Pod 和 Service 指定 CIDR 範圍,也可以定義 Pod 和 Service 的範圍大小。舉例來說,您可以指定 10.0.0.0/16 的範圍,也可以指定 /16 的大小。

由使用者代管

您可以手動建立次要範圍,然後建立使用這些範圍的叢集。如果您以手動的方式建立次要範圍,則必須自行管理這些範圍。

在共用虛擬私人雲端中,託管專案的擁有者會建立次要範圍,並傳送至用戶群以供服務專案中的叢集使用。在服務專案中建立 GKE 叢集的使用者無法使用自己的用戶群憑證來建立次要範圍。

調整叢集大小的注意事項

指定 GKE 叢集的 Pod 和 Service 數量上限取決於叢集的次要範圍大小。叢集建立後就無法變更次要範圍大小。因此在建立叢集時,請確保您選擇的次要範圍足以容納預期的叢集成長規模。

下表概略說明您必須考慮的三種範圍:節點、Pod 和 Service:

範圍 指南
節點

節點 IP 取自與叢集相關聯的子網路主要範圍。叢集子網路必須大到足以容納叢集中的節點總數量。

舉例來說,如果您打算建立包含 900 個節點的叢集,則叢集搭配使用的子網路大小至少必須為 /22。子網路大小 /22 含有 2(32-22) = 210 = 1024 - 4 個保留 IP 位址 = 1020 個保留 IP 位址,足以容納叢集所需的 900 個節點 IP 位址。

Pod

根據預設,每個節點可從 Pod 位址範圍中分配到 /24 (2(32-24) = 28 = 256) 區塊。

舉例來說,如果是包含 900 個節點的叢集,則需要 900 × 256 = 230,400 個 IP 位址。IP 位址必須是大小為 /24 的區塊,以符合指派給節點的精細程度。您需要大小為 /14 或更大的次要範圍。大小為 /14 的 IP 位址範圍可產生 2(32-14) = 218 ≈ 262,000 個 IP 位址。

附註:您可以對節點進行設定,為節點分配特定 IP 範圍,以限制每個節點可執行的 Pod 數量。以上計算皆以 /24 (256 個 IP 地址) 預設大小為基礎。詳情請請參閱最佳化 IP 位址分配一文。

Service

每個叢集都必須保留 IP 位址範圍以供 Kubernetes Service 叢集 IP 位址使用。系統會從 Service 的相關次要範圍指派 Service IP 位址。您必須確保 IP 位址區塊足夠容納您預計要在叢集中執行的 Service 總數量。

舉例來說,如果是最多執行 3000 個 Service 的叢集,則叢集 IP 位址需要用到 3000 個 IP 位址。您需要大小為 /20 或更大的次要範圍。大小為 /20 的 IP 位址範圍可產生 2(32-20) = 212 ≈ 4,000 個 IP 位址。

您僅能在 Pod 位址範圍分配的可用位址中建立節點。如果 Pod 位址範圍中沒有其他可用的 IP 位址,則無法建立節點,並且系統會顯示錯誤訊息 Instance [instance name] creation failed: IP space of [cluster subnet] is exhausted。根據預設,新建立的節點會從 Pod 位址範圍分配到一個 /24 區塊 (256 個 IP 位址),但如果您為每個節點設定不同的 Pod 數量上限,區塊大小則可能會有所不同。

如果您使用由使用者代管的次要範圍,請參考下表,確保您可以達到特定叢集子網路大小的節點上限。

節點子網路大小 節點上限 所需的 Pod IP 位址上限 建議的 Pod 位址範圍
/29 4 1,024 /21
/28 12 3,072 /20
/27 28 7,168 /19
/26 60 15,360 /18
/25 124 31,744 /17
/24 252 64,512 /16
/23 508 130,048 /15
/22 1,020 261,120 /14
/21 2,044 523,264 /13
/20 4,092 1,047,552 /12
/19 8,188 2,096,128 /11(Pod 位址範圍上限)

範圍大小的預設值和限制

範圍 預設大小 大小下限 大小上限
節點 (叢集子網路)

/20 = 212 = 4,096 - 4 個保留 IP 位址 = 4092 個節點 IP 位址

/29 = 23 = 8 - 4 個保留 IP 位址 = 4 IP 個節點 IP 位址

/7 = 225 = 大約 3,300 萬個節點 IP 位址

Pod (次要範圍)

/14 = 218 = 262,114 個分配給 Pod 的 IP 位址

/24 = 28 = 256 個分配給 Pod 的 IP 位址


/21 = 211 = 2,048 個分配給 Pod 的 IP 位址 (GKE 代管範圍)

/11 = 221 = 大約 200 萬個 IP 位址

Service (次要範圍)

/20 = 212 = 4,096 個分配給 Service 的 IP 位址

/27 = 25 = 32 個分配給 Service 的 IP 位址

/16 = 216 = 65,536 個分配給 Service 的 IP 位址

建立虛擬私人雲端原生叢集

如要建立虛擬私人雲端原生叢集,您可以使用 Google Cloud Platform Console、gcloud指令列工具或 GKE API。

gcloud

如要建立虛擬私人雲端原生叢集,請執行下列指令,其中 [CLUSTER_NAME] 是您為叢集選擇的名稱:

gcloud container clusters create [CLUSTER_NAME] --enable-ip-alias

主控台

如要建立虛擬私人雲端原生叢集,請執行下列步驟:

  1. 造訪 GCP Console 的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下 [Create cluster] (建立叢集)

  3. 視需要設定您的叢集,然後按一下 [Advanced options] (進階選項)

  4. 在「虛擬私人雲端原生叢集」區段中,保持選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP))。

  5. 按一下 [Create] (建立)

API

如要建立虛擬私人雲端原生叢集,請在叢集資源中定義 IPAllocationPolicy 物件:

{
  "name": [CLUSTER_NAME],
  "description": [DESCRIPTION],
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "clusterIpv4CidrBlock"      : string,
    "servicesIpv4CidrBlock"     : string,
    "clusterSecondaryRangeName" : string,
    "servicesSecondaryRangeName": string,

  },
  ...
}

其中:

  • "clusterIpv4CidrBlock"是 Pod 的 CIDR 範圍大小/位置。您可以決定 Pod 的次要範圍大小,並採用 CIDR 標記法指定 IP/大小 (如 10.0.0.0/14) 或 /大小 (如 /14)。請從虛擬私人雲端的可用空間中選擇具有指定大小的空白空間。如果保留空白,則系統會找出並建立預設大小的有效範圍。
  • "servicesIpv4CidrBlock" 是 Service 的 CIDR 範圍大小/位置。請參閱 "clusterIpv4CidrBlock" 的說明。
  • "clusterSecondaryRangeName" 是 Pod 的次要範圍名稱。次要範圍必須已經存在,且屬於與叢集相關的子網路 (例如以 --subnetwork 旗標指定的子網路)。
  • "serviceSecondaryRangeName" 是 Service 的次要範圍名稱。次要範圍必須已經存在,且屬於與叢集相關的子網路 (例如以 --subnetwork 旗標指定的子網路)。

如需更多叢集範例,請參閱範例

確認叢集的次要範圍

建立虛擬私人雲端原生叢集後,請確認叢集的範圍。

gcloud

如要確認叢集,請執行下列指令:

gcloud container clusters describe [CLUSTER_NAME]

在指令輸出中,查看 ipAllocationPolicy 欄位下的資料:

  • clusterIpv4Cidr 是 Pod 的次要範圍
  • servicesIpv4Cidr 是 Service 的次要範圍

主控台

如要確認叢集,請執行下列步驟:

  1. 造訪 GCP Console 的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 選取所需的叢集。

次要範圍會顯示在「詳細資料」分頁的「叢集」區段中:

  • 「容器位址範圍」是 Pod 的次要範圍
  • 「Service 地址範圍」是 Service 的次要範圍

範例

以下各節提供虛擬私人雲端原生叢集的使用範例。

建立特定 IP 範圍的叢集

gcloud

這項指令會以指定的 Pod 和 Service 範圍建立 my-cluster。系統會自動建立次要範圍,連結至預設的子網路,並且由 GKE 代為管理:

gcloud container clusters create my-cluster \
  --enable-ip-alias --cluster-ipv4-cidr=10.0.0.0/14 \
  --services-ipv4-cidr=10.4.0.0/19

主控台

主控台會以指定的 Pod 和 Service 範圍建立 my-cluster。系統會自動建立次要範圍,連結至預設的子網路,並且由 GKE 代為管理:

  1. 造訪 GCP Console 的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下 [Create cluster] (建立叢集)

  3. 視需要設定您的叢集,然後按一下 [Advanced options] (進階選項)

  4. 在「虛擬私人雲端原生叢集」區段中,保持選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP))。

  5. 在「Pod address range」(Pod 位址範圍) 欄位中,填入 Pod 範圍 (例如:10.0.0.0/14)

  6. 在「Service address range」(Service 位址範圍) 欄位中,填入服務範圍 (例如:10.4.0.0/19)

在不同的子網路上建立特定大小的叢集

這個命令會以指定的 Pod 和 Service 範圍大小建立my-cluster。CIDR 範圍位置是依據虛擬私人雲端中的可用空間決定。系統會建立次要範圍,並連結至預設的子網路 my-subnet,而且次要範圍是由 GKE 代管:

gcloud container clusters create my-cluster \
  --enable-ip-alias\
  --subnetwork my-subnet \
  --cluster-ipv4-cidr=/16 \
  --services-ipv4-cidr=/22

以現有的次要範圍建立叢集

如要進一步瞭解如何建立次要範圍,請參閱別名 IP 範圍總覽

您必須在子網路上建立兩個次要範圍。名為 my-pods 的次要範圍用於 Pod,名為 my-services 的次要範圍則用於 Service:

gcloud compute networks subnets update my-subnet \
    --add-secondary-ranges my-pods=10.0.0.0/16,my-services=10.1.0.0/16 \
    --region us-central1

接著,如要建立您的叢集:

gcloud

執行下列指令:

gcloud container clusters create my-cluster \
--enable-ip-alias \
--cluster-secondary-range-name=my-pods \
--services-secondary-range-name=my-services

主控台

請執行下列步驟:

  1. 造訪 GCP Console 的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下 [Create cluster] (建立叢集)

  3. 視需要設定您的叢集,然後按一下 [Advanced options] (進階選項)

  4. 在「虛擬私人雲端原生叢集」區段中,保持選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP))。

  5. 將「Automatically create secondary ranges」(自動建立次要範圍) 設為 false。

  6. 選取要搭配叢集使用的「Network」(網路) 和「Node subnet」(節點子網路)。

  7. 選取要搭配叢集使用的「Pod secondary range」(Pod 次要範圍) 和「Services secondary range」(Service 次要範圍)。

自動建立子網路

下列程序會使用自動產生的子網路建立新的虛擬私人雲端原生叢集。

gcloud

如要建立使用別名 IP 位址的新叢集,請執行下列指令:

gcloud container clusters create --enable-ip-alias --create-subnetwork name=my-cluster-subnet

在這項指令中,系統會自動為新叢集設定 IP 位址範圍和子網路。您可以提供子網路的名稱 (在這個範例中為 name=my-cluster-subnet) 或提供空字串 ("") 來自動產生名稱。

如要自行設定叢集,請執行下列指令:

gcloud container clusters create [CLUSTER_NAME] --enable-ip-alias \
--create-subnetwork="" --cluster-ipv4-cidr [RANGE] --services-ipv4-cidr [RANGE] ]

在這個指令中:

  • [CLUSTER_NAME] 是您為叢集選擇的名稱。
  • --create-subnetwork 旗標會讓系統自動建立叢集的子網路。
  • --cluster-ipv4-cidr 旗標代表叢集 CIDR 範圍的大小和位置

    [RANGE] 可以是 [IP address]/[SIZE] (例如 10.0.0.0/18) 或只有 /[SIZE] 的格式,這可讓系統自動指派 IP 地址。如果省略這個旗標,系統則會使用預設大小自動指派 CIDR 範圍。

  • --services-ipv4-cidr 旗標代表 Service CIDR 範圍的大小和位置。[RANGE] 規範與 --cluster-ipv4-cidr 相同。這個範圍不得與 --cluster-ip4-cidr 重疊,反之亦然。如果省略這個旗標,系統則會使用預設大小自動指派 CIDR 範圍。

API

如要建立虛擬私人雲端原生叢集,請在叢集資源中定義 IPAllocationPolicy 物件:

{
  "name": [CLUSTER_NAME],
  "description": [DESCRIPTION],
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "createSubnetwork": true,
    "subnetworkName": [SUBNET_NAME]
  },
  ...
}

createSubnetwork 會自動建立及佈建叢集的子網路。subnetworkName 是選用參數,如果保留空白,則系統會自動為子網路選擇名稱。

疑難排解

本節說明如何解決虛擬私人雲端原生叢集的相關問題。

IP 別名無法與舊版網路一起使用

透過 Google Cloud Platform Console 建立新的叢集時,系統會預設採用虛擬私人雲端原生叢集。不過,您無法在舊版網路中建立虛擬私人雲端原生叢集。

如要在舊版網路中建立叢集,請建立路徑導向叢集

「projects/[PROJECT_NAME]/regions/XXX/subnetworks/default」資源尚未就緒

可能原因
同一個子網路上有多個平行作業,例如系統正在建立其他虛擬私人雲端原生叢集,或正在子網路中新增或刪除次要範圍。
解決方法
重試該命令。

「resource.secondaryIpRanges[1].ipCidrRange」欄位有無效的值:「XXX」。無效的「IPCidrRange: XXX」與「XXX」地區中現有的「default」子網路發生衝突

可能原因

系統正在同時建立其他虛擬私人雲端原生叢集,並嘗試分配相同的範圍。

系統正在子網路中新增相同的次要範圍。

解決方法

如果您未指定次要範圍,當系統在建立叢集時傳回這個錯誤,請重試叢集建立指令。

沒有足夠的 IP 空間可供 Pod 使用

問題

叢集長時間卡在佈建狀態

叢集建立作業傳回代管執行個體群組 (MIG) 錯誤

無法在現有叢集中新增節點

可能原因

Pod 次要範圍中尚未分配的空間無法容納叢集要求的節點數量。舉例來說,如果使用者指定大小為 /23 的 Pod 次要範圍,且要求兩個以上的節點,則該叢集可能就會卡在佈建狀態。如需妥善調整 IP 位址範圍大小的相關說明,請參閱調整叢集大小的注意事項一節。

如果在叢集建立期間發生這個問題,請刪除卡在佈建狀態的叢集,然後使用空間滿足叢集需求的次要範圍來建立另一個叢集。舉例來說,如果使用者指定大小小於 /24 的次要 CIDR 範圍,並將其指派給叢集,則該叢集可能就會卡在佈建狀態。

請注意,子網路最多可包含 30 個次要範圍。此外,每個虛擬私人雲端原生叢集至少需要兩個次要範圍:一個 Pod 專用,另一個 Service 專用。

如果在調整節點集區大小期間發生這個問題,您必須刪除現有節點,以挪出空間供新節點使用。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件