在AI训练和推理场景中,当多个应用需要共享GPU资源时,为突破传统设备插件的调度限制,可在ACK集群中部署NVIDIA DRA驱动,通过Kubernetes DRA API实现Pod间GPU动态分配与细粒度资源控制,提升GPU利用率并降低成本。
工作原理
动态资源分配(Dynamic Resource Allocation,DRA)可实现在Pod之间请求和共享GPU资源,它是持久卷API针对通用资源的扩展。相比传统的设备插件模式,DRA提供了更灵活、更细粒度的资源请求方式。
NVIDIA动态资源分配GPU驱动程序(NVIDIA DRA Driver for GPUs)通过实现DRA API,为Kubernetes工作负载提供现代化的GPU分配方式,支持受控共享和动态重新配置GPU。
适用范围
创建ACK托管集群,且集群版本为1.34及以上。
配置DRA GPU调度环境
步骤一:创建GPU节点池
创建使用DRA GPU调度的节点池,并通过节点标签关闭默认的GPU Device Plugin资源上报,避免GPU设备被重复分配。
登录容器服务管理控制台,在左侧导航栏选择集群列表 。单击目标集群名称 ,然后选择节点管理 > 节点池 。
单击创建节点池 ,选择实例规格为ACK支持的GPU实例规格,其余保持默认即可。
单击指定实例规格,输入规格名称,如
ecs.gn7i-c8g1.2xlarge
。设置期望节点数为1 。单击高级选项 ,展开节点池编辑详情,在节点标签(Labels)处输入键值对:
ack.node.gpu.schedule: disabled
,关闭默认的独占GPU调度功能,停止GPU Device Plugin资源上报。同时启用Device Plugin和DRA会导致GPU资源被重复分配,因此需要在DRA节点上禁用GPU Device Plugin资源上报。
步骤二:安装NVIDIA DRA驱动
安装NVIDIA DRA GPU
驱动程序,为集群提供DRA API
的具体实现。
安装Helm CLI。
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
添加
NVIDIA Helm
仓库并更新。helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
安装版本为
25.3.2
的NVIDIA 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集群。
确认DRA GPU驱动组件的Pod是否为
Running
状态。kubectl get pod -n nvidia-dra-driver-gpu
确认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
查看当前环境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资源。
创建
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
创建
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
查看自动创建的
ResourceClaim
。查找当前命名空间中
ResourceClaim
,如pod1-gpu-wstqm
。kubectl get resourceclaim
查看
ResourceClaim
的详细信息。替换
pod1-gpu-wstqm
为实际的ResourceClaim
资源对象名称。kubectl describe resourceclaim pod1-gpu-wstqm
查看工作负载是否正常使用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