全部产品
Search
文档中心

Container Service for Kubernetes:Mengonfigurasi dan mengelola komponen ack-nvidia-device-plugin

更新时间:Nov 11, 2025

NVIDIA Device Plugin adalah komponen dalam kluster Kubernetes yang mengelola GPU pada setiap node. Komponen ini memungkinkan Kubernetes menggunakan sumber daya GPU secara lebih mudah dan efisien. Topik ini menjelaskan cara meningkatkan dan memulai ulang NVIDIA Device Plugin, mengisolasi perangkat GPU, serta melihat dan memperbarui versi komponen pada node ACK dalam skenario penjadwalan GPU khusus.

Catatan Penggunaan

Untuk informasi selengkapnya tentang cara melihat versi, meningkatkan, dan memulai ulang NVIDIA Device Plugin, serta mengisolasi perangkat GPU, lihat Mengonfigurasi dan Mengelola NVIDIA Device Plugin.

Perhatikan poin-poin berikut mengenai NVIDIA Device Plugin yang diterapkan sebagai DaemonSet:

  • Komponen ini dipasang secara otomatis saat Anda membuat kluster.

  • Jika Anda menguninstall komponen ini, node GPU yang diskalakan tidak dapat melaporkan sumber daya GPU.

  • Saat Anda meningkatkan kluster dari versi sebelumnya ke versi 1.32, NVIDIA Device Plugin yang diterapkan sebagai pod statis juga ditingkatkan menjadi komponen ACK.

  • DaemonSet memiliki NodeSelector (ack.node.gpu.schedule=default). Saat node GPU ditambahkan ke kluster, skrip ACK untuk menambahkan node secara otomatis menambahkan label ini ke node GPU tersebut. Hal ini memastikan bahwa DaemonSet menerapkan pod yang sesuai pada node GPU.

Penting
  • Jika sistem operasi node adalah Ubuntu 22.04 atau Red Hat Enterprise Linux (RHEL) 9.3 64-bit, NVIDIA Device Plugin mungkin gagal berfungsi dengan benar. Hal ini karena komponen ack-nvidia-device-plugin mengatur variabel lingkungan NVIDIA_VISIBLE_DEVICES=all untuk pod secara default. Akibatnya, plugin tidak dapat mengakses perangkat GPU setelah node menjalankan perintah systemctl daemon-reload atau systemctl daemon-reexec. Untuk informasi selengkapnya, lihat Apa yang harus saya lakukan jika terjadi kesalahan "Failed to initialize NVML: Unknown Error" saat menjalankan kontainer GPU?.

  • Jika Anda meningkatkan kluster dari versi sebelumnya ke versi 1.32 sebelum 1 Mei 2025, kluster mungkin memiliki NVIDIA Device Plugin yang diterapkan baik sebagai pod statis maupun DaemonSet. Anda dapat menjalankan skrip berikut untuk melihat node tempat plugin diterapkan sebagai pod statis.

    #!/bin/bash
    for i in $(kubectl get po -n kube-system -l component=nvidia-device-plugin | grep -v NAME | awk '{print $1}');do
        if kubectl get po $i -o yaml -n kube-system | grep 'kubernetes.io/config.source: file' &> /dev/null;then
        kubectl get pod $i -n kube-system -o jsonpath='{.spec.nodeName}{"\n"}'
        fi
    done

    Keluaran yang diharapkan:

    cn-beijing.10.12.XXX.XX
    cn-beijing.10.13.XXX.XX

    Keluaran yang diharapkan menunjukkan bahwa NVIDIA Device Plugin masih diterapkan sebagai pod statis pada beberapa node. Anda dapat memigrasikan NVIDIA Device Plugin dari penerapan pod statis ke penerapan DaemonSet dengan menjalankan skrip berikut.

    kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=default

Perbedaan Versi

Implementasi dan kebijakan pengelolaan komponen ack-nvidia-device-plugin bervariasi berdasarkan versi kluster. Jika versi kluster Anda lebih awal dari 1.20, tingkatkan kluster secara manual. Perbedaannya adalah sebagai berikut:

Atribut

Versi Kluster 1.32 dan lebih baru

Versi Kluster 1.20 hingga 1.31

Metode penerapan

DaemonSet

Pod Statis

Metode pengelolaan

