您可以設定支援 Pod 多網路功能的 Google Kubernetes Engine (GKE) 叢集,同時將 Pod 和節點連線至多個不同的網路。這項功能可協助您滿足特殊網路需求,例如隔離流量,或提高高效能運算 (HPC) 或網路功能虛擬化 (NFV) 工作負載的處理量。
根據預設,GKE 叢集中的 Pod 和節點會使用單一主要網路介面處理所有流量。開始之前,請務必瞭解一般網路概念、GKE 多重網路支援專用的術語和概念,以及需求和限制。
詳情請參閱「關於 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 以上版本支援 Shared VPC。
- 多 Pod CIDR 僅支援 GKE 1.29 以上版本,且僅適用於預設 Pod 網路。
- 單一 GKE 叢集中的任何 Pod 網路都不得有重疊的 CIDR 範圍。
- 啟用 Pod 的多網路功能後,您就無法在建立節點集區後新增或移除節點網路介面或 Pod 網路。如要變更這些設定,您必須重新建立節點集區。
- 根據預設,Pod 內 Pod 網路的其他介面無法存取網路連線能力。不過,您可以使用 Cloud NAT 手動啟用。
- 您無法透過 API 變更 Pod 中多個介面內的預設閘道。預設閘道必須連線至預設 Pod 網路。
- 即使您建立其他 Pod 網路或介面,Pod 中也一律必須包含預設的 Pod 網路。
- 如果已設定 Managed Hubble,就無法設定多重網路功能。
- 如要使用 Shared VPC,請確認 GKE 叢集執行的是 1.28.4 以上版本。
- 如果是 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)。如要將多個 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,請按照下列步驟操作:
- 準備額外的虛擬私有雲、子網路 (節點網路) 和次要範圍 (Pod 網路)。
- 使用 Google Cloud CLI 指令建立啟用多重網路的 GKE 叢集。
- 使用 Google Cloud CLI 指令建立新的 GKE 節點集區,並連結至額外的節點網路和 Pod 網路。
- 建立 Pod 網路,並使用 Kubernetes API 參照多網路物件中的正確 VPC、子網路和次要範圍。
- 在工作負載設定中,使用 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 節點集區相關聯的預設 Pod 網路,該節點集區是在首次建立 GKE 叢集時使用。所有叢集節點和 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 位址範圍的每個節點,必須有兩倍於每個節點 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以 CIDR 標記法表示的次要 IPv4 位址範圍。
控制台
前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。
按一下「建立虛擬私有雲網路」。
在「Name」(名稱) 欄位中輸入網路名稱。例如:
l3-vpc。如要設定網路的最大傳輸單位 (MTU),請按照下列步驟操作:
在「Subnet creation mode」(子網路建立模式) 部分,選擇 [Custom] (自訂)。
點選「新增子網路」。
在「New subnet」(新的子網路) 區段中,為子網路指定下列設定參數:
提供名稱。例如:
l3-subnet。選擇「Region」(區域)。
輸入「IP address range」(IP 位址範圍)。這是子網路的主要 IPv4 範圍。
如果選取的範圍不是 RFC 1918 位址,請確認該範圍不會與現有設定衝突。詳情請參閱「IPv4 子網路範圍」。
如要定義子網路的次要範圍,請按一下「建立次要 IP 位址範圍」。
如果選取的範圍不是 RFC 1918 位址,請確認該範圍不會與現有設定衝突。詳情請參閱「IPv4 子網路範圍」。
Private Google Access:您可以在建立子網路時啟用Private Google Access,也可以在之後編輯子網路時啟用。
流量記錄:您可以在建立子網路時啟用虛擬私有雲流量記錄,也可以稍後編輯子網路來啟用。
按一下「完成」。
在「防火牆規則」部分的「IPv4 防火牆規則」下方,選取零或多個預先定義的防火牆規則。
這些規則適用於連線至執行個體的常見用途。建立網路後,您可以建立自己的防火牆規則。每個預先定義的規則名稱開頭都是您要建立的虛擬私有雲網路名稱。
在「IPv4 防火牆規則」下方,如要編輯名為
allow-custom的預先定義輸入防火牆規則,請按一下「編輯」。您可以編輯子網路、新增其他 IPv4 範圍,以及指定通訊協定和連接埠。
如果之後新增其他子網路,
allow-custom防火牆規則不會自動更新。如果新子網路需要防火牆規則,您必須更新防火牆設定才能新增規則。在虛擬私有雲網路的「Dynamic routing mode」(動態轉送模式) 區段中,詳情請參閱「動態路徑模式」。您之後可以變更動態路由模式。
點選「建立」。
建立支援 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 區域。
控制台
前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。
按一下「建立虛擬私有雲網路」。
在「Name」(名稱) 欄位中輸入網路名稱。例如
netdevice-vpc或dpdk-vpc。從「Maximum transmission unit (MTU)」(最大傳輸單位 (MTU)) 下拉式選單中,選擇適當的 MTU 值。
在「Subnet creation mode」(子網路建立模式) 部分,選擇 [Custom] (自訂)。
在「New subnet」(新的子網路) 區段中,為子網路指定下列設定參數:
提供名稱。例如:
netdevice-subnet或dpdk-vpc。選擇「Region」(區域)。
輸入「IP address range」(IP 位址範圍)。這是子網路的主要 IPv4 範圍。
如果選取的範圍不是 RFC 1918 位址,請確認該範圍與現有設定不衝突。詳情請參閱「IPv4 子網路範圍」。
Private Google Access:選擇是否要在建立子網路時,或稍後編輯子網路時,啟用Private Google Access。
流量記錄:您可以在建立子網路時啟用虛擬私有雲流量記錄,也可以在建立後編輯子網路來啟用。
按一下「完成」。
在「Firewall rules」(防火牆規則) 區段的「IPv4 firewall rules」(IPv4 防火牆規則) 下方,選取零或多個預先定義的防火牆規則。
這些規則可解決執行個體連線的常見用途。建立網路後,您可以建立自己的防火牆規則。每個預先定義的規則名稱開頭都是您要建立的虛擬私有雲網路名稱。
在「IPv4 防火牆規則」下方,如要編輯名為
allow-custom的預先定義輸入防火牆規則,請按一下「編輯」。您可以編輯子網路、新增其他 IPv4 範圍,以及指定通訊協定和連接埠。
如果之後新增其他子網路,
allow-custom防火牆規則不會自動更新。如果新子網路需要防火牆規則,您必須更新防火牆設定才能新增規則。在虛擬私有雲網路的「Dynamic routing mode」(動態轉送模式) 區段中,詳情請參閱「動態路徑模式」。您之後可以變更動態路由模式。
點選「建立」。
建立具備多網路功能的 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。啟用多重網路時,必須使用這個旗標。
控制台
建立連結至其他虛擬私有雲的 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:定義額外網路介面、網路和子網路的詳細資料。用來指定節點網路,以便連線至節點集區節點。如要連線至其他虛擬私有雲,請指定這項參數。如未指定這個參數,系統會使用與叢集相關聯的預設 VPC。如為Layer 3類型網路,請指定定義 Pod 網路的additional-pod-network旗標,該網路會在 GKE 叢集內公開為Network物件。使用--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值。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下導覽窗格中的「叢集」。
在「Kubernetes clusters」(Kubernetes 叢集) 專區中,按一下您建立的叢集。
按一下「Nodes」(節點) 分頁標籤。
按一下「建立由使用者管理的節點集區」add_box。
在「節點集區詳細資料」部分,完成下列步驟:
- 輸入節點集區的名稱。
- 輸入要在節點集區中建立的節點數量。
在導覽窗格的「Node Pools」(節點集區) 下方,按一下「Nodes」(節點)。
- 從「Image type」(映像檔類型) 下拉式選單中,選取「Container-Optimized OS with containerd (cos_containerd)」節點映像檔。
建立 VM 時,請從機器家族中選取機型,決定 VM 可用的資源。舉例來說,
e2-standard-4這類機型包含 4 個 vCPU,因此最多可支援 4 個 VPC。有多個機器系列可以選擇,每個機器系列可進一步分成不同的機器系列,以及各系列中預先定義或自訂的機器類型。每種機型的計費方式不同。詳情請參閱機型價目表。在導覽窗格中選取「網路」。
在「Node Networking」(節點網路) 區段中,指定每個節點的 Pod 數量上限。「節點網路」部分會顯示用於建立叢集的虛擬私有雲網路。您必須指定與先前建立的虛擬私有雲網路和裝置類型相關的額外節點網路。
建立節點集區關聯:
- 如果是
Layer 3類型的裝置:- 在「Node Networks」(節點網路) 專區,點選「ADD A NODE NETWORK」(新增節點網路)。
- 從網路下拉式選單中,選取「VPC that supports Layer 3 type device」。
- 選取為
Layer 3虛擬私有雲建立的子網路。 - 在「別名 Pod IP 位址範圍」部分,按一下「新增 Pod IP 位址範圍」。
- 選取「次要子網路」,並指定「每個節點的 Pod 數量上限」。
- 選取「完成」。
- 適用於
Netdevice和DPDK類型的裝置:- 在「節點網路」部分中,按一下「新增節點網路」。
- 從網路下拉式選單中,選取支援
Netdevice或DPDK類型裝置的 VPC。 - 選取為
Netdevice或DPDK虛擬私有雲建立的子網路。 - 選取「完成」。
- 如果是
點選「建立」。
注意:
- 透過設定
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
如要直接在節點集區的主要 VPC 介面上指定其他 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 網路
定義 Pod 將存取的 Pod 網路,方法是定義 Kubernetes 物件,並將這些物件連結至對應的 Compute Engine 資源,例如虛擬私有雲、子網路和次要範圍。
如要建立 Pod 網路,您必須在叢集中定義 Network CRD 物件。
設定 Layer 3 虛擬私有雲網路
YAML
針對 Layer 3 虛擬私有雲,建立 Network 和 GKENetworkParamSet 物件:
將下列資訊清單範例儲存為
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 資源建立關聯。將資訊清單套用至叢集:
kubectl apply -f blue-network.yaml將下列資訊清單儲存為
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-vpc的GKENetworkParamSet物件。將資訊清單套用至叢集:
kubectl apply -f l3-vpc.yaml
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下導覽窗格中的「Network Function Optimizer」。
按一下頁面頂端的「建立」add_box,建立 Pod 網路。
在「開始前準備」部分,確認詳細資料。
點選「下一步:Pod 網路位置」。
在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。
按一下「下一步:虛擬私有雲網路參考資料」。
在「虛擬私有雲網路參照」部分,從「虛擬私有雲網路參照」下拉式選單中,選取用於
Layer 3多重 NIC Pod 的虛擬私有雲網路。點選「下一步:Pod 網路類型」。
在「Pod 網路類型」部分,選取「L3」,然後輸入「Pod 網路名稱」。
點選「下一步:Pod 網路次要範圍」。
在「Pod network secondary range」(Pod 網路次要範圍) 區段中,輸入「Secondary range」(次要範圍)。
按一下「下一步:Pod 網路路徑」。
在「Pod 網路路徑」部分,選取「新增路徑」,定義「自訂路徑」。
按一下「建立 Pod 網路」。
設定 DPDK 網路
YAML
如果是 DPDK 虛擬私有雲,請建立 Network 和 GKENetworkParamSet 物件。
將下列範例資訊清單儲存為
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物件,以進行設定。將資訊清單套用至叢集:
kubectl apply -f dpdk-network.yaml如果是
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。將資訊清單套用至叢集:
kubectl apply -f dpdk.yaml
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下導覽窗格中的「Network Function Optimizer」。
按一下頁面頂端的「建立」add_box,建立 Pod 網路。
在「開始前準備」部分,確認詳細資料。
點選「下一步:Pod 網路位置」。
在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。
點選「下一步:虛擬私有雲網路參考資料」。
在「虛擬私有雲網路參照」部分,從「虛擬私有雲網路參照」下拉式選單中,選取用於 dpdk multinic Pod 的虛擬私有雲網路。
點選「下一步:Pod 網路類型」。
在「Pod network type」(Pod 網路類型) 區段中,選取「DPDK-VFIO (Device)」(DPDK-VFIO (裝置)),然後輸入「Pod network name」(Pod 網路名稱)。
點選「NEXT: POD NETWORK SECONDARY RANGE」(下一步:Pod 網路次要範圍)。「Pod 網路次要範圍」部分將無法使用
點選「下一步:Pod 網路路徑」。在「Pod network routes」部分,選取「ADD ROUTE」定義自訂路由
按一下「建立 Pod 網路」。
設定 netdevice 網路
為 netdevice 虛擬私有雲建立 Network 和 GKENetworkParamSet 物件。
YAML
將下列範例資訊清單儲存為
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物件。將資訊清單套用至叢集:
kubectl apply -f netdevice-network.yaml將下列資訊清單儲存為
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。將資訊清單套用至叢集:
kubectl apply -f netdevice.yaml
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下導覽窗格中的「Network Function Optimizer」。
按一下頁面頂端的「建立」add_box,建立 Pod 網路。
在「開始前準備」部分,確認詳細資料。
點選「下一步:Pod 網路位置」。
在「Pod network location」(Pod 網路位置) 區段中,從「Cluster」(叢集) 下拉式選單中,選取已啟用多網路功能和 GKE Dataplane V2 的 GKE 叢集。
按一下「下一步:虛擬私有雲網路參考資料」。
在「虛擬私有雲網路參照」部分,從「虛擬私有雲網路參照」下拉式選單中,選取用於 netdevice multinic Pod 的虛擬私有雲網路。
點選「下一步:Pod 網路類型」。
在「Pod network type」(Pod 網路類型) 部分,選取「NetDevice (Device)」(NetDevice (裝置)),然後輸入「Pod network name」(Pod 網路名稱)。
點選「NEXT: POD NETWORK SECONDARY RANGE」(下一步:Pod 網路次要範圍)。「Pod 網路次要範圍」部分將無法使用
點選「下一步:Pod 網路路徑」。在「Pod network routes」(Pod 網路路由) 專區中,選取「ADD ROUTE」(新增路由),定義自訂路由。
按一下「建立 Pod 網路」。
設定網路路徑
設定網路路由,即可為特定網路定義自訂路由,這些路由會在 Pod 上設定,將流量導向 Pod 中的對應介面。
YAML
將下列資訊清單儲存為
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」。將資訊清單套用至叢集:
kubectl apply -f red-network.yaml
控制台
前往 Google Cloud 控制台的 Network Function Optimizer 頁面。
點選「建立」。
選取已啟用多網路功能的叢集。
設定網路偏好設定。
按一下「建立 Pod 網路」。
參考準備好的 Network
在工作負載設定中,使用 Kubernetes API 參照準備好的 Network Kubernetes 物件。
將 Pod 連線至特定網路
如要將 Pod 連線至指定網路,您必須在 Pod 設定中加入 Network 物件的名稱做為註解。請務必在註解中同時加入 default Network 和所選的其他電視網,建立連結。
將下列範例資訊清單儲存為
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網路相關聯。將資訊清單套用至叢集:
kubectl apply -f sample-l3-pod.yaml
將 Pod 連結至多個網路
將下列範例資訊清單儲存為
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網路相關聯。將資訊清單套用至叢集:
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"}]
輸出內容會列出節點上可用的每個網路。如果節點未顯示預期的網路狀態,請執行下列操作:
確認節點是否可以存取網路
如果節點的網路狀態註解未顯示網路:
- 確認節點屬於為多重網路設定的集區。
- 請檢查節點的介面,確認是否有您要設定的網路介面。
- 如果節點缺少網路狀態,且只有一個網路介面,您仍須建立啟用多網路功能的節點集區。
- 如果節點包含您要設定的網路介面,但網路狀態註解中未顯示該介面,請檢查
Network和GKENetworkParamSet(GNP) 資源。
查看 Network 和 GKENetworkParamSet 資源
Network 和 GKENetworkParamSet (GNP) 資源的狀態都包含條件欄位,可回報設定錯誤。建議先檢查 GNP,因為這項資源不需依賴其他資源即可生效。
如要檢查條件欄位,請執行下列指令:
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 網路設定正確無誤。更新網路設定後,您可能需要重新建立 GNP 資源,手動觸發重新同步。 Google Cloud 這是為了避免無限輪詢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 資源相符。