使用 GKE 管理的 DRANET 分配網路資源

Google Kubernetes Engine (GKE) DRANET 是代管 GKE 功能,以開放原始碼 DRANET 專案為基礎,為網路資源實作 Kubernetes DRA API。DRANET 可讓您為 Pod 要求及分配高效能網路資源,包括支援遠端直接記憶體存取 (RDMA) 的網路介面。這種方法提供可攜式、與上游一致的 API,用於管理網路資源。

本文提供 GKE DRANET 的概念總覽,並說明如何將網路資源分配給 GKE 叢集中的工作負載。

本文適用對象為雲端架構師和網路專家,他們負責為組織設計網路。如需所有 GKE 說明文件的總覽,請參閱「探索 GKE 說明文件」。如要瞭解 Google Cloud 內容中提及的常見角色和工作,請參閱「常見的 GKE 使用者角色和工作」。

閱讀本文前,請先熟悉下列概念:

GKE 代管 DRANET 的運作方式

GKE 代管的 DRANET 是透過 networking-dra-driver DaemonSet 實作。這個 DaemonSet 會在具備 GPU、TPU 或儲存空間最佳化 VM 的節點上執行,且這些 VM 已啟用 GKE DRANET。

這個外掛程式會做為節點層級代理,透過 Kubernetes 動態資源分配 (DRA) API,讓網路介面可供偵測及分配給 Pod。

在 GKE 1.34.1-gke.1829001 以上版本中,GKE 會自動安裝網路的 DeviceClass 資源。這些類別定義了您可以要求的網路裝置類型。舉例來說,GKE 會為 GPU VM 建立 mrdma.google.com 類別、為 TPU 和其他網路裝置建立 netdev.google.com 類別,以及為儲存空間最佳化 VM (例如 Z4M) 建立 irdma.google.com 類別。

如要使用 GKE DRANET,請先在具備 GPU、TPU 或儲存空間最佳化 VM 的節點集區上,啟用 GKE DRANET 驅動程式。

如要為工作負載要求網路裝置,請定義 ResourceClaimTemplate。這個範本會指定 DeviceClass 和分配模式,例如要求節點上的所有可用裝置。在 Pod 規格中,請在 resourceClaims 欄位中參照這個範本,授予 Pod 存取節點上所要求網路介面的權限。

使用 GKE 代管 DRANET 的時機

GKE DRANET 提供標準化方式,可管理能感知拓撲和依附元件的網路資源。這項標準化作業使 RoCE 成為 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 或儲存空間最佳化 VM 的節點集區。

  • 使用其他 GKE DRA 驅動程式

    如要在高需求 AI/機器學習工作負載中提高處理量,請將加速器 (例如 GPU 和 TPU) 的 DRA API 與 GKE DRANET 代管網路搭配使用。這種結合方法可改善資源對齊和拓撲感知。如要進一步瞭解如何將 DRA 用於其他資源,請參閱「為 DRA 工作負載準備 GKE 基礎架構」。

  • 避免設定衝突

    GKE DRANET 驅動程式會管理 RDMA 介面和 gVNIC,這些介面和 gVNIC 未設定任何次要 IP 位址範圍。請勿在同一個叢集中,同時使用 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-driver DaemonSet。手動變更 (例如更新 nodeAffinity 欄位) 可能會干擾 GKE 管理 DRANET 功能,導致 DRANET Daemon Pod 排定在不支援的節點上。

需求條件

如要使用 GKE 代管的 DRANET,環境必須符合下列需求:

  • Standard:1.34.1-gke.1829001 以上版本 (Z4M VM 則為 1.36.3-gke.1767000 以上版本)。
  • Autopilot:1.35.2-gke.1842000 以上版本 (Z4M VM 則為 1.37.0-gke.4713000 以上版本)。
  • 叢集已啟用 GKE Dataplane V2。

此外,您必須使用下列其中一種加速器最佳化或儲存空間最佳化機型:

機器系列 機型 加速器模型 網路技術 DeviceClass
A3 Ultra a3-ultragpu-8g NVIDIA H200 GPU RDMA mrdma.google.com
A4 a4-highgpu-8g NVIDIA B200 GPU RDMA mrdma.google.com
A4X a4x-highgpu-4g NVIDIA GB200 GPU RDMA mrdma.google.com
A4X Max a4x-maxgpu-4g-metal NVIDIA B300 GPU RDMA mrdma.google.com
TPU v7 tpu7x-standard-4t TPU v7 NetDevice netdev.google.com
TPU v6e ct6e-standard-8t Trillium TPU NetDevice netdev.google.com
TPU v6e ct6e-standard-4t Trillium TPU NetDevice netdev.google.com
TPU v6e ct6e-standard-1t Trillium TPU NetDevice netdev.google.com
Z4M 任何支援 IRDMA 的 Z4M 機型 不適用 (儲存空間最佳化) RDMA irdma.google.com

