設定 Pod 的多網路支援功能


本頁說明如何使用 Pod 的多網路功能,在 Google Kubernetes Engine (GKE) 叢集的節點和 Pod 上啟用多個介面。

閱讀本頁內容前,請先熟悉一般網路概念、這項功能專用的術語和概念,以及 Pod 多重網路支援的需求和限制

詳情請參閱「關於 Pod 的多網路支援功能」。

需求條件和限制

Pod 的多網路支援功能有下列需求和限制:

需求條件

  • GKE Standard 1.28 以上版本。
  • GKE Autopilot 1.29.5-gke.1091000 以上版本,或 1.30.1-gke.1280000 以上版本。
  • Pod 的多重網路支援功能與 Compute Engine 的多重 NIC 功能,使用相同的 VM 層級規格
  • Pod 的多網路功能需要 GKE Dataplane V2。
  • Pod 的多網路支援功能適用於 Container-Optimized OS。如要在節點上使用 Ubuntu,請執行 GKE 1.32.3-gke.1785000 以上版本。

一般限制

  • 啟用雙堆疊網路的叢集不支援 Pod 的多網路功能。
  • 只有 GKE 1.28 以上版本支援共用虛擬私有雲。
  • 多個 Pod CIDR 僅支援 GKE 1.29 以上版本,且僅適用於預設 Pod 網路。
  • 單一 GKE 叢集中的任何 Pod 網路都不得有重疊的 CIDR 範圍。
  • 啟用 Pod 的多網路支援功能後,您就無法在建立節點集區後新增或移除節點網路介面或 Pod 網路。如要變更這些設定,必須重新建立節點集區。
  • 根據預設,Pod 內 Pod 網路的其他介面無法存取網際網路。不過,您可以使用 Cloud NAT 手動啟用。
  • 您無法透過 API 變更 Pod 內有多個介面的預設閘道。預設閘道必須連線至預設 Pod 網路。
  • 即使您建立額外的 Pod 網路或介面,Pod 中仍必須一律包含預設 Pod 網路。
  • 如果已設定 Managed Hubble,就無法設定多重網路功能。
  • 如要使用共用虛擬私有雲,請確保 GKE 叢集執行 1.28.4 以上版本。
  • 如果是共用虛擬私有雲部署作業,附加至節點的所有網路介面 (NIC) 都必須與主專案屬於同一個專案。
  • 裝置型網路物件的名稱不得超過 41 個半形字元。每個 UNIX 網域通訊端的完整路徑都會組成,包括對應的網路名稱。Linux 對通訊端路徑長度設有限制 (107 個位元組以下)。扣除目錄、檔案名稱前置字串和 .sock 副檔名後,網路名稱長度上限為 41 個字元。
  • 您無法變動 NetworkGKENetworkParamSet 物件。如要更新這些物件,請刪除並重新建立。

裝置和 Data Plane Development Kit (DPDK) 限制

  • Device 類型 NIC 傳遞至 Pod 的 VM NIC,無法供同一節點上的其他 Pod 使用。
  • 使用 DPDK 模式的 Pod 必須以特權模式執行,才能存取 VFIO 裝置。
  • Autopilot 模式不支援 DPDK。
  • 在 DPDK 模式中,裝置會視為節點資源,且只會附加至 Pod 中的第一個容器 (非 init)。如要將多個 DPDK 裝置分配給同一個 Pod 中的容器,必須在不同的 Pod 中執行這些容器。
  • 在 Ubuntu 節點上,只有 GKE 1.33.1-gke.1959000 以上版本支援 DPDK-VFIO 網路。

擴充限制

GKE 提供彈性的網路架構,可讓您擴充叢集。您可以為叢集新增其他節點網路和 Pod 網路。您可以按照下列步驟調整叢集規模:

  • 每個 GKE 節點集區最多可新增 8 個額外節點網路。這與 Compute Engine VM 的規模限制相同。
  • 每個 Pod 附加的額外網路不得超過 8 個。
  • 在單一節點集區的 8 個節點網路中,最多可設定 35 個 Pod 網路。您可以將其細分為不同的組合,例如:
    • 7 個節點網路,每個節點網路有 5 個 Pod 網路
    • 5 個節點網路,每個網路有 7 個 Pod 網路
    • 1 個節點網路,其中有 30 個 Pod 網路。每個子網路的次要範圍限制為 30 個。
  • 每個叢集最多可設定 50 個 Pod 網路。
  • 每個節點最多可設定 32 個多重網路 Pod。
  • 您最多可以有 5,000 個節點,並使用多個介面。
  • 所有 Pod 最多可有 100,000 個額外介面。

部署多網路 Pod

