設定 Pod 的多網路支援功能

您可以設定 Google Kubernetes Engine (GKE) 叢集,讓 Pod 支援多網路功能,同時將 Pod 和節點連線至多個不同的網路。這項功能可協助您滿足特殊網路需求,例如隔離流量,或提高高效能運算 (HPC) 或網路功能虛擬化 (NFV) 工作負載的處理量。

根據預設,GKE 叢集中的 Pod 和節點會使用單一主要網路介面處理所有流量。開始之前,請務必瞭解一般網路概念、GKE 多網路支援專屬的術語和概念,以及相關需求和限制。

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

需求條件和限制

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

需求條件

  • Pod 的多網路支援功能採用與 Compute Engine 多 NIC 相同的 VM 層級規格。
  • Pod 的多網路支援功能需要 GKE Dataplane V2。
  • Container-Optimized OS 支援 Pod 的多網路功能。節點必須執行 GKE 1.32.3-gke.1785000 以上版本,才能使用 Ubuntu。

一般限制

  • Pod 的多網路支援功能不適用於已啟用雙堆疊網路的叢集。
  • 多 Pod CIDR 僅適用於預設 Pod 網路。
  • 單一 GKE 叢集中的任何 Pod 網路都不得有重疊的 CIDR 範圍。
  • 啟用 Pod 的多網路支援功能後,您就無法在建立節點集區後新增或移除節點網路介面或 Pod 網路。如要變更這些設定,您必須重新建立節點集區。
  • 根據預設,Pod 內 Pod 網路的其他介面無法存取網路連線能力。不過,您可以使用 Cloud NAT 手動啟用。
  • 您無法透過 API 變更 Pod 內具有多個介面的預設閘道。預設閘道必須連線至預設 Pod 網路。
  • 即使您建立額外的 Pod 網路或介面,Pod 中也必須一律包含預設 Pod 網路。
  • 如果已設定代管 Hubble,就無法設定多網路功能。
  • 如果是 Shared VPC 部署作業,所有連結至節點的網路介面 (NIC) 都必須屬於主專案。
  • 裝置類型網路物件的名稱不得超過 41 個半形字元,系統會組合每個 UNIX 網域通訊端的完整路徑,包括對應的網路名稱。Linux 對通訊端路徑長度有限制 (107 個位元組以下)。考量目錄、檔案名稱前置字元和 .sock 副檔名後,網路名稱長度上限為 41 個字元。
  • 您無法變更 Network 和 GKENetworkParamSet 物件。如要更新這些物件,請刪除並重新建立。

裝置和資料層開發套件 (DPDK) 限制

  • 以 Device 類型 NIC 形式傳遞至 Pod 的 VM NIC,無法供同一節點上的其他 Pod 使用。
  • 使用 DPDK 模式的 Pod 必須在特殊權限模式下執行,才能存取 VFIO 裝置。
  • Autopilot 模式不支援 DPDK。
  • 在 DPDK 模式下,裝置會視為節點資源,且只會附加至 Pod 中的第一個容器 (非 init)。如要在同一個 Pod 的容器之間分割多個 DPDK 裝置,您必須在不同的 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. 使用 Google Cloud CLI 指令建立新的 GKE 節點集區,並連結至額外的節點網路和 Pod 網路。
  4. 建立 Pod 網路,並使用 Kubernetes API 參照多網路物件中的正確虛擬私有雲、子網路和次要範圍。
  5. 在工作負載設定中,使用 Kubernetes API 參照準備好的網路 Kubernetes 物件。

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

準備額外的虛擬私有雲

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

準備額外的虛擬私有雲時,請考量下列需求:

  • Layer 3和Netdevice類型網路:

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

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

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

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

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

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:以 CIDR 標記法表示的次要 IPv4 位址範圍。

