为 DRA 工作负载准备 GKE 基础架构

本文档介绍了如何设置 Google Kubernetes Engine (GKE) 基础设施以支持动态资源分配 (DRA)。设置步骤包括创建使用 GPU 或 TPU 的节点池,以及在集群中安装 DRA 驱动程序。本文档适用于希望降低使用专用硬件设备设置基础设施的复杂性和开销的平台管理员

限制

  • 不支持节点自动预配。
  • Autopilot 集群不支持 DRA。
  • DRA 不支持自动 GPU 驱动程序安装。
  • 您无法使用以下 GPU 共享功能:
    • 分时 GPU
    • 多实例 GPU
    • 多进程服务 (MPS)
  • 对于 TPU,您必须启用 v1beta1v1beta2 版本的 DRA API 类型。此限制不适用于 GPU,GPU 可以使用 v1 API 版本。

要求

如需使用 DRA,您的 GKE 集群必须运行 1.34 或更高版本。

您还应熟悉以下要求和限制,具体取决于您要使用的硬件类型:

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
  • 拥有运行 1.34 版或更高版本的 GKE Standard 集群。您还可以创建区域级集群

  • 如果您未使用 Cloud Shell,请安装 Helm CLI:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  • 如需为 TPU 使用 DRA,请启用 v1beta1v1beta2 版本的 DRA API 种类:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices,resource.k8s.io/v1beta2/deviceclasses,resource.k8s.io/v1beta2/resourceclaims,resource.k8s.io/v1beta2/resourceclaimtemplates,resource.k8s.io/v1beta2/resourceslices"
    

创建具有 GPU 或 TPU 的 GKE 节点池

在 GKE 上,您可以将 DRA 与 GPU 和 TPU 搭配使用。节点池配置设置(例如机器类型、加速器类型、数量、节点操作系统和节点位置)取决于您的需求。如需创建支持 DRA 的节点池,请选择以下选项之一:

GPU

如需将 DRA 用于 GPU,您必须在创建节点池时执行以下操作:

  • 在为节点池配置 GPU 时,通过在 --accelerator 标志中指定 gpu-driver-version=disabled 选项,停用 GPU 驱动程序自动安装。
  • 通过添加 gke-no-default-nvidia-gpu-device-plugin=true 节点标签来停用 GPU 设备插件。
  • 通过添加 nvidia.com/gpu.present=true 节点标签,让 DRA 驱动程序 DaemonSet 在节点上运行。

如需为 DRA 创建 GPU 节点池,请按以下步骤操作:

  1. 创建具有所需硬件的节点池。以下示例创建了一个节点池,该节点池在 Container-Optimized OS 上具有 g2-standard-24 实例和两个 L4 GPU。

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type "g2-standard-24" \
        --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \
        --num-nodes "1" \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    替换以下内容:

    • NODEPOOL_NAME:您的节点池的名称。
    • CLUSTER_NAME:您的集群的名称。
    • CONTROL_PLANE_LOCATION:集群控制平面所在的区域或可用区,例如 us-central1us-central1-a
  2. 在 Container-Optimized OS 或 Ubuntu 节点上手动安装驱动程序。如需了解详细说明,请参阅手动安装 NVIDIA GPU 驱动程序

TPU

如需为 TPU 使用 DRA,您必须通过添加 gke-no-default-tpu-device-plugin=true 节点标签来停用 TPU 设备插件。以下示例会创建一个支持 DRA 的 TPU Trillium 节点池:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --location=CONTROL_PLANE_LOCATION \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t

替换以下内容:

  • NODEPOOL_NAME:您的节点池的名称。
  • CLUSTER_NAME:您的集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面所在的区域或可用区,例如 us-central1us-central1-a

安装 DRA 驱动程序

GPU

  1. 拉取并更新包含 NVIDIA DRA 驱动程序的 Helm 图表:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. 安装版本为 25.3.2 的 NVIDIA DRA 驱动程序:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.3.2" --create-namespace --namespace=nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set 'kubeletPlugin.tolerations[0].key=nvidia.com/gpu' \
        --set 'kubeletPlugin.tolerations[0].operator=Exists' \
        --set 'kubeletPlugin.tolerations[0].effect=NoSchedule'
    

    对于 Ubuntu 节点,请使用 nvidiaDriverRoot="/opt/nvidia" 目录路径。

TPU

  1. 克隆 ai-on-gke 代码库,以访问包含 GPU 和 TPU 的 DRA 驱动程序的 Helm 图表:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. 导航到包含图表的目录:

    cd common-infra/common/charts
    
  3. 安装 TPU DRA 驱动程序:

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

验证您的基础架构是否已为 DRA 做好准备

  1. 如需验证 DRA 驱动程序 Pod 是否正在运行,请选择以下选项之一:

    GPU

    kubectl get pods -n nvidia-dra-driver-gpu
    

    输出类似于以下内容:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    

    TPU

    kubectl get pods -n tpu-dra-driver
    
    

    输出类似于以下内容:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. 确认 ResourceSlice 列出了您添加的硬件设备:

    kubectl get resourceslices -o yaml
    

    如果您使用了上一部分中的示例,则输出类似于以下内容,具体取决于您配置的是 GPU 还是 TPU:

    GPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1
      kind: ResourceSlice
      metadata:
      # Multiple lines are omitted here.
      spec:
        devices:
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 0
            minor:
              int: 0
            pcieBusID:
              string: "0000:00:03.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f
          capacity:
            memory:
              value: 23034Mi
          name: gpu-0
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 1
            minor:
              int: 1
            pcieBusID:
              string: "0000:00:04.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978
          capacity:
            memory:
              value: 23034Mi
          name: gpu-1
        driver: gpu.nvidia.com
        nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
        pool:
          generation: 1
          name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

    TPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1beta1
      kind: ResourceSlice
      metadata:
        # lines omitted for clarity
      spec:
        devices:
        - basic:
            attributes:
              index:
                int: 0
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "0"
        - basic:
            attributes:
              index:
                int: 1
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "1"
        - basic:
            attributes:
              index:
                int: 2
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "2"
        - basic:
            attributes:
              index:
                int: 3
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "3"
        driver: tpu.google.com
        nodeName: gke-tpu-b4d4b61b-fwbg
        pool:
          generation: 1
          name: gke-tpu-b4d4b61b-fwbg
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

后续步骤