如要部署多網路 Pod,請執行下列操作:

  1. 準備額外的虛擬私有雲、子網路 (節點網路) 和次要範圍 (Pod 網路)。
  2. 使用 Google Cloud CLI 指令建立啟用多重網路的 GKE 叢集
  3. 建立新的 GKE 節點集區,並使用 Google Cloud CLI 指令,將該集區連線至額外的節點網路和 Pod 網路。
  4. 建立 Pod 網路,並使用 Kubernetes API 在多重網路物件中參照正確的 VPC、子網路和次要範圍。
  5. 在工作負載設定中,使用 Kubernetes API 參照準備好的 Network Kubernetes 物件。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

準備額外的 VPC

Google Cloud 會在建立叢集時建立預設 Pod 網路,並與 GKE 叢集初始建立時使用的 GKE 節點集區建立關聯。所有叢集節點和 Pod 都能使用預設 Pod 網路。如要在節點集區中啟用多重網路功能,您必須準備現有或新的虛擬私有雲,這些虛擬私有雲支援 Layer 3Device 類型的網路。

如要準備其他虛擬私有雲,請考量下列需求:

  • Layer 3Netdevice 類型網路:

    • 如果您使用 Layer 3 類型的網路,請建立次要範圍。
    • 請確保次要範圍的 CIDR 大小足以滿足節點集區中的節點數量,以及您想擁有的每個節點的 Pod 數量。
    • 與預設 Pod 網路類似,其他 Pod 網路也會過度佈建 IP 位址。次要 IP 位址範圍的每個節點,必須有兩倍的 IP 位址,才能容納每個節點的 Pod 數量。
  • Device 網路需求類型:在虛擬私有雲上建立一般子網路。您不需要次要子網路。

如要在節點集區中啟用多網路功能,您必須準備要建立額外連線的虛擬私有雲。您可以沿用現有的虛擬私有雲,或專為節點集區建立新的虛擬私有雲

建立支援 Layer 3 類型裝置的虛擬私有雲網路

如要建立支援 Layer 3 類型裝置的虛擬私有雲網路,請執行下列操作:

  • 請確保次要範圍的 CIDR 大小足以滿足節點集區中的節點數量,以及您想擁有的每個節點 Pod 數量。
  • 與預設 Pod 網路類似,其他 Pod 網路也會過度佈建 IP 位址。次要 IP 位址範圍的每個節點,必須有每個節點的 Pod 數兩倍的 IP 位址。

gcloud

gcloud compute networks subnets create SUBNET_NAME \
    --project=PROJECT_ID \
    --range=SUBNET_RANGE \
    --network=NETWORK_NAME \
    --region=REGION \
    --secondary-range=SECONDARY_RANGE_NAME=<SECONDARY_RANGE_RANGE>

更改下列內容:

  • SUBNET_NAME:子網路的名稱。
  • PROJECT_ID:包含虛擬私有雲網路的專案 ID,子網路會建立在該網路中。
  • SUBNET_RANGE:新子網路的主要 IPv4 位址範圍,採用 CIDR 標記法。
  • NETWORK_NAME:包含新子網路的虛擬私有雲網路名稱。
  • REGION:建立新子網路的 Google Cloud 區域。
  • SECONDARY_RANGE_NAME:次要範圍的名稱。
  • SECONDARY_IP_RANGE 次要 IPv4 位址範圍,採用 CIDR 標記法。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 欄位中,輸入網路名稱。例如:l3-vpc

  4. 從「最大傳輸單位 (MTU)」下拉式選單中,選擇適當的 MTU 值。

  5. 在「Subnet creation mode」(子網路建立模式) 部分,選擇 [Custom] (自訂)

  6. 按一下「新增子網路」

  7. 在「New subnet」(新子網路) 部分,指定子網路的以下設定參數:

    1. 提供「Name」(名稱)。例如:l3-subnet

    2. 選擇一個 [Region] (地區)

    3. 輸入 [IP address range] (IP 位址範圍)。這是子網路的主要 IPv4 範圍

      如果選取的範圍不是 RFC 1918 位址,請確認該範圍與現有設定沒有衝突。詳情請參閱「IPv4 子網路範圍」。

    4. 如要定義子網路的次要範圍,請按一下「建立次要 IP 位址範圍」

      如果選取的範圍不是 RFC 1918 位址,請確認該範圍與現有設定沒有衝突。詳情請參閱「IPv4 子網路範圍」。

    5. 「Private Google access」(私人 Google 存取權):您可以在建立子網路時啟用該子網路的私人 Google 存取權,也可以之後再進行編輯。

    6. 「Flow logs」(流程記錄):您可以在建立子網路時啟用虛擬私人雲端流程記錄,也可以之後再進行編輯。

    7. 按一下 [完成]

  8. 在「防火牆規則」區段的「IPv4 防火牆規則」下方,選取零或多個預先定義的防火牆規則

    這些規則可解決執行個體連線的常見用途。您可以先建立網路,之後再自行建立防火牆規則。每個預先定義的規則名稱開頭,都是您要建立的虛擬私有雲網路名稱。

  9. 在「IPv4 防火牆規則」下方,如要編輯名為 allow-custom 的預先定義輸入防火牆規則,請按一下「編輯」

    您可以編輯子網路、新增其他 IPv4 範圍,以及指定通訊協定和通訊埠。

    如果之後新增其他子網路,allow-custom 防火牆規則不會自動更新。如果新子網路需要防火牆規則,您必須更新防火牆設定才能新增規則。

  10. 在「Dynamic routing mode」(動態轉送模式) 區段中,為 VPC 網路執行下列操作:詳情請參閱動態轉送模式。您之後可以變更動態轉送模式

  11. 點選「建立」

