全部产品
Search
文档中心

Container Service for Kubernetes:Jadwalkan GPU menggunakan DRA

更新时间:Oct 23, 2025

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.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, pilih Clusters. Pilih kluster target dan pilih Nodes > Node Pools.

  2. Klik Create Node Pool dan pilih Tipe instans GPU yang didukung oleh ACK. Pertahankan nilai default untuk parameter lainnya.

    1. Klik Specify Instance Type dan masukkan tipe instans, seperti ecs.gn7i-c8g1.2xlarge. Atur Expected Nodes menjadi 1.

    2. 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.

  1. Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.

  2. Instal CLI Helm jika Anda belum melakukannya.

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  3. Tambah dan perbarui repositori Helm NVIDIA.

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
    && helm repo update
  4. Instal driver NVIDIA DRA GPU versi 25.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"
    Penting

    Parameter --set controller.affinity=null menghapus deklarasi afinitas node dari workload controller. Ini memungkinkan workload controller dijadwalkan 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.

  1. Pastikan semua pod untuk driver GPU DRA berada dalam status Running.

    kubectl get pod -n nvidia-dra-driver-gpu
  2. Konfirmasikan bahwa sumber daya terkait DRA telah dibuat.

    kubectl get deviceclass,resourceslice

    Keluaran 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   57s
  3. Lihat detail pelaporan sumber daya GPU di lingkungan saat ini.

    Ganti cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj dengan nama sebenarnya dari objek sumber daya resourceslice.
    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 membuat ResourceClaimTemplate untuk secara otomatis membuat ResourceClaim.
  1. Deklarasikan ResourceClaimTemplate yang meminta satu GPU. Simpan konten berikut sebagai 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

    Buat ResourceClaimTemplate di kluster.

    kubectl apply -f resource-claim-template.yaml
  2. Buat 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-gpu

    Buat beban kerja yang merujuk ke ResourceClaimTemplate.

    kubectl apply -f resource-claim-template-pod.yaml
  3. Lihat ResourceClaim yang dibuat secara otomatis.

    1. Temukan ResourceClaim di namespace saat ini, seperti pod1-gpu-wstqm.

      kubectl get resourceclaim
    2. Lihat detail ResourceClaim.

      Ganti pod1-gpu-wstqm dengan nama sebenarnya dari objek sumber daya ResourceClaim.
      kubectl describe resourceclaim pod1-gpu-wstqm
  4. 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-gpu
  • Uninstall driver Nvidia GPU DRA.

    helm uninstall nvidia-dra-driver-gpu -n nvidia-dra-driver-gpu
  • Hapus atau lepaskan sumber daya node.