Pengelolaan komponen di Konsol

Pemeliharaan manual

Persyaratan label node

ack.node.gpu.schedule=default

Tidak ada persyaratan khusus

Prasyarat

Lihat versi NVIDIA Device Plugin

Versi Kluster 1.32 dan lebih baru

Untuk komponen yang diterapkan sebagai DaemonSet, Anda dapat menemukan komponen ack-nvidia-device-plugin di halaman Component Management di konsol dan melihat versi saat ini pada kartu komponen.

Versi Kluster 1.20 hingga 1.31

Untuk komponen yang diterapkan sebagai pod statis, jalankan perintah berikut untuk melihat versi komponen.

kubectl get pods -n kube-system -l component=nvidia-device-plugin \
  -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\t"}{.spec.nodeName}{"\n"}{end}' \
  | awk -F'[:/]' '{split($NF, a, "-"); print a[1] "\t" $0}' \
  | sort -k1,1V \
  | cut -f2- \
  | awk -F'\t' '{split($1, img, ":"); print img[NF] "\t" $2}'

Tingkatkan NVIDIA Device Plugin

  1. Tingkatkan komponen ack-nvidia-device-plugin.

    Untuk versi kluster 1.32 dan lebih baru

    1. Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.

    2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel sebelah kiri, pilih Operations > Add-ons.

    3. Di halaman Pengelolaan Komponen, cari komponen ack-nvidia-device-plugin dan klik Upgrade pada kartunya.

    4. Pada kotak dialog yang muncul, klik OK.

    Untuk versi kluster dari 1.20 hingga 1.31

    1. Di halaman Clusters, klik nama kluster yang ingin Anda ubah. Di panel navigasi sebelah kiri, pilih Nodes > Nodes.

    2. Pilih node GPU tempat Anda ingin melakukan operasi batch. Di bawah daftar node, klik Batch Operations. Di kotak dialog Batch Operations, pilih Execute Shell Command dan klik OK.

      Penting

      Pertama-tama, pilih sejumlah kecil node GPU untuk ditingkatkan. Setelah Anda memverifikasi bahwa Device Plugin berfungsi sebagaimana mestinya pada node-node tersebut, lakukan operasi pada batch node yang lebih besar.

    3. Anda akan diarahkan ke antarmuka OOS. Atur Execution Mode menjadi Pause On Failure, lalu klik Next: Set Parameters.

    4. Di halaman Set Parameters, pilih Run Shell Script dan tempel skrip contoh berikut.

      Catatan

      Dalam skrip, ubah parameter RUN_PKG_VERSION menjadi versi utama kluster Anda, misalnya 1.30. Jangan masukkan versi minor, seperti 1.30.1. Jika tidak, skrip akan gagal.

      #!/bin/bash
      set -e
      
      RUN_PKG_VERSION=1.30
      
      function update_device_plugin() {
      	base_dir=/tmp/update_device_plugin
      	rm -rf $base_dir
      	mkdir -p $base_dir
      	cd $base_dir
      	region_id=$(curl -ssL 100.100.100.200/latest/meta-data/region-id  2> /dev/null || echo "")
      	if [[ $region_id == "" ]]; then
      		echo "Error: failed to get region id,region id is null"
      		exit 1
      	fi
      	PKG_URL=https://aliacs-k8s-${region_id}.oss-${region_id}.aliyuncs.com/public/pkg/run/run-${RUN_PKG_VERSION}.tar.gz
      	curl -sSL --retry 3 --retry-delay 2 -o run.tar.gz $PKG_URL
      	tar -xf run.tar.gz
      
      	local dir=pkg/run/$RUN_PKG_VERSION/module
      	sed -i "s@registry.cn-hangzhou.aliyuncs.com/acs@registry-${region_id}-vpc.ack.aliyuncs.com/acs@g" $dir/nvidia-device-plugin.yml
      	mkdir -p /etc/kubernetes/device-plugin-backup
      	mkdir -p /etc/kubernetes/manifests
      	mv  /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes/device-plugin-backup/nvidia-device-plugin.yml.$(date +%s)
      	sleep 5
      	cp -a $dir/nvidia-device-plugin.yml /etc/kubernetes/manifests
      	echo "succeeded to update device plugin"
      }
      
      if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then
      	update_device_plugin
      else
      	echo "skip to update device plugin"
      fi
    5. Klik Next: Confirm. Setelah Anda mengonfirmasi informasi tersebut, klik Create.

      Setelah tugas dibuat, Anda akan diarahkan ke halaman Task Execution Management tempat Anda dapat melihat status tugas. Jika Execution Output menampilkan succeeded to update device plugin, pembaruan berhasil.

  2. Periksa apakah komponen berjalan sebagaimana mestinya.

    Jalankan perintah berikut untuk memeriksa apakah Device Plugin berfungsi sebagaimana mestinya pada node GPU.

    1. Hubungkan ke kluster menggunakan kubectl di Workbench atau CloudShell.

    2. Jalankan perintah berikut untuk memeriksa apakah NVIDIA Device Plugin telah dimulai ulang:

      kubectl get po -n kube-system -l component=nvidia-device-plugin 

      Contoh keluaran:

      NAME                             READY   STATUS    RESTARTS      AGE
      nvidia-device-plugin-xxxx        1/1     Running   1             1m
    3. Setelah semua Pod dimulai ulang, jalankan skrip berikut untuk memeriksa apakah node melaporkan sumber daya GPU:

      #!/bin/bash
      
      # Get all eligible NVIDIA Device Plugin Pods and the nodes where they are located.
      PODS=$(kubectl get po -n kube-system -l component=nvidia-device-plugin -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}')
      
      # Iterate over the node of each Pod.
      echo "$PODS" | while IFS=$'\t' read -r pod_name node_name; do
          # Get the value of nvidia.com/gpu resource allocation for the node.
          gpu_allocatable=$(kubectl get node "$node_name" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null)
      
          # Check if the resource value is 0.
          if [ "$gpu_allocatable" == "0" ]; then
              echo "Error: node=$node_name, pod=$pod_name, resource(nvidia.com/gpu) is 0"
          fi
      done

      Jika sebuah node melaporkan nilai 0 untuk sumber daya tersebut, lihat Restart the NVIDIA Device Plugin.