建立支援 NetdeviceDPDK 類型裝置的虛擬私有雲網路

gcloud

gcloud compute networks subnets create SUBNET_NAME \
    --project=PROJECT_ID \
    --range=SUBNET_RANGE \
    --network=NETWORK_NAME \
    --region=REGION \
    --secondary-range=SECONDARY_RANGE_NAME=<SECONDARY_RANGE_RANGE>

更改下列內容:

  • SUBNET_NAME:子網路的名稱。
  • PROJECT_ID:包含虛擬私有雲網路的專案 ID,子網路會建立在該網路中。
  • SUBNET_RANGE:新子網路的主要 IPv4 位址範圍,採用 CIDR 標記法。
  • NETWORK_NAME:包含新子網路的虛擬私有雲網路名稱。
  • REGION:建立新子網路的 Google Cloud 區域。
  • SECONDARY_RANGE_NAME:次要範圍的名稱。
  • SECONDARY_IP_RANGE 次要 IPv4 位址範圍,採用 CIDR 標記法。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 欄位中,輸入網路名稱。例如 netdevice-vpcdpdk-vpc

  4. 從「最大傳輸單位 (MTU)」下拉式選單中,選擇適當的 MTU 值。

  5. 在「Subnet creation mode」(子網路建立模式) 部分,選擇 [Custom] (自訂)

  6. 在「New subnet」(新子網路) 部分,指定子網路的以下設定參數:

    1. 提供「Name」(名稱)。例如 netdevice-subnetdpdk-vpc

    2. 選擇一個 [Region] (地區)

    3. 輸入 [IP address range] (IP 位址範圍)。這是子網路的主要 IPv4 範圍

      如果選取的範圍不是 RFC 1918 位址,請確認該範圍與現有設定沒有衝突。詳情請參閱「IPv4 子網路範圍」。

    4. 「Private Google Access」(私人 Google 存取權):選擇是否要在建立子網路時啟用該子網路的私人 Google 存取權,或之後再進行編輯。

    5. 「Flow logs」(流程記錄):您可以在建立子網路時啟用虛擬私人雲端流程記錄,也可以之後再進行編輯。

    6. 按一下 [完成]

  7. 在「防火牆規則」區段的「IPv4 防火牆規則」下方,選取零或多個預先定義的防火牆規則

    這些規則可解決執行個體連線的常見用途。您可以先建立網路,之後再自行建立防火牆規則。每個預先定義的規則名稱開頭,都是您要建立的虛擬私有雲網路名稱。

  8. 在「IPv4 防火牆規則」下方,如要編輯名為 allow-custom 的預先定義輸入防火牆規則,請按一下「編輯」

    您可以編輯子網路、新增其他 IPv4 範圍,以及指定通訊協定和通訊埠。

    如果之後新增其他子網路,allow-custom 防火牆規則不會自動更新。如果新子網路需要防火牆規則,您必須更新防火牆設定才能新增規則。

  9. 在「Dynamic routing mode」(動態轉送模式) 區段中,為 VPC 網路執行下列操作:詳情請參閱動態轉送模式。您之後可以變更動態轉送模式

  10. 點選「建立」

建立具備多網路功能的 GKE 叢集

為叢集啟用多網路功能後,系統會將必要的 CustomResourceDefinitions (CRD) 新增至該叢集的 API 伺服器。此外,這個外掛程式也會部署 network-controller-manager,負責協調及管理多重網路物件。叢集建立後,您就無法修改叢集設定。

建立具備多網路功能的 GKE Autopilot 叢集

建立具備多網路功能的 GKE Autopilot 叢集:

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=CLUSTER_VERSION \
    --enable-multi-networking

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CLUSTER_VERSION:叢集版本。

--enable-multi-networking 標記會在叢集的 API 伺服器中啟用多網路自訂資源定義 (CRD),並部署 network-controller-manager,其中包含多網路物件的和解與生命週期管理。

建立具備多網路功能的 GKE Standard 叢集

gcloud

建立具備多網路功能的 GKE Standard 叢集:

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=CLUSTER_VERSION \
    --enable-dataplane-v2 \
    --enable-ip-alias \
    --enable-multi-networking

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CLUSTER_VERSION:叢集版本。

