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.
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-pluginmengatur variabel lingkunganNVIDIA_VISIBLE_DEVICES=alluntuk pod secara default. Akibatnya, plugin tidak dapat mengakses perangkat GPU setelah node menjalankan perintahsystemctl daemon-reloadatausystemctl 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 doneKeluaran yang diharapkan:
cn-beijing.10.12.XXX.XX cn-beijing.10.13.XXX.XXKeluaran 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
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
Gunakan kubectl di CloudShell untuk menghubungkan ke kluster ACK.
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
Tingkatkan komponen ack-nvidia-device-plugin.
Untuk versi kluster 1.32 dan lebih baru
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel sebelah kiri, pilih .
Di halaman Pengelolaan Komponen, cari komponen ack-nvidia-device-plugin dan klik Upgrade pada kartunya.
Pada kotak dialog yang muncul, klik OK.
Untuk versi kluster dari 1.20 hingga 1.31
Di halaman Clusters, klik nama kluster yang ingin Anda ubah. Di panel navigasi sebelah kiri, pilih .
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.
PentingPertama-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.
Anda akan diarahkan ke antarmuka OOS. Atur Execution Mode menjadi Pause On Failure, lalu klik Next: Set Parameters.
Di halaman Set Parameters, pilih Run Shell Script dan tempel skrip contoh berikut.
CatatanDalam skrip, ubah parameter
RUN_PKG_VERSIONmenjadi 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" fiKlik 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.
Periksa apakah komponen berjalan sebagaimana mestinya.
Jalankan perintah berikut untuk memeriksa apakah Device Plugin berfungsi sebagaimana mestinya pada node GPU.
Hubungkan ke kluster menggunakan kubectl di Workbench atau CloudShell.
Jalankan perintah berikut untuk memeriksa apakah NVIDIA Device Plugin telah dimulai ulang:
kubectl get po -n kube-system -l component=nvidia-device-pluginContoh keluaran:
NAME READY STATUS RESTARTS AGE nvidia-device-plugin-xxxx 1/1 Running 1 1mSetelah 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 doneJika 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
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>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
Di halaman Clusters, temukan kluster yang akan dikelola dan klik namanya. Di panel navigasi sebelah kiri, pilih .
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.
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.
PentingPertama-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.
Di halaman OOS yang muncul, atur Execution Mode menjadi Pause On Failure, lalu klik Next: Set Parameters.
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." fiKlik 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.
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: 1Jika nilai sumber daya tambahan
nvidia.com/gpuyang 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
Jalankan perintah berikut untuk mengubah DaemonSet NVIDIA Device Plugin.
kubectl get ds -n kube-system ack-nvidia-device-pluginTambahkan variabel lingkungan berikut
CHECKPOINT_DEVICE_ID_STRATEGY.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: indexRestart the NVIDIA Device Plugin agar perubahan diterapkan.
Untuk versi kluster dari 1.20 hingga 1.31
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.Dalam file
/etc/kubernetes/manifests/nvidia-device-plugin.yml, tambahkan variabel lingkunganCHECKPOINT_DEVICE_ID_STRATEGYke konfigurasi pod statis.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: indexRestart the NVIDIA Device Plugin agar perubahan diterapkan.
Aktifkan Isolasi Perangkat GPU
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
Jika Anda mengalami masalah dengan node GPU, lihat Troubleshoot GPU nodes dan GPU FAQ.
Untuk informasi selengkapnya tentang penjadwalan GPU bersama, lihat Shared GPU scheduling.