限制

GKE DRANET 有下列限制:

  • 您無法使用 GKE DRANET 分配預設網路介面卡 (NIC) 或虛擬 NIC (例如 veth)。
  • 某些執行個體類型 (尤其是 a4x-max 等裸機節點) 與自動調度資源和 Autopilot 叢集不相容。

機器專屬注意事項

視節點的基礎硬體架構而定,部分機器系列需要額外的節點集區旗標、容器映像檔套件或系統 DaemonSet,才能使用 GKE DRANET 設定 RDMA 介面。

A4X Max 裸機

  • 部署 asapd-lite:使用裸機 GPU 節點 (例如 A4X Max) 時,必須將 asapd-lite DaemonSet 部署至叢集。asapd-lite DaemonSet 會設定 RDMA 網路介面卡 (NIC)。如果沒有這個值,系統就不會建立子介面,且 dranet 驅動程式會篩除 RDMA NIC,導致 Pod 內無法使用 RDMA 功能。如需完整的設定操作說明,請參閱「使用 asapd-lite 設定 MRDMA NIC」。

Z4M 儲存空間最佳化 VM

  • 容器映像檔需求:如要在 Z4M 執行個體上使用 RDMA,必須使用 Rocky Linux 8 容器映像檔,並設定必要的使用者空間 RDMA 套件。不支援 Ubuntu 或 Debian 等其他發行版本。這些發行版本的標準上游套件缺少 IRDMA 驅動程式所需的自訂 ABI 擴充功能。如果沒有這些擴充功能,套件會在執行階段失敗,並顯示 -ENOSPC 錯誤。如需設定操作說明,請參閱「在儲存空間最佳化節點集區中使用 RDMA 介面」。

事前準備

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

  • 啟用 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 版本:
    • Z4M VM:1.36.3-gke.1767000 以上版本
    • 所有其他支援的 VM 或裸機執行個體: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。
  • ACCELERATOR_COUNT:要附加至節點集區中節點的 GPU 數量。舉例來說,a4-highgpu-8g 和 a3-ultragpu-8g VM 的 GPU 數量都是 8。

  • DRIVER_VERSION:要使用的 GPU 驅動程式版本。例如:default 或 latest。

  • MACHINE_TYPE:節點集區的機型,例如 a3-ultragpu-8g。

  • NUM_NODES:節點集區的節點數量。如要使用 flex-start,這個值必須設為 0。

  • RESERVATION_PROJECT:預留項目的專案 ID。

  • RESERVATION_NAME:預留項目名稱。如要查看這個值,請參閱「查看未來預留項目要求」。

  • RESERVATION_BLOCK:預留項目中特定區塊的名稱。如要查看這個值,請參閱「查看未來預留項目要求」。

這個指令會使用加速晶片 VM 網路設定檔,自動為加速晶片 VM 設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路。

部署工作負載 RDMA 資源

如要為 Pod 分配 RDMA 資源,請指定 ResourceClaimTemplate。

  1. 建立 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
    
  2. 套用資訊清單:

    kubectl apply -f all-mrdma-template.yaml
    
  3. 部署工作負載並參照 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
    
  4. 套用資訊清單:

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 確認 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 網路介面。

驗證網路 DeviceClasses

確認叢集中有網路的 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 slice 節點集區」。

部署工作負載,宣告所有網路裝置

如要為 Pod 分配非 RDMA 網路裝置,請指定 ResourceClaimTemplate。

  1. 建立參照 netdev.google.com DeviceClass 的 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
    
  2. 套用資訊清單:

    kubectl apply -f all-netdev-template.yaml
    
  3. 部署工作負載並參照 ResourceClaimTemplate。下列資訊清單會部署使用 all-netdev 範本的 Pod,將 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。
  4. 套用資訊清單:

    kubectl apply -f netdev-pod.yaml
    
  5. 確認 Pod 內顯示額外分配的網路介面。

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    以下範例輸出內容顯示預設的 eth0 和 lo 介面,以及分配的網路裝置,名稱類似 eth1 和 eth2。NIC 的數量和名稱會因 GKE 節點的機器類型而異。

    eth0
    eth1
    eth2
    lo
    