Mulai Ulang NVIDIA Device Plugin

Dalam skenario penjadwalan GPU khusus di ACK, Device Plugin yang melaporkan perangkat GPU pada sebuah node diterapkan sebagai pod secara default. Oleh karena itu, proses mulai ulang harus dilakukan pada node target.

Kluster versi 1.32 dan lebih baru

  1. Jalankan perintah berikut untuk menemukan pod Device Plugin pada node tersebut.

    kubectl get pod -n kube-system -l component=nvidia-device-plugin -o wide | grep <NODE>
  2. Jalankan perintah berikut untuk memulai ulang pod Device Plugin.

    kubectl delete po <DEVICE_PLUGIN_POD> -n kube-system 

Kluster versi 1.20 hingga 1.31

  1. Di halaman Clusters, temukan kluster yang akan dikelola dan klik namanya. Di panel navigasi sebelah kiri, pilih Nodes > Node Pools.

  2. Di halaman Node Pools, klik nama kelompok node, lalu masuk ke node GPU target.

    Jika sistem operasinya adalah ContainerOS, login pengguna langsung tidak didukung untuk mengurangi risiko keamanan potensial dan mencegah operasi yang tidak dapat dilacak. Fitur Secure Shell (SSH) juga tidak tersedia untuk login. Untuk login ke instans guna operasi dan pemeliharaan (O&M), lihat Lakukan O&M pada node ContainerOS.
  3. Pilih node GPU yang memerlukan pemeliharaan batch. Di bawah daftar node, klik Batch Operations. Di kotak dialog Batch Operations, pilih Execute Shell Command, lalu klik OK.

    Penting

    Pertama-tama, mulai ulang sejumlah kecil node GPU. Setelah Anda memverifikasi bahwa Device Plugin berfungsi sebagaimana mestinya pada node yang dimulai ulang, lakukan operasi pada batch node yang lebih besar.

  4. Di halaman OOS yang muncul, atur Execution Mode menjadi Pause On Failure, lalu klik Next: Set Parameters.

  5. Di halaman Set Parameters, pilih Run Shell Script, lalu tempel skrip contoh berikut.

    #!/bin/bash
    set -e
    
    if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then
    	cp -a /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes
    	rm -rf /etc/kubernetes/manifests/nvidia-device-plugin.yml
    	sleep 5
    	mv /etc/kubernetes/nvidia-device-plugin.yml /etc/kubernetes/manifests
    	echo "The NVIDIA device is restarted."
    else
    	echo "No need to restart the NVIDIA device plugin."
    fi
  6. Klik Next: Confirm. Setelah Anda mengonfirmasi bahwa informasi tersebut benar, klik Create. Anda kemudian akan diarahkan ke halaman Task Execution Management, tempat Anda dapat melihat status tugas.

  7. Jalankan perintah berikut untuk memeriksa apakah Device Plugin pada node GPU berfungsi sebagaimana mestinya.

    kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'

    Keluaran yang diharapkan:

    cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1

    Jika nilai sumber daya tambahan nvidia.com/gpu yang dilaporkan oleh node GPU bukan 0, Device Plugin berfungsi sebagaimana mestinya.

