Google Kubernetes Engine (GKE) DRANET 是以開放原始碼 DRANET 專案為基礎建構的代管 GKE 功能,可實作網路資源的 Kubernetes DRA API。透過 DRANET,您可以為 Pod 要求及分配高效能網路資源,包括支援遠端直接記憶體存取 (RDMA) 的網路介面。這種做法可提供可攜式且與上游一致的網路資源管理 API。
本文提供 GKE DRANET 的概念總覽,並說明如何將網路資源分配給 GKE 叢集中的工作負載。
本文適用於為機構設計網路的雲端架構師和網路專家。如要查看所有 GKE 說明文件總覽,請參閱「探索 GKE 說明文件」。如要瞭解 Google Cloud 內容中提及的常見角色和工作,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本文前,請先熟悉下列項目:
GKE 管理的 DRANET 運作方式
GKE 代管的 DRANET 是透過 networking-dra-driver
DaemonSet 實作。這個 DaemonSet 會在啟用 GKE DRANET 的 GPU 或 TPU 節點上執行。
這項功能會做為節點層級的代理程式,透過 Kubernetes 動態資源分配 (DRA) API,讓網路介面可供 Pod 探索及分配。
在 GKE 1.34.1-gke.1829001 以上版本中,GKE 會自動安裝網路的 DeviceClass 資源。這些類別定義了可要求的網路裝置類型。舉例來說,GKE 會為支援 RDMA 的裝置建立 mrdma.google.com 類別,並為其他網路裝置建立 netdev.google.com 類別。
如要使用 GKE DRANET,請先在搭載 GPU 或 TPU 的節點集區上啟用 GKE DRANET 驅動程式。
如要為工作負載要求網路裝置,請定義 ResourceClaimTemplate。
這個範本會指定 DeviceClass 和分配模式,例如要求節點上的所有可用裝置。在 Pod 規格中,於 resourceClaims 欄位參照這個範本,即可授予 Pod 節點上所要求網路介面的存取權。
使用 GKE 管理的 DRANET 的時機
GKE DRANET 提供標準化方式,管理具備拓撲和依附元件感知能力的網路資源。這項標準化做法可為需要高效能網路的 AI 和 ML 工作負載提供合適的解決方案。
為 Pod 要求網路介面的常見用途包括:
- 要求所有可用的 RDMA 介面。
- 要求特定數量的 RDMA 介面。
- 要求所有可用的非 RDMA 介面。
- 要求特定數量的非 RDMA 介面。
使用 GKE 管理的 DRANET 進行網路連線時的重要考量
使用 GKE DRANET 進行網路連線時,請注意下列事項:
專屬網路介面
使用 GKE DRANET 為 Pod 宣告網路介面時,該介面會專供該 Pod 使用。同一節點上的其他 Pod 無法共用。這種做法可確保 Pod 獨享該介面的完整頻寬和資源,對於效能敏感型工作負載而言,這是相當重要的優勢。
獨立使用 GKE 管理的 DRANET 驅動程式
您可以啟用 GKE DRA 驅動程式來管理網路資源,不必啟用其他 GKE DRANET 驅動程式。如要這樣做,請將
cloud.google.com/gke-networking-dra-driver=true標籤新增至含有 GPU 和 TPU 的節點集區。使用其他 GKE DRA 驅動程式
如要在高需求 AI/機器學習工作負載中實現更高的處理量,請將加速器 (如 GPU 和 TPU) 的 DRA API 與 GKE DRANET 代管網路結合使用。這種綜合方法可改善資源對齊和拓撲感知。如要進一步瞭解如何將 DRA 用於其他資源,請參閱「為 DRA 工作負載準備 GKE 基礎架構」。
避免設定衝突
GKE DRANET 驅動程式會管理 RDMA 介面和未設定任何次要 IP 位址範圍的 gVNIC。請勿在同一個叢集中,同時使用 GKE DRANET 驅動程式和 GKE 多重網路 API,以及
Device類型的網路資源。不支援同時使用驅動程式和 API,因為這兩個 API 都會嘗試管理同一組 NIC,可能導致設定錯誤和無法預測的行為。管理 DRANET 驅動程式的生命週期
在 GKE 1.34 以上版本中,GKE 會自動在叢集中建立受管理
gke-managed-networking-dra-driver命名空間。與其他 GKE 系統工作負載類似,DRANET 驅動程式的 Pod 只會在相關節點上執行 (例如具有 GPU、TPU 和其他特殊硬體的節點)。在與驅動程式無關的節點上,不會執行此驅動程式的任何 Pod。請勿手動修改networking-dra-driverDaemonSet。手動變更 (例如更新nodeAffinity欄位) 可能會干擾 GKE 管理 DRANET 功能,並導致 DRANET 精靈 Pod 排定在不支援的節點上。
需求條件
如要使用 GKE 管理的 DRANET,環境必須符合下列需求:
- 標準:1.34.1-gke.1829001 以上版本。
- Autopilot:1.35.2-gke.1842000 以上版本。
- 叢集已啟用 GKE Dataplane V2。
您必須使用下列其中一種加速器最佳化機器類型:
| 機器系列 | 機型 | 加速器型號 | 網路技術 |
|---|---|---|---|
| A3 Ultra | a3-ultragpu-8g |
NVIDIA H200 GPU | RDMA |
| A4 | a4-highgpu-8g |
NVIDIA B200 GPU | RDMA |
| A4X | a4x-highgpu-4g |
NVIDIA GB200 GPU | RDMA |
| A4X Max | a4x-maxgpu-4g-metal |
NVIDIA B300 GPU | RDMA |
| TPU v7 | tpu7x-standard-4t |
TPU v7 | NetDevice |
| TPU v6e | ct6e-standard-8t |
Trillium TPU | NetDevice |
| TPU v6e | ct6e-standard-4t |
Trillium TPU | NetDevice |
| TPU v6e | ct6e-standard-1t |
Trillium TPU | NetDevice |
限制
GKE DRANET 有下列限制:
- 您無法使用 GKE DRANET 分配預設網路介面卡 (NIC) 或虛擬 NIC (例如 veth)。
- 某些執行個體類型 (尤其是裸機節點,例如
a4x-max) 與自動調度資源和 Autopilot 叢集不相容。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
必要的角色
如要取得建立節點集區及分配網路資源所需的權限,請要求管理員授予您專案的 Kubernetes Engine 管理員 (roles/container.admin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
建立叢集
建立使用 GKE Dataplane V2 的 GKE Standard 叢集:
gcloud container clusters create CLUSTER_NAME \
--enable-dataplane-v2 \
--region=CONTROL_PLANE_LOCATION \
--project=PROJECT_ID \
--cluster-version=CLUSTER_VERSION
更改下列內容:
CLUSTER_NAME:新叢集的名稱。CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區,例如us-central1或us-central1-a。PROJECT_ID:您的 Google Cloud 專案 ID。CLUSTER_VERSION:叢集的 GKE 版本。這個版本必須為 1.34.1-gke.1829001 以上。
從 GPU 節點集區使用 RDMA 介面
下列各節說明如何設定 GPU 節點集區和工作負載,透過 GKE DRANET 使用 RDMA 網路介面。
在 GPU 節點集區中啟用 GKE 管理的 DRANET 驅動程式
如要在支援 RDMA 的 GPU 節點集區上啟用 GKE DRANET 驅動程式,請在建立節點集區時新增 cloud.google.com/gke-networking-dra-driver=true 標籤。
gcloud beta container node-pools create NODE_POOL_NAME \
--region=REGION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
--machine-type=MACHINE_TYPE \
--num-nodes=NUM_NODES \
--reservation-affinity=specific \
--reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
更改下列內容:
NODE_POOL_NAME:新節點集區的名稱。REGION:叢集的 Google Cloud 區域。CLUSTER_NAME:叢集名稱。ACCELERATOR_TYPE:GPU 加速器類型:例如:
- A4 VM:輸入
nvidia-b200。 - A3 Ultra VM:輸入
nvidia-h200-141gb。
- A4 VM:輸入
ACCELERATOR_COUNT:要附加至節點集區中節點的 GPU 數量。舉例來說,a4-highgpu-8g 和 a3-ultragpu-8g VM 的 GPU 數量都是 8 個。DRIVER_VERSION:要使用的 GPU 驅動程式版本。例如:default或latest。MACHINE_TYPE:節點集區的機型,例如a3-ultragpu-8g。NUM_NODES:節點集區的節點數量。如果是彈性啟動,這個值必須設為 0。RESERVATION_PROJECT:預訂的專案 ID。RESERVATION_NAME:預訂名稱。如要找出這個值,請參閱「查看未來預留項目要求」。RESERVATION_BLOCK:預留項目中的特定區塊名稱。如要找出這個值,請參閱「查看未來預留項目要求」。
這項指令會使用加速器網路設定檔,自動為加速器 VM 設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路。
部署工作負載 RDMA 資源
如要為 Pod 分配 RDMA 資源,請指定 ResourceClaimTemplate。
建立
ResourceClaimTemplate,定義如何分配 RDMA 裝置。 下列資訊清單會要求節點上所有可用的mrdma裝置。將資訊清單儲存為all-mrdma-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-mrdma spec: spec: devices: requests: - name: req-mrdma exactly: deviceClassName: mrdma.google.com allocationMode: All套用資訊清單:
kubectl apply -f all-mrdma-template.yaml部署工作負載並參照
ResourceClaimTemplate。下列資訊清單會部署參照all-mrdma範本的 Pod,該範本會授予 Pod 節點上 RDMA 介面的存取權。將資訊清單儲存為agnhost-rdma-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-rdma namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: rdma limits: nvidia.com/gpu: 1 resourceClaims: - name: rdma resourceClaimTemplateName: all-mrdma套用資訊清單:
kubectl apply -f agnhost-rdma-pod.yaml確認 Pod 內是否顯示額外分配的網路介面。
kubectl exec agnhost-rdma -- ls /sys/class/net以下範例輸出內容顯示預設的
eth0和lo介面,以及已分配的 RDMA 介面,例如gpu0rdma0。網路介面 (NIC) 的數量和名稱會因 GKE 節點的機型而異。eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
在 TPU 節點集區中使用非 RDMA 網路介面
下列各節說明如何設定 TPU 節點集區和工作負載,透過 GKE DRANET 使用非 RDMA 網路介面。
驗證網路 DeviceClass
確認叢集中有網路的 DeviceClass 資源。
kubectl get deviceclass netdev.google.com
輸出結果會與下列內容相似:
NAME AGE
netdev.google.com 2d22h
在 TPU 節點集區啟用 GKE 管理的 DRANET 驅動程式
如要在建立 TPU 節點集區時啟用 GKE DRANET 驅動程式,請新增 cloud.google.com/gke-networking-dra-driver=true 標籤。
gcloud beta container node-pools create NODE_POOL_NAME \
--location=LOCATION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--machine-type=MACHINE_TYPE \
--tpu-topology=TPU_TOPOLOGY \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
更改下列內容:
NODE_POOL_NAME:新節點集區的名稱。LOCATION:叢集所在的 Google Cloud 區域或可用區。CLUSTER_NAME:叢集名稱。NODE_LOCATIONS:節點集區中節點的 Google Cloud 區域。MACHINE_TYPE:節點使用的機器類型。如要進一步瞭解與 TPU 相容的機器類型,請參閱「選擇 TPU 版本」。TPU_TOPOLOGY:TPU 拓撲,例如2x4x4。 拓撲格式取決於 TPU 版本。如要進一步瞭解 TPU 拓撲,請參閱「選擇拓撲」。NUM_NODES:節點集區中的節點數量。
詳情請參閱「建立單一主機 TPU 配量節點集區」。
部署工作負載,聲明所有網路裝置
如要為 Pod 分配非 RDMA 網路裝置,請指定 ResourceClaimTemplate。
建立參照
netdev.google.comDeviceClass的ResourceClaimTemplate。下列資訊清單會要求節點上所有可用的非 RDMA 網路裝置。將資訊清單儲存為
all-netdev-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-netdev spec: spec: devices: requests: - name: req-netdev exactly: deviceClassName: netdev.google.com allocationMode: All套用資訊清單:
kubectl apply -f all-netdev-template.yaml部署工作負載並參照
ResourceClaimTemplate。以下資訊清單會部署 Pod,並使用all-netdev範本授予 Pod 節點上所有非 RDMA 網路裝置的存取權。將資訊清單儲存為netdev-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-netdev namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: netdev limits: google.com/tpu: 4 nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY resourceClaims: - name: netdev resourceClaimTemplateName: all-netdev更改下列內容:
TPU_ACCELERATOR:TPU 加速器類型,例如tpu-v5p-slice。TPU_TOPOLOGY:TPU 拓撲,例如2x4x4。
套用資訊清單:
kubectl apply -f netdev-pod.yaml確認 Pod 內是否顯示額外分配的網路介面。
kubectl exec agnhost-netdev -- ls /sys/class/net以下範例輸出內容顯示預設的
eth0和lo介面,以及已分配的網路裝置,這些裝置的名稱類似eth1和eth2。NIC 數量和名稱會因 GKE 節點的機型而異。eth0 eth1 eth2 lo
使用自訂 ComputeClass 啟用 DRANET
如要在 Autopilot 叢集或 Standard 叢集使用 GKE 代管 DRANET,並自動佈建節點,您必須使用自訂 ComputeClass 資源選擇啟用這項功能。
建立 ComputeClass 資訊清單,啟用 DRANET 驅動程式,並將加速器網路設定檔設為
auto:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: dranet-compute-class spec: nodePoolAutoCreation: enabled: true nodePoolConfig: dra: networking: enabled: true priorities: - machineType: MACHINE_TYPE gpu: count: GPU_COUNT type: GPU_TYPE acceleratorNetworkProfile: auto更改下列內容:
MACHINE_TYPE:節點集區的機型,例如a3-ultragpu-8g。GPU_COUNT:機型的 GPU 數量。GPU_TYPE:GPU 類型,例如nvidia-h200。
套用資訊清單:
kubectl apply -f COMPUTE_CLASS_FILENAME.yaml在 Pod 規格中,使用
cloud.google.com/compute-class節點選取器參照 ComputeClass:apiVersion: v1 kind: Pod metadata: name: dranet-pod spec: nodeSelector: cloud.google.com/compute-class: "dranet-compute-class" ...
要求特定數量的網路裝置
上述範例說明如何將 allocationMode 設為 All,要求特定類型的所有可用網路裝置。如要改為要求特定數量的裝置,請在 ResourceClaimTemplate 中將 allocationMode 設為 ExactCount。
以下範例要求兩個 RDMA 網路裝置:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: two-mrdma
spec:
spec:
devices:
requests:
- name: req-mrdma
exactly:
deviceClassName: mrdma.google.com
allocationMode: ExactCount
count: 2
後續步驟
- 進一步瞭解動態資源分配。
- 進一步瞭解如何設定加速器 VM 的自動化網路功能。