控制台

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

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

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

  4. 如要設定網路的最大傳輸單位 (MTU),請按照下列步驟操作:

    • 如要使用 1460 的預設值,請勾選「Set MTU automatically」(自動設定 MTU) 核取方塊。
    • 如要設定自訂值,請按照下列步驟操作:
      1. 查看「最大傳輸單位」中的資訊。
      2. 取消勾選「Set MTU automatically」(自動設定 MTU) 核取方塊。
      3. 在「Maximum transmission unit (MTU)」(最大傳輸單位 (MTU)) 欄位中,選擇 MTU 值。
  5. 在「Subnet creation mode」(子網路建立模式) 部分,選擇 [Custom] (自訂)。

  6. 點選「新增子網路」。

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

    1. 提供名稱。例如:l3-subnet。

    2. 選擇「Region」(區域)。

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

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

    4. 如要定義子網路的次要範圍,請按一下「Create secondary IP address range」(建立次要 IP 位址範圍)。

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

    5. Private Google Access:您可以在建立子網路時啟用Private Google Access,也可以在建立後編輯子網路來啟用。

    6. 流量記錄:您可以在建立子網路時啟用虛擬私有雲流量記錄,也可以在建立後編輯子網路來啟用。

    7. 按一下「完成」。

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

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

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

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

    如果日後新增其他子網路,系統不會自動更新 allow-custom 防火牆規則。如需新子網路的防火牆規則,請更新防火牆設定來新增規則。

  10. 在虛擬私有雲網路的「Dynamic routing mode」(動態轉送模式) 區段中,詳情請參閱「動態轉送模式」。您之後可以變更動態轉送模式。

  11. 點選「建立」。

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

gcloud

gcloud compute networks subnets create SUBNET_NAME \
    --project=PROJECT_ID \
    --range=SUBNET_RANGE \
    --network=NETWORK_NAME \
    --region=REGION

更改下列內容:

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

控制台

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

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

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

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

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

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

    1. 提供名稱。例如:netdevice-subnet 或 dpdk-vpc。

    2. 選擇「Region」(區域)。

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

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

    4. 「Private Google Access」:選擇是否要在建立子網路時啟用 Private Google Access,或稍後再編輯。

    5. 流量記錄:您可以在建立子網路時啟用虛擬私有雲流量記錄,也可以在建立後編輯子網路來啟用。

    6. 按一下「完成」。

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

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

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

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

    如果日後新增其他子網路,系統不會自動更新 allow-custom 防火牆規則。如需新子網路的防火牆規則,請更新防火牆設定來新增規則。

  9. 在虛擬私有雲網路的「Dynamic routing mode」(動態轉送模式) 區段中,詳情請參閱「動態轉送模式」。您之後可以變更動態轉送模式。

  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 控制台,前往「Create a Kubernetes cluster」(建立 Kubernetes 叢集) 頁面。

    前往「Create a Kubernetes cluster」(建立 Kubernetes 叢集)

  2. 設定 Standard 叢集。詳情請參閱「建立可用區叢集」或「建立區域叢集」。建立叢集時,請選取適當的網路和節點子網路。
  3. 在導覽窗格的「叢集」底下,按一下 [網路]。
  4. 勾選「啟用 Dataplane V2」核取方塊。
  5. 選取「Enable multi-networking」(啟用多網路功能)。
  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

更改下列內容:

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

