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 和機器學習工作負載。
要求 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 介面和 gVNIC,這些介面和 gVNIC 未設定任何次要 IP 位址範圍。請勿在同一個叢集中,同時使用 GKE DRANET 驅動程式和 GKE 多重網路 API,以及
Device類型的 Network 資源。系統不支援同時使用驅動程式和 API,因為這兩個 API 都會嘗試管理同一組 NIC,可能導致設定錯誤和無法預測的行為。
需求條件
如要使用 GKE 管理的 DRANET,環境必須符合下列需求:
- GKE 1.34.1-gke.1829001 以上版本。
- 叢集已啟用 GKE Dataplane V2。
- (搶先版) GKE DRANET 可在 A4X Max 電腦上使用。
限制
GKE DRANET 有下列限制:
- 您無法使用 GKE DRANET 分配預設網路介面卡 (NIC) 或虛擬 NIC (例如 veth)。
- 不支援叢集自動調度資源和 Autopilot。
- 您無法搭配已設定
secondaryPodRange的介面使用 GKE DRANET。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 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
要求特定數量的網路裝置
上述範例說明如何將 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 設定自動化網路。