這項指令包含下列標記:

  • --enable-multi-networking: 可在這個叢集的 API 伺服器中啟用多重網路自訂資源定義 (CRD),並部署 network-controller-manager,其中包含多重網路物件的和解與生命週期管理。
  • --enable-dataplane-v2: 啟用 GKE Dataplane V2。啟用多重網路時,必須使用這個旗標。

控制台

  1. 在 Google Cloud 控制台中,前往「建立 Kubernetes 叢集」頁面。

    前往「建立 Kubernetes 叢集」

  2. 設定標準叢集。詳情請參閱「建立區域叢集」或「建立區域叢集」。建立叢集時,請選取適當的網路和節點子網路。
  3. 在導覽窗格的「叢集」底下,按一下 [網路]
  4. 勾選「啟用 Dataplane V2」核取方塊。
  5. 選取「啟用多網路功能」
  6. 點選「建立」

建立連線至其他虛擬私有雲的 GKE Standard 節點集區

建立節點集區,其中包含連線至節點網路 (虛擬私有雲和子網路) 和 Pod 網路 (次要範圍) 的節點,這些節點是在「建立 Pod 網路」中建立。

如要建立新的節點集區並與 GKE 叢集中的其他網路建立關聯,請按照下列步驟操作:

gcloud

gcloud container node-pools create POOL_NAME \
  --cluster=CLUSTER_NAME \
  --additional-node-network network=NETWORK_NAME,subnetwork=SUBNET_NAME \
  --additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=POD_IP_RANGE,max-pods-per-node=NUMBER_OF_PODS \
  --additional-node-network network=highperformance,subnetwork=subnet-highperf

更改下列內容:

  • POOL_NAME 替換為新節點集區的名稱。
  • CLUSTER_NAME,並將其替換為要新增節點集區的現有叢集名稱。
  • NETWORK_NAME 替換為要附加節點集區節點的網路名稱。
  • SUBNET_NAME,並提供要用於節點的網路內子網路名稱。
  • POD_IP_RANGE 子網路內的 Pod IP 位址範圍。
  • NUMBER_OF_PODS 每個節點的 Pod 數量上限。

這項指令包含下列標記:

  • --additional-node-network:定義額外網路介面、網路和子網路的詳細資料。用於指定節點網路,以連線至節點集區節點。如要連線至其他 VPC,請指定這個參數。如未指定這個參數,系統會使用與叢集相關聯的預設 VPC。如果是 Layer 3 類型的網路,請指定定義 Pod 網路的 additional-pod-network 旗標,該網路會在 GKE 叢集中以 Network 物件的形式公開。使用 --additional-node-network 旗標時,您必須提供網路和子網路做為必要參數。請務必以半形逗號分隔網路和子網路值,並避免使用半形空格。
  • --additional-pod-network:指定用於 Pod 網路的次要範圍詳細資料。如果您使用 Device 類型的網路,則不需要這個參數。這個引數會指定下列鍵值:subnetworkpod-ipv4-rangemax-pods-per-node。使用 --additional-pod-network 時,請務必提供 pod-ipv4-rangemax-pods-per-node 值,並以半形逗號分隔,不得有空格。
    • subnetwork:將節點網路與 Pod 網路連結。子網路為選用項目。如未指定,額外的 Pod 網路會與叢集建立期間提供的預設子網路建立關聯。
    • --max-pods-per-node:必須指定 max-pods-per-node,且必須是 2 的乘方。最小值為 4。max-pods-per-node 不得大於節點集區的 max-pods-per-node 值。

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下導覽窗格中的「叢集」

  3. 在「Kubernetes clusters」(Kubernetes 叢集) 區段中,按一下您建立的叢集。

  4. 按一下頁面頂端的「新增節點集區」,即可建立節點集區。

  5. 在「節點集區詳細資料」部分,完成下列步驟:

    1. 輸入節點集區的「名稱」
    2. 輸入要在節點集區中建立的節點數量
  6. 在導覽窗格的「節點集區」下方,按一下「節點」

    1. 從「映像檔類型」下拉式清單中,選取「含有 containerd 的 Container-Optimized OS (cos_containerd)」節點映像檔。

  7. 建立 VM 時,請從機器系列中選取機器類型,決定該 VM 可用的資源。舉例來說,e2-standard-4 機器類型包含 4 個 vCPU,因此最多可支援 4 個 VPC。有多個機器系列可以選擇,每個機器系列可進一步分成不同的機器系列,以及各系列中預先定義或自訂的機器類型。每種機器類型的定價方式不同。詳情請參閱機器類型價目表

  8. 在導覽窗格中選取「網路」

  9. 在「節點網路」部分,指定每個節點的 Pod 數量上限。「節點網路」部分會顯示用於建立叢集的虛擬私有雲網路。您必須指定與先前建立的虛擬私有雲網路和裝置類型相關聯的額外節點網路。

  10. 建立節點集區關聯:

    1. 如果是 Layer 3 類型裝置:
      1. 在「節點網路」部分中,按一下「新增節點網路」
      2. 從網路下拉式清單中,選取支援第 3 層類型裝置的虛擬私有雲
      3. 選取為 Layer 3 虛擬私有雲建立的子網路
      4. 在「別名 Pod IP 位址範圍」部分,按一下「新增 Pod IP 位址範圍」
      5. 選取「次要子網路」,並指出「每個節點的 Pod 數上限」
      6. 選取「完成」
    2. 適用於 NetdeviceDPDK 類型裝置:
      1. 在「節點網路」部分中,按一下「新增節點網路」
      2. 從網路下拉式清單中,選取支援 NetdeviceDPDK 類型裝置的 VPC
      3. 選取為 NetdeviceDPDK 虛擬私有雲建立的子網路
      4. 選取「完成」
  11. 點選「建立」