Ubah ID Perangkat NVIDIA Device Plugin

Saat Device Plugin mengalokasikan perangkat ke pod, plugin tersebut membuat file titik pemeriksaan pada node. File ini mencatat perangkat mana saja yang dialokasikan dan informasi pod terkaitnya. Dalam NVIDIA Device Plugin, file titik pemeriksaan menggunakan UUID GPU sebagai pengenal unik (kunci) untuk setiap perangkat GPU secara default. Anda dapat mengubah kunci ini menjadi indeks perangkat untuk mengatasi masalah, seperti kehilangan UUID akibat migrasi dingin VM.

Untuk versi kluster 1.32 dan lebih baru

  1. Jalankan perintah berikut untuk mengubah DaemonSet NVIDIA Device Plugin.

    kubectl get ds -n kube-system ack-nvidia-device-plugin
  2. Tambahkan variabel lingkungan berikut CHECKPOINT_DEVICE_ID_STRATEGY.

        env:
          - name: CHECKPOINT_DEVICE_ID_STRATEGY
            value: index
  3. Restart the NVIDIA Device Plugin agar perubahan diterapkan.

Untuk versi kluster dari 1.20 hingga 1.31

  1. Di node target, periksa tag citra Device Plugin dalam file /etc/kubernetes/manifests/nvidia-device-plugin.yml. Tag tersebut merepresentasikan nomor versi. Jika nomor versi lebih awal dari 0.9.3, perbarui ke versi terbaru, v0.9.3-0dd4d5f5-aliyun.

  2. Dalam file /etc/kubernetes/manifests/nvidia-device-plugin.yml, tambahkan variabel lingkungan CHECKPOINT_DEVICE_ID_STRATEGY ke konfigurasi pod statis.

        env:
          - name: CHECKPOINT_DEVICE_ID_STRATEGY
            value: index
  3. Restart the NVIDIA Device Plugin agar perubahan diterapkan.

Aktifkan Isolasi Perangkat GPU

Penting

Isolasi perangkat GPU hanya didukung di nvidia-device-plugin v0.9.1 dan lebih baru. Untuk informasi selengkapnya, lihat Lihat versi NVIDIA Device Plugin.

Dalam skenario penjadwalan GPU khusus di ACK, Anda mungkin perlu mengisolasi perangkat GPU pada sebuah node karena alasan seperti kegagalan perangkat. ACK menyediakan mekanisme bagi Anda untuk secara manual mengisolasi perangkat pada sebuah node guna mencegah pod aplikasi GPU baru dialokasikan ke perangkat tersebut. Prosedurnya adalah sebagai berikut:

Di node target, buat atau edit file unhealthyDevices.json di direktori /etc/nvidia-device-plugin/. File unhealthyDevices.json harus menggunakan format JSON berikut.

{
  "index": ["x", "x" ..],
  "uuid": ["xxx", "xxx" ..]
}

Anda dapat menentukan perangkat yang akan diisolasi menggunakan index atau uuid-nya dalam file JSON. Anda hanya perlu menentukan satu pengenal untuk setiap perangkat. Perubahan akan berlaku secara otomatis setelah Anda menyimpan file tersebut.

Setelah konfigurasi selesai, Anda dapat memeriksa jumlah sumber daya nvidia.com/gpu yang dilaporkan oleh node Kubernetes untuk memverifikasi bahwa perangkat telah diisolasi.

Referensi