使用DRA调度GPU

AI训练和推理场景中,当多个应用需要共享GPU资源时,为突破传统设备插件的调度限制,可在ACK集群中部署NVIDIA DRA驱动,通过Kubernetes DRA API实现PodGPU动态分配与细粒度资源控制,提升GPU利用率并降低成本。

工作原理

适用范围

创建ACK托管集群,且集群版本为1.34及以上。

配置DRA GPU调度环境

步骤一:创建GPU节点池

创建使用DRA GPU调度的节点池,并通过节点标签关闭默认的GPU Device Plugin资源上报,避免GPU设备被重复分配。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表 。单击目标集群名称 ,然后选择节点管理 > 节点池 。

  2. 单击创建节点池 ,选择实例规格为ACK支持的GPU实例规格,其余保持默认即可。

    1. 单击指定实例规格,输入规格名称,如ecs.gn7i-c8g1.2xlarge。设置期望节点数1 。

    2. 单击高级选项 ,展开节点池编辑详情,在节点标签(Labels)处输入键值对:ack.node.gpu.schedule: disabled,关闭默认的独占GPU调度功能,停止GPU Device Plugin资源上报。

      同时启用Device PluginDRA会导致GPU资源被重复分配,因此需要在DRA节点上禁用GPU Device Plugin资源上报。

步骤二:安装NVIDIA DRA驱动

安装NVIDIA DRA GPU驱动程序,为集群提供DRA API的具体实现。

  1. 获取集群KubeConfig并通过kubectl工具连接集群

  2. 安装Helm CLI。

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  3. 添加NVIDIA Helm仓库并更新。

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

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.2" --create-namespace --namespace nvidia-dra-driver-gpu \
        --set gpuResourcesEnabledOverride=true \
        --set controller.affinity=null \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key=ack.node.gpu.schedule" \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator=In" \
        --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]=disabled"
    重要

    --set controller.affinity=null会去除controller工作负载的节点亲和性声明,会将controller负载调度到任意节点上,可能导致稳定性问题,生产环境中请评估后操作。

    预期输出如下,说明驱动已正确安装。

    NAME: nvidia-dra-driver-gpu
    LAST DEPLOYED: Tue Oct 14 20:42:13 2025
    NAMESPACE: nvidia-dra-driver-gpu
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None

步骤三:验证环境配置

验证NVIDIA DRA驱动是否正常运行,并确认GPU资源已成功上报到Kubernetes集群。

  1. 确认DRA GPU驱动组件的Pod是否为Running状态。

    kubectl get pod -n nvidia-dra-driver-gpu
  2. 确认DRA相关资源已成功创建。

    kubectl get deviceclass,resourceslice

    预期输出为:

    NAME                                                                    AGE
    deviceclass.resource.k8s.io/compute-domain-daemon.nvidia.com            60s
    deviceclass.resource.k8s.io/compute-domain-default-channel.nvidia.com   60s
    deviceclass.resource.k8s.io/gpu.nvidia.com                              60s
    deviceclass.resource.k8s.io/mig.nvidia.com                              60s
    
    NAME                                                                                   NODE                      DRIVER                      POOL                      AGE
    resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-compute-domain.nvidia.com-htjqn   cn-beijing.10.11.34.156   compute-domain.nvidia.com   cn-beijing.10.11.34.156   57s
    resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj              cn-beijing.10.11.34.156   gpu.nvidia.com              cn-beijing.10.11.34.156   57s
  3. 查看当前环境GPU资源上报详情。

    cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj替换为实际的resourceslice资源对象名称。
    kubectl get resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj -o yaml

部署使用DRA GPU的工作负载

环境配置完成后,将演示如何通过 ResourceClaimTemplate 自动创建资源声明(ResourceClaim),从而为工作负载申请并使用DRA GPU资源。
  1. 创建resource-claim-template.yaml文件。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: single-gpu
    spec:
      spec:
        devices:
          requests:
          - exactly:
              allocationMode: ExactCount
              deviceClassName: gpu.nvidia.com
              count: 1
            name: gpu

    在集群中创建ResourceClaimTemplate

    kubectl apply -f resource-claim-template.yaml
  2. 创建resource-claim-template-pod.yaml文件。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
      labels:
        app: pod
    spec:
      containers:
      - name: ctr
        image: registry-cn-hangzhou.ack.aliyuncs.com/dev/ubuntu:22.04
        command: ["bash", "-c"]
        args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]
        resources:
          claims:
          - name: gpu
      resourceClaims:
      - name: gpu
        resourceClaimTemplateName: single-gpu

    创建引用ResourceClaimTemplate的工作负载。

    kubectl apply -f resource-claim-template-pod.yaml
  3. 查看自动创建的ResourceClaim

    1. 查找当前命名空间中 ResourceClaim,如pod1-gpu-wstqm

      kubectl get resourceclaim
    2. 查看ResourceClaim的详细信息。

      替换pod1-gpu-wstqm为实际的ResourceClaim资源对象名称。
      kubectl describe resourceclaim pod1-gpu-wstqm
  4. 查看工作负载是否正常使用GPU,预期输出GPU 0: NVIDIA A10

    kubectl logs pod1

(可选)清理环境

测试完成后,如果不再使用已创建的资源,请及时清理以避免产生不必要的费用。

  • 删除清理已部署的工作负载和资源声明。

    kubectl delete pod pod1
    kubectl delete resourceclaimtemplate single-gpu
  • 删除已创建的Nvidia GPU DRA程序。

    helm uninstall nvidia-dra-driver-gpu -n nvidia-dra-driver-gpu
  • 移除或释放节点资源