在儲存空間最佳化節點集區中使用 RDMA 介面

以下各節說明如何設定儲存空間最佳化節點集區和工作負載,以便透過 Z4M (z4m-highmem-192) VM,搭配 GKE DRANET 使用 RDMA 網路介面。

建立儲存空間最佳化節點集區

使用 --accelerator-network-profile=auto 旗標建立儲存空間最佳化節點集區,讓 GKE 自動佈建及連結基礎 Falcon 虛擬私有雲網路、子網路和次要網路介面。在 Z4M 節點集區中,GKE 預設會啟用 DRANET,因此建立節點集區時,不必指定 cloud.google.com/gke-networking-dra-driver=true 節點標籤。這個範例使用 z4m-highmem-192 機型,該機型具有雙實體 Titanium NIC,並提供兩個 RDMA 介面。如需支援的機器類型清單,請參閱「需求條件」。

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=z4m-highmem-192 \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • CLUSTER_NAME:叢集名稱。
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • ZONE:節點集區的 Google Cloud 可用區。
  • NUM_NODES:節點集區中的節點數量。如要使用範例 rdma-server 和 rdma-client Pod 測試跨節點的 RDMA 流量,請至少指定 2。

準備儲存空間最佳化工作負載容器映像檔

如果工作負載在儲存空間最佳化節點上使用 Cloud RDMA,則須使用 Rocky Linux 8 容器映像檔,並安裝 Cloud RDMA 的自訂使用者空間 RDMA 程式庫 (rdma-core)。請勿使用預設上游套件,因為這些套件缺少主機 IRDMA 驅動程式所需的自訂 ABI 擴充功能,且會在執行階段失敗並顯示 -ENOSPC 錯誤。如要驗證 IP 位址指派作業並測試 RDMA 連線能力,請一併安裝 iproute、libibverbs-utils、librdmacm-utils、infiniband-diags 和 perftest。

如需設定必要 Package Repository 的 Dockerfile 範例,請參閱「準備 Docker 映像檔」。在 dnf install 指令中加入 iproute,以便使用 ip 指令檢查 IP 指派作業。如要進一步瞭解必要套件,請參閱「Cloud RDMA RPM」。

部署具備 RDMA 資源的工作負載

如要將 RDMA 介面分配給儲存空間最佳化節點上的 Pod,請建立要求 irdma.google.com DeviceClass 的 ResourceClaimTemplate:

  1. 建立 ResourceClaimTemplate 資訊清單,並儲存為 irdma-template.yaml:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: irdma-template
    spec:
      spec:
        devices:
          requests:
          - name: irdma
            exactly:
              deviceClassName: irdma.google.com
              allocationMode: ExactCount
              count: 2
    

    在這個資訊清單中:

    • deviceClassName: irdma.google.com:要求儲存空間最佳化節點上,由 GKE DRANET 管理的 IRDMA 網路介面。
    • allocationMode: ExactCount 和 count: 2:要求 z4m-highmem-192 節點上可用的兩個 IRDMA 介面。如果工作負載只需要一個 RDMA 介面,或您使用的 Z4M 機型提供一個 IRDMA 介面,請指定 1。
  2. 套用資訊清單:

    kubectl apply -f irdma-template.yaml
    
  3. 建立資訊清單,定義 rdma-server 和 rdma-client 這兩個 Pod,以便測試節點之間的 RDMA 流量。每個 Pod 都會新增 IPC_LOCK 功能,並參照 irdma-template ResourceClaimTemplate。將資訊清單儲存為 irdma-pods.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: rdma-server
      labels:
        app: perftest
        role: server
    spec:
      restartPolicy: Never
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["perftest"]
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: perftest
        image: IMAGE_URI
        command: ["sleep", "infinity"]
        securityContext:
          capabilities:
            add: ["IPC_LOCK"]
        resources:
          claims:
          - name: irdma
      resourceClaims:
      - name: irdma
        resourceClaimTemplateName: irdma-template
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: rdma-client
      labels:
        app: perftest
        role: client
    spec:
      restartPolicy: Never
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["perftest"]
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: perftest
        image: IMAGE_URI
        command: ["sleep", "infinity"]
        securityContext:
          capabilities:
            add: ["IPC_LOCK"]
        resources:
          claims:
          - name: irdma
      resourceClaims:
      - name: irdma
        resourceClaimTemplateName: irdma-template
    

    將兩個 IMAGE_URI 執行個體替換為 Rocky Linux 8 RDMA 容器映像檔的 URI。

    在這個資訊清單中:

    • metadata.labels:使用 app: perftest 和 role 標籤為每個 Pod 加上標籤。兩個 Pod 都共用 app: perftest 標籤,因此反親和性規則會套用至這兩個 Pod。role 標籤可區分 rdma-server Pod (role: server) 和 rdma-client Pod (role: client),以便測試跨節點的 Pod 對 Pod RDMA 連線。
    • affinity.podAntiAffinity:防止 Kubernetes 將共用 app: perftest 標籤的 Pod 排定在同一個節點上。由於兩個 Pod 都有這個標籤,因此即使 ResourceClaimTemplate 只要求一個介面 (count: 1),它們也會在不同的實體主機上執行,以進行跨節點 RDMA 測試。節點集區必須至少有兩個節點,才能排定兩個 Pod。
    • securityContext.capabilities.add: ["IPC_LOCK"]:允許容器鎖定記憶體頁面,這是 RDMA 使用者空間程式庫註冊記憶體區域,以便直接存取記憶體時所需的權限。
    • spec.resourceClaims:從 irdma-template ResourceClaimTemplate 產生 Pod 專屬的 ResourceClaim (名為 irdma)。
    • containers.resources.claims:將 irdma 宣告分配的介面存取權授予 perftest 容器。
  4. 套用資訊清單:

    kubectl apply -f irdma-pods.yaml
    
  5. 確認伺服器 Pod 中可看到分配的 RDMA 介面 (rdma0 和 rdma1):

    kubectl exec rdma-server -- ip -br addr show
    

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

    lo               UNKNOWN        127.0.0.1/8
    rdma1            UP             10.5.0.3/32
    rdma0            UP             10.31.0.3/32
    eth0@if18        UP             10.120.2.6/32
    

