Untuk tugas pelatihan AI dan inferensi di mana beberapa aplikasi perlu berbagi sumber daya GPU, plugin perangkat tradisional memiliki keterbatasan penjadwalan. Gunakan API Kubernetes Dynamic Resource Allocation (DRA) untuk mencapai alokasi GPU dinamis dan detail halus antar pod dengan menerapkan driver NVIDIA DRA di kluster Container Service for Kubernetes (ACK) Anda. Hal ini meningkatkan pemanfaatan GPU dan mengurangi biaya.
Cara kerjanya
DRA adalah API Kubernetes yang memperluas model PersistentVolume ke sumber daya generik seperti GPU, memungkinkan pod untuk meminta dan berbaginya. Dibandingkan dengan model plugin perangkat tradisional, DRA menawarkan cara yang lebih fleksibel dan detail halus untuk meminta sumber daya.
Driver NVIDIA DRA untuk GPU mengimplementasikan API DRA untuk menyediakan cara modern dalam mengalokasikan GPU untuk beban kerja Kubernetes. Ini mendukung pembagian terkontrol dan rekonfigurasi dinamis GPU.
Prasyarat
Anda memiliki Kluster ACK yang dikelola Berjalan dengan versi Kubernetes 1.34 atau lebih baru.
Konfigurasikan lingkungan penjadwalan GPU DRA
Langkah 1: Buat kelompok node GPU
Buat kelompok node untuk penjadwalan GPU berbasis DRA. Gunakan label node untuk menonaktifkan plugin perangkat GPU default, mencegah GPU dihitung dua kali.
Masuk ke Konsol ACK. Di panel navigasi kiri, pilih Clusters. Pilih kluster target dan pilih Nodes > Node Pools.
Klik Create Node Pool dan pilih Tipe instans GPU yang didukung oleh ACK. Pertahankan nilai default untuk parameter lainnya.
Klik Specify Instance Type dan masukkan tipe instans, seperti
ecs.gn7i-c8g1.2xlarge. Atur Expected Nodes menjadi 1.Perluas Advanced Options (Optional). Di bagian Node Labels, masukkan pasangan kunci-nilai:
ack.node.gpu.schedule: disabled. Label ini menonaktifkan fitur penjadwalan GPU eksklusif default dan mencegah plugin perangkat GPU melaporkan sumber daya.Mengaktifkan plugin perangkat dan DRA secara bersamaan menyebabkan sumber daya GPU dialokasikan dua kali. Nonaktifkan pelaporan sumber daya plugin perangkat GPU pada node DRA.
Langkah 2: Instal driver NVIDIA DRA
Instal driver NVIDIA DRA GPU menggunakan Helm. Driver ini menyediakan implementasi dari API DRA untuk kluster Anda.
Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.
Instal CLI Helm jika Anda belum melakukannya.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashTambah dan perbarui repositori
Helm NVIDIA.helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateInstal driver
NVIDIA DRA GPUversi25.3.2. Perintah ini mengonfigurasi driver agar hanya berjalan pada node yang telah Anda labeli pada langkah sebelumnya.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"PentingParameter
--set controller.affinity=nullmenghapus deklarasi afinitas node dari workloadcontroller. Ini memungkinkan workloadcontrollerdijadwalkan pada node apa pun, yang mungkin menyebabkan masalah stabilitas. Evaluasi dampaknya sebelum melakukan operasi ini di lingkungan produksi.Keluaran berikut menunjukkan bahwa driver telah diinstal.
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
Langkah 3: Verifikasi lingkungan
Verifikasi bahwa driver NVIDIA DRA berjalan sesuai harapan dan sumber daya GPU dilaporkan ke kluster Kubernetes.
Pastikan semua pod untuk driver GPU DRA berada dalam status
Running.kubectl get pod -n nvidia-dra-driver-gpuKonfirmasikan bahwa sumber daya terkait DRA telah dibuat.
kubectl get deviceclass,resourcesliceKeluaran yang diharapkan:
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 57sLihat detail pelaporan sumber daya GPU di lingkungan saat ini.
Ganti
cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhjdengan nama sebenarnya dari objek sumber dayaresourceslice.kubectl get resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj -o yaml
Sebarkan beban kerja menggunakan GPU DRA
Bagian ini menunjukkan cara menerapkan beban kerja yang meminta sumber daya GPU menggunakan DRA. Ini dilakukan dengan membuatResourceClaimTemplateuntuk secara otomatis membuatResourceClaim.
Deklarasikan
ResourceClaimTemplateyang meminta satu GPU. Simpan konten berikut sebagairesource-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: gpuBuat
ResourceClaimTemplatedi kluster.kubectl apply -f resource-claim-template.yamlBuat file bernama
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-gpuBuat beban kerja yang merujuk ke
ResourceClaimTemplate.kubectl apply -f resource-claim-template-pod.yamlLihat
ResourceClaimyang dibuat secara otomatis.Temukan
ResourceClaimdi namespace saat ini, sepertipod1-gpu-wstqm.kubectl get resourceclaimLihat detail
ResourceClaim.Ganti
pod1-gpu-wstqmdengan nama sebenarnya dari objek sumber dayaResourceClaim.kubectl describe resourceclaim pod1-gpu-wstqm
Periksa log pod untuk memverifikasi bahwa ia memiliki akses ke GPU. Keluaran yang diharapkan harus mencantumkan GPU yang dialokasikan, seperti
GPU 0: NVIDIA A10.kubectl logs pod1
(Opsional) Bersihkan lingkungan
Setelah selesai, hapus sumber daya yang Anda buat untuk menghindari biaya yang tidak perlu.
Hapus beban kerja yang diterapkan dan template klaim.
kubectl delete pod pod1 kubectl delete resourceclaimtemplate single-gpuUninstall driver
Nvidia GPU DRA.helm uninstall nvidia-dra-driver-gpu -n nvidia-dra-driver-gpu