注意:

  • 如果在同一個節點網路中指定多個額外 Pod 網路,這些網路必須位於同一個子網路。
  • 您無法多次參照子網路的同一個次要範圍。

範例 下列範例會建立名為 pool-multi-net 的節點集區,並將兩個額外網路 (datapalane (Layer 3 類型網路) 和 highperformance (netdevice 類型網路)) 附加至節點。本範例假設您已建立名為 cluster-1 的 GKE 叢集:

gcloud container node-pools create pool-multi-net \
  --project my-project \
  --cluster cluster-1 \
  --location us-central1-c \
  --additional-node-network network=dataplane,subnetwork=subnet-dp \
  --additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-blue,max-pods-per-node=8 \
  --additional-node-network network=highperformance,subnetwork=subnet-highperf

如要指定其他節點網路和 Pod 網路介面,請多次定義 --additional-node-network--additional-pod-network 參數,如下列範例所示:

--additional-node-network network=dataplane,subnetwork=subnet-dp \
--additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-blue,max-pods-per-node=8 \
--additional-pod-network subnetwork=subnet-dp,pod-ipv4-range=sec-range-green,max-pods-per-node=8 \
--additional-node-network network=managementdataplane,subnetwork=subnet-mp \
--additional-pod-network subnetwork=subnet-mp,pod-ipv4-range=sec-range-red,max-pods-per-node=4

如要直接在節點集區的主要 VPC 介面上指定其他 Pod 網路,請參閱下列範例:

--additional-pod-network subnetwork=subnet-def,pod-ipv4-range=sec-range-multinet,max-pods-per-node=8

建立 Pod 網路

定義 Pod 將存取的 Pod 網路,方法是定義 Kubernetes 物件,並將這些物件連結至對應的 Compute Engine 資源,例如虛擬私有雲、子網路和次要範圍。

如要建立 Pod 網路,您必須在叢集中定義 Network CRD 物件。

設定 Layer 3 虛擬私有雲網路

YAML

針對 Layer 3 虛擬私有雲,建立 NetworkGKENetworkParamSet 物件:

  1. 將下列範例資訊清單儲存為 blue-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: blue-network
    spec:
      type: "L3"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "l3-vpc"
    

    資訊清單會定義名為 blue-networkNetwork 資源,類型為 Layer 3Network 物件會參照名為 l3-vpcGKENetworkParamSet 物件,該物件會將網路與 Compute Engine 資源建立關聯。

  2. 將資訊清單套用至叢集:

    kubectl apply -f blue-network.yaml
    
  3. 將下列資訊清單儲存為 l3-vpc.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: "l3-vpc"
    spec:
      vpc: "l3-vpc"
      vpcSubnet: "subnet-dp"
      podIPv4Ranges:
        rangeNames:
        - "sec-range-blue"
    

    這個資訊清單會將虛擬私有雲名稱設為 l3-vpc、子網路名稱設為 subnet-dp,並將 Pod 的次要 IPv4 位址範圍設為 sec-range-blue,藉此定義名為 l3-vpcGKENetworkParamSet 物件。

  4. 將資訊清單套用至叢集:

    kubectl apply -f l3-vpc.yaml
    

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下導覽窗格中的「Network Function Optimizer」

  3. 按一下頁面頂端的「建立」,即可建立 Pod 網路。

  4. 在「事前準備」部分,確認詳細資料。

  5. 點選「下一步:Pod 網路位置」

  6. 在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。

  7. 按一下「下一步:虛擬私有雲網路參考資料」

  8. 在「VPC network reference」(虛擬私有雲網路參照) 區段中,從「VPC network reference」(虛擬私有雲網路參照) 下拉式選單中,選取用於 Layer 3 multinic Pod 的虛擬私有雲網路。

  9. 點選「下一步:Pod 網路類型」

  10. 在「Pod network type」(Pod 網路類型) 部分,選取「L3」並輸入「Pod network name」(Pod 網路名稱)

  11. 按一下「下一步:Pod 網路次要範圍」

  12. 在「Pod network secondary range」(Pod 網路次要範圍) 區段中,輸入「Secondary range」(次要範圍)

  13. 按一下「下一步:Pod 網路路徑」

  14. 在「Pod network routes」(Pod 網路路徑) 區段中,如要定義「Custom routes」(自訂路徑),請選取「ADD ROUTE」(新增路徑)

  15. 按一下「CREATE POD NETWORK」(建立 Pod 網路)