如要驗證兩個 Pod 之間的 RDMA 流量,請在 rdma-server 和 rdma-client 之間執行 rping:

  1. 在伺服器 Pod 上啟動 rping 伺服器:

    kubectl exec -it rdma-server -- rping -s -a RDMA_IP -v -d
    

    將 RDMA_IP 替換為伺服器 Pod 的 rdma0 或 rdma1 IP 位址,例如 10.31.0.3。

  2. 在第二個終端機中,在用戶端 Pod 上執行 rping 用戶端:

    kubectl exec -it rdma-client -- rping -c -a RDMA_IP -C 5 -v -d
    

    在用戶端輸出內容中,確認下列指標是否顯示 RDMA 連線成功:

    • RDMA_CM_EVENT_ADDR_RESOLVED 和 RDMA_CM_EVENT_ROUTE_RESOLVED:確認 RDMA 通訊管理員已解析目標 RDMA IP 位址和路徑。
    • ESTABLISHED 和 rdma_connect successful:確認用戶端已建立佇列配對 (qp)、完成佇列 (cq) 和保護網域 (pd),並建立 RDMA 連線。
    • 五個 send completion、recv completion 和 ping data: rdma-ping- 項目:確認在關閉連線 (destroy cm_id) 之前,RDMA 介面上已完成五次 RDMA 讀取和寫入來回疊代。

使用自訂 ComputeClass 啟用 DRANET

如要在 Autopilot 叢集,或在 Standard 叢集搭配自動佈建節點使用 GKE 代管 DRANET,必須使用自訂 ComputeClass 資源選擇加入這項功能。

  1. 建立 ComputeClass 資訊清單,啟用 DRANET 驅動程式,並將加速晶片 VM 網路設定檔設為 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
        # Omit the gpu section for storage-optimized VMs (such as Z4M).
        gpu:
          count: GPU_COUNT
          type: GPU_TYPE
        acceleratorNetworkProfile: auto
    

    更改下列內容:

    • MACHINE_TYPE:節點集區的機器類型,例如 a3-ultragpu-8g 或 z4m-highmem-192。
    • GPU_COUNT:機器類型的 GPU 數量。
    • GPU_TYPE:GPU 類型,例如 nvidia-h200。
  2. 套用資訊清單:

    kubectl apply -f COMPUTE_CLASS_FILENAME.yaml
    
  3. 在 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"
      ...
    

要求特定數量的網路裝置

上述 GPU 和 TPU 範例說明如何將 allocationMode 設為 All,要求特定類型的所有可用網路裝置。如要改為要求特定數量的裝置,請在 ResourceClaimTemplate 中將 allocationMode 設為 ExactCount,如「部署具備 RDMA 資源的工作負載」所示。

以下範例會要求兩個 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

後續步驟