這個指令包含下列旗標:

  • --additional-node-network:定義額外網路介面、網路和子網路的詳細資料。這項設定用於指定連線至節點集區節點的節點網路。如要連線至其他虛擬私有雲,請指定這項參數。如未指定這項參數,系統會使用與叢集相關聯的預設虛擬私有雲。如果是 Layer 3 類型網路,請指定 additional-pod-network 旗標,定義在 GKE 叢集內公開為 Network 物件的 Pod 網路。使用 --additional-node-network 旗標時,必須提供網路和子網路做為必要參數。請務必以半形逗號分隔網路和子網路值,並避免使用空格。

    您也可以視需要指定 stack-type 參數 (預先發布版),設定網路介面的 IP 位址堆疊類型 (有效值為 ipv4、ipv4-ipv6 或 ipv6)。最終的網路介面設定取決於您為 stack-type 欄位指定的值,以及基礎子網路的設定:

    • 如果是 IPv4_ONLY 子網路,stack-type 欄位的有效值為 ipv4。
    • 如果是 IPv4_IPv6 子網路,stack-type 欄位的有效值為 ipv4、ipv4-ipv6 和 ipv6。
    • 如果是 IPv6_ONLY 子網路,stack-type 欄位的有效值為 ipv6。

    如未指定 stack-type 欄位的值,堆疊類型會預設為 IPv4 位址 (適用於僅限 IPv4 或雙協定子網路的 NIC),以及 IPv6 位址 (適用於僅限 IPv6 子網路)。除非明確變更雙協定子網路的 stack-type 欄位值,否則該值預設為 ipv4,以維持回溯相容性。詳情請參閱「堆疊類型」。

  • --additional-pod-network:指定 Pod 網路要使用的次要範圍詳細資料。如果使用 Device 類型的網路,則不需要這個參數。這個引數會指定下列鍵值:subnetwork、pod-ipv4-range 和 max-pods-per-node。使用 --additional-pod-network 時,您必須提供 pod-ipv4-range 和 max-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. 按一下導覽窗格中的「Clusters」(叢集)。

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

  4. 按一下「Nodes」(節點) 分頁標籤。

  5. 按一下「 建立由使用者自行管理的節點集區」。

  6. 在「Node pool details」(節點集區詳細資料) 部分,完成下列操作:

    1. 輸入節點集區的名稱。
    2. 輸入要在節點集區中建立的節點數量。
  7. 在導覽窗格的「Node Pools」(節點集區) 下方,按一下「Nodes」(節點)。

    1. 從「Image type」(映像檔類型) 下拉式選單中,選取「Container-Optimized OS with containerd (cos_containerd)」節點映像檔。
  8. 建立 VM 時,請從機器家族中選取機型,決定該 VM 可用的資源。舉例來說,e2-standard-4 等機型包含 4 個 vCPU,因此最多可支援 4 個虛擬私有雲。有多個機器系列可以選擇,每個機器系列可進一步分成不同的機器系列,以及各系列中預先定義或自訂的機型。每種機器類型的定價方式不同。詳情請參閱機型價目表。

  9. 在導覽窗格中,選取「Networking」(網路)。

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

  11. 建立節點集區關聯:

    1. Layer 3 類型裝置:
      1. 在「節點網路」部分,按一下「新增節點網路」。
      2. 從網路下拉式選單中,選取「VPC that supports Layer 3 type device」。
      3. 選取為 Layer 3 虛擬私有雲建立的子網路。
      4. 在「別名 Pod IP 位址範圍」部分,按一下「新增 Pod IP 位址範圍」。
      5. 選取「次要子網路」,並指定「每個節點的 Pod 數量上限」。
      6. 選取「完成」。
    2. Netdevice 和 DPDK 類型裝置:
      1. 在「Node Networks」(節點網路) 專區,點選「ADD A NODE NETWORK」(新增節點網路)。
      2. 從網路下拉式選單中,選取支援 Netdevice 或 DPDK 類型裝置的虛擬私有雲。
      3. 選取為 Netdevice 或 DPDK 虛擬私有雲建立的子網路。
      4. 選取「完成」。
  12. 點選「建立」。

注意:

  • 設定 stack-type,在其他 NIC 上啟用 IPv6 位址時,請確認虛擬私有雲防火牆政策已正確設定 IPv6 位址。與 IPv4 位址不同,如果使用全域單點傳播位址 (GUA),節點在未妥善限制的情況下,可能會公開至網際網路。
  • 如果在同一個節點網路中指定多個額外的 Pod 網路,這些網路必須位於同一個子網路。
  • 您無法多次參照子網路的同一個次要範圍。