設定 DPDK 網路

YAML

如果是 DPDK 虛擬私有雲,請建立 NetworkGKENetworkParamSet 物件。

  1. 將下列範例資訊清單儲存為 dpdk-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: dpdk-network
    spec:
      type: "Device"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "dpdk"
    

    這份資訊清單定義了名為 dpdk-network 且類型為 DeviceNetwork 資源。Network 資源會參照名為 dpdkGKENetworkParamSet 物件,以進行設定。

  2. 將資訊清單套用至叢集:

    kubectl apply -f dpdk-network.yaml
    
  3. 如果是 GKENetworkParamSet 物件,請將下列資訊清單儲存為 dpdk.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: "dpdk"
    spec:
      vpc: "dpdk"
      vpcSubnet: "subnet-dpdk"
      deviceMode: "DPDK-VFIO"
    

    這個資訊清單會定義名為 dpdkGKENetworkParamSet 物件,並將 VPC 名稱設為 dpdk、子網路名稱設為 subnet-dpdk,以及將 deviceMode 名稱設為 DPDK-VFIO

  4. 將資訊清單套用至叢集:

    kubectl apply -f dpdk-network.yaml
    

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下導覽窗格中的「Network Function Optimizer」

  3. 按一下頁面頂端的「建立」,即可建立 Pod 網路。

  4. 在「事前準備」部分,確認詳細資料。

  5. 點選「下一步:Pod 網路位置」

  6. 在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。

  7. 按一下「下一步:虛擬私有雲網路參考資料」

  8. 在「虛擬私有雲網路參照」部分中,從「虛擬私有雲網路參照」下拉式選單中,選取用於 dpdk multinic Pod 的虛擬私有雲網路。

  9. 點選「下一步:Pod 網路類型」

  10. 在「Pod network type」(Pod 網路類型) 區段中,選取「DPDK-VFIO (Device)」(DPDK-VFIO (裝置)),然後輸入「Pod network name」(Pod 網路名稱)

  11. 按一下「下一步:Pod 網路次要範圍」。 「Pod 網路次要範圍」部分將無法使用

  12. 按一下「下一步:Pod 網路路徑」。 在「Pod network routes」(Pod 網路路徑) 區段中,選取「ADD ROUTE」(新增路徑) 來定義自訂路徑

  13. 按一下「CREATE POD NETWORK」(建立 Pod 網路)

設定 netdevice 網路

針對 netdevice VPC,建立 NetworkGKENetworkParamSet 物件。

YAML

  1. 將下列範例資訊清單儲存為 netdevice-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
        name: netdevice-network
    spec:
        type: "Device"
        parametersRef:
          group: networking.gke.io
          kind: GKENetworkParamSet
          name: "netdevice"
    

    這份資訊清單定義了名為 netdevice-networkNetwork 資源,類型為 Device。這個物件會參照名為 netdeviceGKENetworkParamSet 物件。

  2. 將資訊清單套用至叢集:

    kubectl apply -f netdevice-network.yaml
    
  3. 將下列資訊清單儲存為 netdevice.yaml

    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: netdevice
    spec:
      vpc: netdevice
      vpcSubnet: subnet-netdevice
      deviceMode: NetDevice
    

    這份資訊清單定義了名為 GKENetworkParamSetnetdevice 資源,將虛擬私有雲名稱設為 netdevice、子網路名稱設為 subnet-netdevice,並將裝置模式指定為 NetDevice

  4. 將資訊清單套用至叢集:

    kubectl apply -f netdevice.yaml
    

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下導覽窗格中的「Network Function Optimizer」

  3. 按一下頁面頂端的「建立」,即可建立 Pod 網路。

  4. 在「事前準備」部分,確認詳細資料。

  5. 點選「下一步:Pod 網路位置」

  6. 在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。

  7. 按一下「下一步:虛擬私有雲網路參考資料」

  8. 在「VPC network reference」(虛擬私有雲網路參照) 區段中,從「VPC network reference」(虛擬私有雲網路參照) 下拉式選單中,選取用於 netdevice multinic Pod 的虛擬私有雲網路。

  9. 點選「下一步:Pod 網路類型」

  10. 在「Pod network type」(Pod 網路類型) 部分,選取「NetDevice (Device)」(網路裝置 (裝置)),然後輸入「Pod network name」(Pod 網路名稱)

  11. 按一下「下一步:Pod 網路次要範圍」。 「Pod 網路次要範圍」部分將無法使用

  12. 按一下「下一步:Pod 網路路徑」。 在「Pod 網路路徑」部分,選取「新增路徑」,定義自訂路徑。

  13. 按一下「CREATE POD NETWORK」(建立 Pod 網路)

