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

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-central1us-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_TYPEGPU 加速器的類型:

    例如:

    • 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 驅動程式版本。例如:defaultlatest

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

  • NUM_NODES:節點集區的節點數量。如果是彈性開始時間,這個值必須設為 0。

  • RESERVATION_PROJECT:預訂的專案 ID。

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

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

這項指令會使用加速器網路設定檔,自動為加速器 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
    

    以下範例輸出內容顯示預設的 eth0lo 介面,以及已分配的 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

  1. 建立參照 netdev.google.com DeviceClassResourceClaimTemplate。下列資訊清單會要求節點上所有可用的非 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。以下資訊清單會部署 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
  4. 套用資訊清單:

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

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

    以下範例輸出內容顯示預設的 eth0lo 介面,以及已分配的網路裝置,這些裝置的名稱類似 eth1eth2。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

後續步驟