在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裝置被重複分配。
登入Container Service管理主控台,在左側導覽列選擇叢集列表 。單擊目的地組群名稱 ,然後選擇節點管理 > 節點池 。
單擊建立節點池 ,選擇執行個體規格為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