設定網路路徑

設定網路路徑可讓您為特定網路定義自訂路徑,這些路徑會在 Pod 上設定,將流量導向 Pod 中的對應介面。

YAML

  1. 將下列資訊清單儲存為 red-network.yaml

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: red-network
    spec:
      type: "L3"
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: "management"
      routes:
      -   to: "10.0.2.0/28"
    

    這份資訊清單定義名為 red-network 的網路資源,類型為 Layer 3,並透過該網路介面定義自訂路徑「10.0.2.0/28」。

  2. 將資訊清單套用至叢集:

    kubectl apply -f red-network.yaml
    

控制台

  1. 前往 Google Cloud 控制台的「Network Function Optimizer」頁面。

    前往 Network Function Optimizer

  2. 點選「建立」

  3. 選取已啟用多網路功能的叢集。

  4. 設定網路偏好設定。

  5. 按一下「建立 Pod 網路」

參考準備好的 Network

在工作負載設定中,使用 Kubernetes API 參照準備好的 Network Kubernetes 物件。

將 Pod 連線至特定網路

如要將 Pod 連線至指定網路,您必須在 Pod 設定中加入 Network 物件的名稱做為註解。請務必在註解中同時加入 default Network 和所選的其他網路,建立連線。

  1. 將下列範例資訊清單儲存為 sample-l3-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-l3-pod
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"blue-network"}
          ]
    spec:
      containers:
      - name: sample-l3-pod
        image: busybox
        command: ["sleep", "10m"]
        ports:
        - containerPort: 80
      restartPolicy: Always
    

    這份資訊清單會建立名為 sample-l3-pod 的 Pod,其中包含兩個網路介面 eth0eth1,分別與 defaultblue-network 網路相關聯。

  2. 將資訊清單套用至叢集:

    kubectl apply -f sample-l3-pod.yaml
    

讓 Pod 連線至多個網路

  1. 將下列範例資訊清單儲存為 sample-l3-netdevice-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-l3-netdevice-pod
      annotations:
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"blue-network"},
            {"interfaceName":"eth2","network":"netdevice-network"}
          ]
    spec:
      containers:
      - name: sample-l3-netdevice-pod
        image: busybox
        command: ["sleep", "10m"]
        ports:
        - containerPort: 80
      restartPolicy: Always
    

    這個資訊清單會建立名為 sample-l3-netdevice-pod 的 Pod,其中包含三個網路介面,分別是與 defaultblue-networknetdevice 網路相關聯的 eth0eth1eth2

  2. 將資訊清單套用至叢集:

    kubectl apply -f sample-l3-netdevice-pod.yaml
    

您可以在範本的註解部分,在任何 ReplicaSet (Deployment 或 DaemonSet) 中使用相同的註解。

具備多個介面的 Pod 設定範例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default
    link/ether 2a:92:4a:e5:da:35 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.60.45.4/24 brd 10.60.45.255 scope global eth0
      valid_lft forever preferred_lft forever
10: eth1@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default qlen 1000
    link/ether ba:f0:4d:eb:e8:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.2/32 scope global eth1
      valid_lft forever preferred_lft forever

驗證

  • 請務必先啟用 --enable-dataplane-v2,再使用 --enable-multi-networking 建立叢集。
  • 確認叢集和節點集區建立時,叢集中的所有節點集區都執行 Container-Optimized OS 映像檔。
  • 確認節點集區是使用 --additional-node-network--additional-pod-network 建立,且叢集已啟用多重網路功能。
  • 請確認未將相同的子網路指定為節點集區的 --additional-node-network 引數。
  • 確認未將相同次要範圍指定為節點集區的 --additional-pod-network 引數。
  • 請遵守網路物件的規模限制,並考量允許的最大節點數、Pod 數和 IP 位址數。
  • 確認只有一個 GKENetworkParamSet 物件參照特定子網路和次要範圍。
  • 確認每個網路物件都參照不同的 GKENetworkParamSet 物件。
  • 確認網路物件 (如果使用具有 Device 網路的特定子網路建立) 未與具有次要範圍的其他網路在同一個節點上使用。您只能在執行階段驗證這項設定。
  • 確認指派給節點集區的各種次要範圍沒有重疊的 IP 位址。

排解 GKE 中的多重網路參數問題

建立叢集和節點集區時,系統會 Google Cloud 執行特定檢查,確保只允許使用有效的多重網路參數。這可確保叢集的網路設定正確無誤。

自 GKE 1.32 以上版本起,只有在節點上存在 DPDK-VFIO 網路時,才需要 high-perf-config-daemon。如要檢查 high-perf-config-daemon,請確認節點標籤 cloud.google.com/run-high-perf-config-daemons: "true" 是否存在。如果特定網路類型缺少必要的外掛程式或節點標籤,可能表示設定不完整或不正確。