範例 下列範例會建立名為 pool-multi-net 的節點集區,將兩個額外網路附加至節點:dataplane (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

如要直接在節點集區的主要虛擬私有雲介面上指定其他 Pod 網路,請按照下列範例操作:

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

如要新增僅限 IPv6 的次要網路介面,請加入 stack-type 參數,如以下範例所示:

--additional-node-network network=highperformance,subnetwork=ipv6-only-subnet,stack-type=ipv6

如要新增雙堆疊次要網路介面,同時支援 IPv4 和 IPv6 位址連線能力,請新增 stack-type 參數,如下例所示:

--additional-node-network network=service-net,subnetwork=dual-stack-subnet,stack-type=ipv4-ipv6

建立 Pod 網路

定義 Kubernetes 物件,並連結至對應的 Compute Engine 資源 (例如虛擬私有雲、子網路和次要範圍),藉此定義 Pod 會存取的 Pod 網路。

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

設定 Layer 3 虛擬私有雲網路

YAML

針對 Layer 3 虛擬私有雲,建立 Network 和 GKENetworkParamSet 物件:

  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-network 的 Network 資源,類型為 Layer 3。Network 物件會參照名為 l3-vpc 的 GKENetworkParamSet 物件,將網路與 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 的 GKENetworkParamSet 物件,方法是將虛擬私有雲名稱設為 l3-vpc、子網路名稱設為 subnet-dp,並將 Pod 的次要 IPv4 位址範圍設為 sec-range-blue。

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

    kubectl apply -f l3-vpc.yaml
    

控制台

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

    前往「Google Kubernetes Engine」

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

  3. 按一下頁面頂端的「 Create」(建立),建立 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 網路路徑) 區段中,選取「ADD ROUTE」(新增路徑),定義「Custom routes」(自訂路徑)。

  15. 點選「建立 Pod 網路」。

設定 DPDK 網路

YAML

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

  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 的 Network 資源,類型為 Device。Network 資源會參照名為 dpdk 的 GKENetworkParamSet 物件,以取得設定。

  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"
    

    這個資訊清單定義名為 dpdk 的 GKENetworkParamSet 物件,將虛擬私有雲名稱設為 dpdk、子網路名稱設為 subnet-dpdk,以及 deviceMode 名稱設為 DPDK-VFIO。

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

    kubectl apply -f dpdk.yaml
    

控制台

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

    前往「Google Kubernetes Engine」

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

  3. 按一下頁面頂端的「 Create」(建立),建立 Pod 網路。

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

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

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

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

  8. 在「VPC network reference」(虛擬私有雲網路參照) 區段中,從「VPC network reference」(虛擬私有雲網路參照) 下拉式選單中,選取用於 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 網路路徑」部分,選取「新增路徑」來定義自訂路徑

  13. 點選「建立 Pod 網路」。

設定 netdevice 網路

為 netdevice 虛擬私有雲建立 Network 和 GKENetworkParamSet 物件。

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-network 的 Network 資源,類型為 Device。它會參照名為 netdevice 的 GKENetworkParamSet 物件。

  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"
    

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

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

    kubectl apply -f netdevice.yaml
    

控制台

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

    前往「Google Kubernetes Engine」

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

  3. 按一下頁面頂端的「 Create」(建立),建立 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)」(NetDevice (裝置)),然後輸入「Pod network name」(Pod 網路名稱)。

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

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

  13. 點選「建立 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. 按一下「Create Pod network」(建立 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,其中包含兩個網路介面 eth0 和 eth1,分別與 default 和 blue-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,其中包含三個網路介面:eth0、eth1 和 eth2,分別與 default、blue-network 和 netdevice 網路相關聯。

  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" 是否存在。如果缺少特定網路類型所需的插件或節點標籤,可能代表設定不完整或不正確。

堆疊類型無效錯誤

建立含有額外網路介面的節點集區時,可能會看到下列錯誤:

Google Compute Engine: Invalid value for field 'resource.properties.networkInterfaces[1].stackType': 'UNSPECIFIED_STACK_TYPE'.

如果使用僅限 IPv6 的子網路,但未在舊版 GKE 或設定中明確設定 stack-type 欄位的值,通常就會發生這項錯誤。如要解決這個問題,請務必更新 gcloud CLI 元件、使用較新的 GKE 版本,並在指令中明確加入 stack-type=ipv6 參數。

如果無法建立多網路工作負載,可以查看 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. 如果節點包含您要設定的網路介面,但未顯示在網路狀態註解中,請檢查 Network 和 GKENetworkParamSet (GNP) 資源。

檢查 Network 和 GKENetworkParamSet 資源

Network 和 GKENetworkParamSet (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 資源相符。

後續步驟