使用別名 IP 位址建立虛擬私人雲端原生叢集

本頁面說明如何使用別名 IP 位址在 Google Kubernetes Engine 中建立虛擬私人雲端原生叢集。如需 GKE 網路的一般資訊,請造訪網路總覽頁面。

總覽

透過別名 IP 位址,GKE 叢集可以從 Google Cloud Platform (GCP) 已知的 CIDR 區塊中分配 IP 位址。這可以使您的叢集資源配置具有更大的調整性,且能讓叢集與其他 GCP 產品和實體之間的互動更良好。

優點

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

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

限制

  • 您目前無法將虛擬私人雲端原生叢集遷移至使用進階路徑的另一叢集。
  • 您目前無法將使用路徑轉送 Pod 的現有叢集遷移至使用別名 IP 位址的叢集。
  • 舊版網路不能搭配虛擬私人雲端原生叢集使用。
  • 內部 Service 的叢集 IP 位址仍舊僅能在叢集內部使用。如果您要在虛擬私人雲端內從叢集外部存取 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 位址建立的叢集會在虛擬私人雲端中使用兩個次要範圍分配 IP 位址:

  • 針對 Pod IP 位址分配別名 IP 位址的範圍
  • 針對 ClusterIP Service 保留空間的範圍,其可避免虛擬私人雲端內發生 Service IP 位址重複使用的情況

別名 IP 位址的分配方式與搭配使用進階路徑的配置方式不同。如果使用進階路徑,整個叢集會分配到一個 CIDR 範圍,且該範圍會在 Pod 和 Service 之間進行分割 (最後的 /20 範圍)。如果使用別名 IP 位址,則 Service 範圍會是叢集範圍以外的不同 CIDR 範圍。

次要範圍管理

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

由 GKE 代為管理

您可以讓控制層管理次要範圍。當您使用別名 IP 位址建立叢集,以及使用 CIDR 範圍/網路遮罩標記 (--cluster-ipv4-cidr--services-ipv4-cidr) 時,系統就會採用這個預設模式。

您可以明確地命名 CIDR 範圍 (如 10.0.0.0/16) 或定義網路遮罩大小 (如 /16),藉此自訂次要範圍大小和位置。當您以這種方式建立或刪除叢集時,GKE 會自動在虛擬私人雲端中建立或刪除次要範圍。

由使用者代管

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

您必須在共用虛擬私人雲端網路上手動建立叢集的次要範圍。在共用虛擬私人雲端中,建立 GKE 叢集的使用者無法透過自己的用戶群憑證來建立次要範圍。主專案的擁有者會建立次要範圍,並將其傳送至用戶群以供叢集使用。

調整叢集大小的注意事項

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

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

範圍 指南
節點

系統會從與叢集相關的子網路主要範圍中擷取節點 IP。叢集子網路需足以容納叢集中的節點總數量。

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

Pod

每個叢集目前可分配到大小為 /24 (2(32-24) = 28 = 256) 的 Pod IP 位址區塊。這些 Pod IP 位址是取自 Pod 的相關次要範圍。透過 --cluster-ipv4-cidr--cluster-secondary-range-name 標記決定的 Pod 範圍大小必須足以容納 (節點總數量 × 256) 個 IP 位址。

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

Service

每個叢集都必須保留 IP 位址範圍以供 Kubernetes Service 叢集 IP 位址使用。系統會從 Service 的相關次要範圍指派 Service IP 位址。請務必確認 IP 位址區塊足夠容納您預計要在叢集中執行的 Service 總數量。您可以使用 --services-ipv4-cidr--services-secondary-range-name 標記來定義範圍。

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

您僅能在 Pod 位址範圍分配的可用位址中進行節點建立作業。Pod 位址範圍中沒有其他可用 IP 位址 (額外建立一個節點至少要有 256 個 IP 位址) 時,節點建立作業會失敗並顯示錯誤 Instance [instance name] creation failed: IP space of [cluster subnet] is exhausted

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

節點子網路大小 節點上限 需要的 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 位址 = 4,092 個節點 IP 位址

/29 = 23 = 8 - 4 個保留 IP 位址 = 4 個節點 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 位址

使用別名 IP 位址建立叢集

您可以透過 Google Cloud Platform 主控台使用別名 IP 位址來建立虛擬私人雲端原生叢集。

您可以設定可指派給節點的 Pod 數量上限,藉此將叢集的 IP 位址空間用量最佳化。

請使用 gcloud 指令列工具或 GKE API。

gcloud

如要使用別名 IP 位址建立叢集,請執行下列指令,其中 [CLUSTER_NAME] 指的是您為叢集選擇的名稱:

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

主控台

如要使用別名 IP 位址建立叢集,請執行下列步驟:

  1. 前往 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

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

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

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

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

API

如要使用別名 IP 位址建立叢集,請在叢集資源中定義 IPAllocationPolicy 物件:

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

  },
  ...
}

其中:

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

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

確認叢集的次要範圍

使用別名 IP 位址建立叢集後,您應確認叢集的範圍。

gcloud

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

gcloud container clusters describe [CLUSTER_NAME]

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

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

主控台

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

  1. 前往 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 選取需要的叢集。

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

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

範例

下列各節將提供別名 IP 位址的使用範例。

使用特定 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 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

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

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

  4. 在「VPC-native」(虛擬私人雲端原生叢集) 區段中,選取 [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 範圍位置是依據 VPC 中的可用空間決定。系統會建立次要範圍並連結至子網路 my-subnet,而且次要範圍是由 GKE 代為管理:

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

使用現有的次要範圍建立叢集

如要進一步瞭解如何建立別名 IP 位址的次要範圍,請參閱別名 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 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

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

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

  4. 從「VPC-native」(虛擬私人雲端原生叢集) 區段中,選取 [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」(服務次要範圍)

自動建立子網路

下列程序會使用自動產生的子網路建立新的別名 IP 位址叢集。

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]:您針對叢集選擇的名稱。
  • --enable-ip-alias 標記表示叢集採用別名 IP 位址。
  • --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

如要使用別名 IP 位址建立叢集,請在叢集資源中定義 IPAllocationPolicy 物件:

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

"useIpAliases": true 會使用別名 IP 位址建立叢集。 createSubnetwork 會自動建立並佈建叢集的子網路。subnetworkName 是選用參數,如果保留空白,則系統會自動為子網路選擇名稱。

疑難排解

本節將說明如何解決別名 IP 位址的相關問題。

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

徵兆: * 叢集長時間卡在佈建狀態 * 叢集建立作業傳回代管執行個體群組 (MIG) 錯誤 * 無法將新節點新增至現有叢集

可能原因

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

如果在叢集建立期間發生這個問題,請刪除卡在佈建狀態的叢集,然後使用空間滿足叢集需求的次要範圍來建立另一個叢集。

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

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

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件