如果無法建立多網路工作負載,可以查看 Pod 狀態和事件,瞭解詳情:

kubectl describe pods samplepod

輸出結果會與下列內容相似:

Name:         samplepod
Namespace:    default
Status:       Running
IP:           192.168.6.130
IPs:
  IP:  192.168.6.130
...
Events:
  Type     Reason                  Age   From               Message
  ----     ------                  ----  ----               -------
  Normal   NotTriggerScaleUp  9s               cluster-autoscaler  pod didn't trigger scale-up:
  Warning  FailedScheduling   8s (x2 over 9s)  default-scheduler   0/1 nodes are available: 1 Insufficient networking.gke.io.networks/my-net.IP. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod

以下是 Pod 建立失敗的一般原因:

  • 由於未滿足多重網路資源需求,因此無法排定 Pod
  • 無法識別指定網路

排解 Kubernetes 網路建立作業問題

成功建立網路後,應有權存取已設定網路的節點會加上網路狀態註解。

如要觀察註解,請執行下列指令:

kubectl describe node NODE_NAME

NODE_NAME 替換為節點名稱。

輸出結果會與下列內容相似:

networking.gke.io/network-status: [{"name":"default"},{"name":"dp-network"}]

輸出內容會列出節點上可用的每個網路。如果節點未顯示預期的網路狀態,請按照下列步驟操作:

確認節點是否能存取網路

如果節點的網路狀態註解未顯示網路:

  1. 確認節點屬於為多重網路設定的集區。
  2. 檢查節點的介面,確認節點是否具有您要設定的網路介面。
  3. 如果節點缺少網路狀態,且只有一個網路介面,您仍須建立啟用多重網路功能的節點集區。
  4. 如果節點包含您要設定的網路介面,但網路狀態註解中未顯示該介面,請檢查 NetworkGKENetworkParamSet (GNP) 資源。

查看「Network」和「GKENetworkParamSet」資源

NetworkGKENetworkParamSet (GNP) 資源的狀態都包含條件欄位,可回報設定錯誤。建議您先檢查 GNP,因為這項資源不需依賴其他資源即可生效。

如要檢查 conditions 欄位,請執行下列指令:

kubectl get gkenetworkparamsets GNP_NAME -o yaml

GNP_NAME 替換為 GKENetworkParamSet 資源的名稱。

Ready 條件等於 true 時,設定有效,輸出內容類似於下列內容:

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
...
spec:
  podIPv4Ranges:
    rangeNames:
    -   sec-range-blue
  vpc: dataplane
  vpcSubnet: subnet-dp
status:
  conditions:
  -   lastTransitionTime: "2023-06-26T17:38:04Z"
    message: ""
    reason: GNPReady
    status: "True"
    type: Ready
  networkName: dp-network
  podCIDRs:
    cidrBlocks:
    -   172.16.1.0/24

Ready 條件等於 false 時,輸出內容會顯示原因,類似於下列內容:

apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
...
spec:
  podIPv4Ranges:
    rangeNames:
    -   sec-range-blue
  vpc: dataplane
  vpcSubnet: subnet-nonexist
status:
  conditions:
  -   lastTransitionTime: "2023-06-26T17:37:57Z"
    message: 'subnet: subnet-nonexist not found in VPC: dataplane'
    reason: SubnetNotFound
    status: "False"
    type: Ready
  networkName: ""

如果遇到類似訊息,請確認 GNP 設定正確無誤。如果已是,請確認 Google Cloud 網路設定正確無誤。更新 Google Cloud 網路設定後,您可能需要重新建立 GNP 資源,手動觸發重新同步。這是為了避免無限輪詢Google CloudAPI。

GNP 準備就緒後,請檢查 Network 資源。

kubectl get networks NETWORK_NAME -o yaml

NETWORK_NAME 替換為Network資源的名稱。

有效設定的輸出內容類似於下列內容:

apiVersion: networking.gke.io/v1
kind: Network
...
spec:
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: dp-gnp
  type: L3
status:
  conditions:
  -   lastTransitionTime: "2023-06-07T19:31:42Z"
    message: ""
    reason: GNPParamsReady
    status: "True"
    type: ParamsReady
  -   lastTransitionTime: "2023-06-07T19:31:51Z"
    message: ""
    reason: NetworkReady
    status: "True"
    type: Ready
  • reason: NetworkReady 表示網路資源設定正確。reason: NetworkReady 並不代表網路資源一定可在特定節點上使用,或正在使用中。
  • 如有設定錯誤或發生錯誤,條件中的 reason 欄位會指出問題的確切原因。在這種情況下,請相應調整設定。
  • 如果 parametersRef 欄位設為叢集中現有的 GKENetworkParamSet 資源,GKE 就會填入 ParamsReady 欄位。如果您已指定 GKENetworkParamSet 類型 parametersRef,但條件未顯示,請確認名稱、種類和群組與叢集內現有的 GNP 資源相符。

後續步驟