[建置] 安裝 K8s / 排解 GPU pod 處於 pending 狀態 === ###### tags: `K8s / Setup` ###### tags: `Kubernetes`, `k8s`, `setup`, `install` <br> [TOC] <br> ## 所需背景知識 - [[hackmd][建置] 安裝 K8s / 釐清 GPU Operator, NVIDIA Device Plugin, nvidia-container-runtime, containerd 的關係](https://hackmd.io/R44ksCJrQlqBP8IH3PLbwA) <br> ## 討論 ### GPU pod 一直處於 pending - ### Question 安裝 K8s 後, 想要索取 gpu 跑 pod,但 pod 一直處於 pending ``` $ kubectl get pod NAME READY STATUS RESTARTS AGE empty-pod 1/1 Running 0 114m gpu-pod 0/1 Pending 0 4m33s ``` - ### gpt-4o (2025/05/26) > K8s GPU Pod Pending 問題排查指南 當你部署需要 GPU 的 Pod 且它一直處於 `Pending` 狀態,這通常是因為 **Kubernetes 沒有符合條件的節點可以提供 GPU 資源**。 我們可以透過以下步驟來排查這個問題: --- ### ✅ 1. 檢查 Node 是否有 GPU 資源 ``` kubectl describe nodes | grep -A5 "Capacity" ``` 你應該會看到像這樣的輸出: ``` Capacity: nvidia.com/gpu: 1 Allocatable: nvidia.com/gpu: 1 ``` 若沒有 `nvidia.com/gpu` 的項目,代表節點上沒有正確註冊 GPU。 --- ### ✅ 2. 確認 NVIDIA 驅動與 Device Plugin 安裝完成 請確認以下兩項都完成: #### ✅ a. 主機層級已安裝 NVIDIA 驅動 可使用以下指令確認: ``` nvidia-smi ``` 若能正確看到 GPU 使用狀況,代表驅動正常。 #### ✅ b. Kubernetes 安裝了 NVIDIA Device Plugin 確認有部署 NVIDIA device plugin: ``` kubectl get daemonset -n kube-system | grep nvidia ``` 如果沒有看到,可以用以下方式安裝: ``` kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml ``` - 備註:[目前最新版本](https://github.com/NVIDIA/k8s-device-plugin?tab=readme-ov-file#enabling-gpu-support-in-kubernetes) ``` kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.17.1/deployments/static/nvidia-device-plugin.yml ``` > ✅ 確保 `DaemonSet` 跑在有 GPU 的節點上。 --- ### ✅ 3. 確認你的 Pod Spec 有正確請求 GPU 範例如下: ``` resources: limits: nvidia.com/gpu: 1 ``` 可檢查 `kubectl describe pod <pod-name>` 是否有說明排程失敗的原因,例如: ``` 0/3 nodes are available: 3 Insufficient nvidia.com/gpu. ``` --- ### ✅ 4. 查看 Scheduler 為何無法排程 執行以下命令查看為什麼 pod 無法被排程: ``` kubectl describe pod gpu-pod ``` 尋找類似這種字眼: ``` Warning FailedScheduling pod/gpu-pod 0/1 nodes are available: 1 Insufficient nvidia.com/gpu. ``` --- ### 下一步建議 請貼出以下資訊以便更深入分析: 1. ```kubectl describe pod gpu-pod``` 2. ```kubectl describe node <node-name>```(替換為實際節點名稱) 3. ```kubectl get daemonset nvidia-device-plugin-daemonset -n kube-system``` 我可以幫你針對錯誤進一步診斷。 <br> <hr> <br> ### [pod event][FailedScheduling] preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod. - ### Question ``` $ nvidia-smi Mon May 26 18:23:47 2025 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.54.03 Driver Version: 535.54.03 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA GeForce GTX 1080 Ti On | 00000000:02:00.0 Off | N/A | | 27% 27C P8 9W / 250W | 6MiB / 11264MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce GTX 1080 Ti On | 00000000:03:00.0 Off | N/A | | 20% 29C P8 8W / 250W | 6MiB / 11264MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 2 NVIDIA GeForce GTX 1080 Ti On | 00000000:82:00.0 Off | N/A | | 20% 34C P8 8W / 250W | 6MiB / 11264MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 3 NVIDIA GeForce GTX 1080 Ti On | 00000000:83:00.0 Off | N/A | | 20% 31C P8 8W / 250W | 6MiB / 11264MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 2860 G /usr/lib/xorg/Xorg 4MiB | | 1 N/A N/A 2860 G /usr/lib/xorg/Xorg 4MiB | | 2 N/A N/A 2860 G /usr/lib/xorg/Xorg 4MiB | | 3 N/A N/A 2860 G /usr/lib/xorg/Xorg 4MiB | +---------------------------------------------------------------------------------------+ --- $ kubectl get daemonset -n kube-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 152m nvidia-device-plugin-daemonset 1 1 1 1 1 <none> 9m37s --- $ kubectl describe pod gpu-pod Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 3m55s (x27 over 119m) default-scheduler 0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod. ``` - ### gpt-4o (2025/05/26) ### GPU Pod 無法排程(Pending)問題排查與解法 感謝提供詳細資訊!從你給的輸出可以確認幾件事: --- ### ✅ 分析總結 #### 🎯 問題關鍵: ``` 0/1 nodes are available: 1 Insufficient nvidia.com/gpu. ``` 代表你的 Pod 請求了 GPU,但節點沒「報告」有可用的 GPU。 --- ### ✅ 現況檢查 | 項目 | 狀況 | 說明 | |------|------|------| | `nvidia-smi` | ✅ 正常 | 系統偵測到 4 張 GTX 1080 Ti,驅動運作良好 | | `nvidia-device-plugin-daemonset` | ✅ 正常運行中 | 這表示 Kubernetes 能啟用 GPU 功能 | | Pod 狀態 | ❌ `Pending`,GPU 不足 | 表示 scheduler 沒看到任何節點有可分配的 GPU | --- ### 🚨 懷疑原因:Kubelet 尚未啟用 GPU 資源報告 你需要確認 kubelet 是否啟用了正確的 GPU device plugin 支援。 #### 🔍 1. 檢查節點是否匯報 GPU 資源 ``` kubectl describe node <your-node-name> | grep -A5 "Capacity" ``` 看是否有 `nvidia.com/gpu` 這一行,例如: ``` Capacity: cpu: 8 memory: 32789768Ki nvidia.com/gpu: 4 <--- ``` 若 **沒有 `nvidia.com/gpu`**,代表節點雖然有裝 GPU,但 Kubernetes 尚未認出來。 --- ### ✅ 解法 #### ✔️ Step 1: 確認 Kubelet 正確啟動參數 請檢查你的 kubelet 是否加上了以下參數,讓它能認得 device plugin: ``` --feature-gates=DevicePlugins=true ``` 並確保 kubelet 的啟動環境中,存在: ``` --container-runtime=remote \ --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock ``` (如果你用 containerd 或 CRI-O) - 備註:這項資訊沒用 ```bash # example $ ps aux | grep kubelet root 2238894 4.9 0.0 5822864 120220 ? Ssl May26 63:58 \ /usr/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \ --kubeconfig=/etc/kubernetes/kubelet.conf \ --config=/var/lib/kubelet/config.yaml \ --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \ --pod-infra-container-image=registry.k8s.io/pause:3.10 ``` ```bash ps aux | grep kubelet | grep cgroup-driver ``` --- #### ✔️ Step 2: 重啟節點上的 `nvidia-device-plugin` Pod 有時候 device plugin daemonset 沒偵測成功,需要重新部署或重啟: ``` kubectl delete pod -n kube-system -l name=nvidia-device-plugin-ds ``` Kubernetes 會自動重建它。 --- #### ✔️ Step 3: 確認 GPU 變成節點資源 重建後再看一次: ``` kubectl describe node <your-node-name> ``` 確認出現: ``` nvidia.com/gpu: 4 ``` --- ### ✅ 最後:Pod Spec 正確嗎? 再確認你的 pod yaml 是這種格式: ```yaml resources: limits: nvidia.com/gpu: 1 ``` --- 如果你願意,也可以貼上 `gpu-pod` 的 YAML,我幫你驗證是否有誤。或者回傳: ``` kubectl get node -o json | jq '.items[].status.allocatable' ``` 我可以幫你快速看哪邊漏掉。 <br> <hr> <br> ### `$ kubectl describe node stage-kube01` 沒有 `nvidia.com/gpu` 資訊 - ### Question ``` $ kubectl describe node stage-kube01 | grep -A5 "Capacity" Capacity: cpu: 88 ephemeral-storage: 7444130944Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 396204836Ki ``` - ### gpt-4o (2025/05/26) > Kubernetes GPU Pod Pending 問題診斷與解法 你提供的 `kubectl describe node` 資訊中: ``` Capacity: cpu: 88 ephemeral-storage: ... memory: ... ``` ❌ **缺少 `nvidia.com/gpu`** 這就是為什麼 Pod 一直處於 `Pending`,因為 Kubernetes 認為「這個節點沒有 GPU 可分配」。 --- ### ✅ 解決方案 你已經裝好驅動(`nvidia-smi` 正常)、也部署了 `nvidia-device-plugin`,所以目前最有可能的情況是: > 🔧 Device Plugin 沒有正確啟用 / 找不到 GPU --- - ### 🔍 下一步排查:查看 device plugin logs 請執行以下指令查看 logs: ``` kubectl logs -n kube-system -l name=nvidia-device-plugin-ds ``` 你應該會看到關於 plugin 偵測 GPU 的訊息,例如: ``` Starting NVIDIA device plugin Found 4 NVIDIA devices ``` 或是錯誤訊息(如權限、找不到 GPU 等)。 --- - ### 🔍 檢查 /dev/nvidia* 裝置是否存在 登入節點(`stage-kube01`),然後: ``` ls -l /dev/nvidia* ``` 你應該會看到像這樣的輸出: ``` /dev/nvidia0 /dev/nvidia1 /dev/nvidia2 /dev/nvidia3 /dev/nvidiactl /dev/nvidia-uvm ``` 若這些都缺失,device plugin 就無法正確掛載資源。 --- - ### ✅ 修復方案(若 `/dev/nvidia*` 缺失) 你可以試試: ``` sudo nvidia-modprobe -u -c=0 ``` 這會手動載入 GPU 的驅動模組,讓裝置節點出現。 --- - ### ✅ 最後檢查:確認 docker/containerd 有掛載 GPU 裝置 你用的是 containerd 嗎?若是,請確認 `nvidia-container-runtime` 是否正確安裝: ``` nvidia-container-cli info ``` 你應該會看到所有 GPU 被列出。 --- ### 若一切失敗,可以嘗試重建 plugin ``` kubectl delete -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml ``` --- ### 要我幫你檢查 plugin logs 嗎? 請貼上以下指令的輸出,我可以幫你判斷原因: ``` kubectl logs -n kube-system -l name=nvidia-device-plugin-ds ``` 也歡迎你提供: ``` ls -l /dev/nvidia* ``` 這會幫助我準確判斷為何 Kubernetes 看不到 GPU。 <br> <hr> <br> ### nvidia-device-plugin log: No devices found. Waiting indefinitely. - ### Question ``` $ kubectl logs -n kube-system -l name=nvidia-device-plugin-ds }, "imex": {} } I0526 10:13:53.561962 1 main.go:356] Retrieving plugins. E0526 10:13:53.562269 1 factory.go:112] Incompatible strategy detected auto E0526 10:13:53.562291 1 factory.go:113] If this is a GPU node, did you configure the NVIDIA Container Toolkit? E0526 10:13:53.562303 1 factory.go:114] You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites E0526 10:13:53.562316 1 factory.go:115] You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start E0526 10:13:53.562328 1 factory.go:116] If this is not a GPU node, you should set up a toleration or nodeSelector to only deploy this plugin on GPU nodes I0526 10:13:53.562343 1 main.go:381] No devices found. Waiting indefinitely. ``` - ### gpt-4o (2025/05/26) ### 🔥 錯誤關鍵 ``` E factory.go:112] Incompatible strategy detected auto E factory.go:113] If this is a GPU node, did you configure the NVIDIA Container Toolkit? ... I main.go:381] No devices found. Waiting indefinitely. ``` --- ### ❗ 結論 雖然主機有 GPU,但: > **NVIDIA Container Toolkit 未正確安裝或設定好給 containerd 使用**。 這會導致 Kubernetes 裝了 `nvidia-device-plugin`,但 **看不到任何 GPU**。 --- ### ✅ 解決方案:正確安裝並設定 NVIDIA Container Toolkit 你目前有很大機率是使用 **containerd** 作為 container runtime,因此請依照以下步驟操作。 - ### 🛠️ 步驟一:安裝 NVIDIA Container Toolkit 在你的 GPU 節點上執行以下步驟: - ### 1. 安裝 NVIDIA 的 GPG key 和 repo ``` distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list ``` ``` curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add - ``` ``` sudo apt-get update ``` - ### 2. 安裝 NVIDIA Container Toolkit ``` sudo apt-get install -y nvidia-container-toolkit ``` - ### 🛠️ 步驟二:設定 containerd 使用 NVIDIA runtime - ### 1. 編輯 `/etc/containerd/config.toml`: ``` sudo nano /etc/containerd/config.toml ``` 確保你有以下內容(這是關鍵設定): ``` [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] runtime_type = "io.containerd.runc.v2" privileged_without_host_devices = false [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "/usr/bin/nvidia-container-runtime" ``` - ### 2. 然後修改默認 runtime(可選但推薦): ``` [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime_name] nvidia ``` - ### 🛠️ 步驟三:重新啟動 containerd ``` sudo systemctl restart containerd ``` --- ### 🧪 驗證 接著跑這個來檢查: ``` sudo ctr run --rm --gpus 1 docker.io/nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-test nvidia-smi ``` 如果成功看到 `nvidia-smi` 的輸出,表示 containerd + GPU runtime 正常運作! - ### 備註 ```bash $ sudo ctr images list $ sudo ctr images pull docker.io/nvidia/cuda:12.2.0-base-ubuntu20.04 # 查看當前 image 清單 $ sudo ctr images list REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/nvidia/cuda:12.2.0-base-ubuntu20.04 application/vnd.docker.distribution.manifest.list.v2+json sha256:e828de149557f739597a551402f5229d1ed42e6bc4296b4dd9c3b4d3cdd915d9 87.3 MiB linux/amd64,linux/arm64 - # 查看 gpu container 執行 nvidia-smi $ sudo ctr run --rm --gpus 1 docker.io/nvidia/cuda:12.2.0-base-ubuntu20.04 nvidia-test nvidia-smi Tue May 27 07:43:12 2025 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.54.03 Driver Version: 535.54.03 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA GeForce GTX 1080 Ti On | 00000000:03:00.0 Off | N/A | | 20% 31C P8 8W / 250W | 6MiB / 11264MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+ ``` --- ### 🧹 最後:重啟 device plugin ``` kubectl delete pod -n kube-system -l name=nvidia-device-plugin-ds ``` 重啟後它應該會偵測到 GPU,Pod 就能成功排程到節點了! --- 需要的話我也可以幫你檢查 containerd 設定或提供完整 config.toml 範本。是否需要? <br> <hr> <br> ### `$ nvidia-container-cli info` 正常顯示 GPU 資訊 - ### Question ``` $ nvidia-container-cli info NVRM version: 535.54.03 CUDA version: 12.2 Device Index: 0 Device Minor: 0 Model: NVIDIA GeForce GTX 1080 Ti Brand: GeForce GPU UUID: GPU-f9dc5b48-214b-7431-8d67-f73f58eb3316 Bus Location: 00000000:02:00.0 Architecture: 6.1 Device Index: 1 Device Minor: 1 Model: NVIDIA GeForce GTX 1080 Ti Brand: GeForce GPU UUID: GPU-a2453a5f-9719-8c03-20da-961cea94e94d Bus Location: 00000000:03:00.0 Architecture: 6.1 Device Index: 2 Device Minor: 2 Model: NVIDIA GeForce GTX 1080 Ti Brand: GeForce GPU UUID: GPU-94ece2f1-1cb0-db61-cf8a-f3ae57a0c4b7 Bus Location: 00000000:82:00.0 Architecture: 6.1 Device Index: 3 Device Minor: 3 Model: NVIDIA GeForce GTX 1080 Ti Brand: GeForce GPU UUID: GPU-5dacb390-0212-a87a-5805-5797eee4b454 Bus Location: 00000000:83:00.0 Architecture: 6.1 ``` - ### gpt-4o (2025/05/26) > 修復 Kubernetes 無法偵測 GPU 的問題(Containerd + NVIDIA) 你的輸出顯示: ✅ `nvidia-container-cli info` 正常 ➡️ 代表 **NVIDIA Container Toolkit 安裝沒問題**,主機上的 4 張 GPU 都可被正確辨識。 --- ### 🚨 問題仍然是 containerd 沒正確掛上 NVIDIA runtime 這說明 **你主機的 containerd 雖然能用 GPU,** 但: > Kubernetes 的 kubelet 還沒「知道」 containerd 可以跑 GPU。 這通常是因為 **containerd 的設定缺少 `nvidia` runtime 宣告**。 --- ### ✅ 立即修復步驟 - ### 1️⃣ 編輯 `/etc/containerd/config.toml` 執行: ``` sudo nano /etc/containerd/config.toml ``` 加入這段(放在 `[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]` 區塊下): ``` [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] runtime_type = "io.containerd.runc.v2" privileged_without_host_devices = false [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "/usr/bin/nvidia-container-runtime" ``` 這是讓 containerd 知道怎麼用 GPU。 > ⚠️ 注意格式與縮排很重要,Toml 檔案若格式錯誤會導致 containerd 無法啟動。 - ### 2️⃣ (可選)設 `nvidia` 為預設 runtime 若你希望所有 Pod 預設都能使用 GPU(不建議給普通 workload): ``` [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "nvidia" ``` 否則你要在 Pod YAML 中指定: ``` runtimeClassName: nvidia ``` - ### 3️⃣ 重啟 containerd ``` sudo systemctl restart containerd ``` - ### 4️⃣ 重新部署 device plugin ``` kubectl delete pod -n kube-system -l name=nvidia-device-plugin-ds ``` 這會觸發 plugin 重新偵測 GPU。 - ### ✅ 5️⃣ 驗證是否成功 執行: ``` kubectl describe node <your-node-name> | grep -A7 "Capacity" ``` 你應該會看到: ``` nvidia.com/gpu: 4 ``` 然後原本 `Pending` 的 Pod 會自動排程起來。 <br> <hr> <br> ### [總結] Pod 申請 GPU,但狀態長時間為 `Pending` - ### gpt-4o (2025/05/26) ### 🎯 問題現象 Pod 申請 GPU,但狀態長時間為 `Pending`: ``` $ kubectl get pod # gpu-pod 0/1 Pending ``` --- ### ✅ Step 1:Pod 無法排程的錯誤訊息 #### 🟡 Question Pod 為什麼 Pending? #### 🔧 Action 查看事件紀錄: ``` $ kubectl describe pod <pod-name> ``` #### 🧠 發現 ``` 0/1 nodes are available: 1 Insufficient nvidia.com/gpu ``` ➡️ 意即 Scheduler 找不到有 GPU 的節點。 --- ### ✅ Step 2:節點是否真的提供 GPU 資源 #### 🟡 Question 節點是否回報 GPU 給 Kubernetes? #### 🔧 Action ``` $ kubectl describe node <node-name> | grep -A7 Capacity ``` #### 🧠 發現 ``` 沒有 nvidia.com/gpu 欄位 ``` ➡️ Kubernetes 沒看到 GPU(即使主機上有)。 --- ### ✅ Step 3:主機是否有 GPU 可用 #### 🟡 Question 主機本身能偵測到 GPU 嗎? #### 🔧 Action ``` $ nvidia-smi ``` #### 🧠 發現 4 張 NVIDIA GTX 1080 Ti 正常運作中。 --- ### ✅ Step 4:NVIDIA Device Plugin 是否已部署 #### 🟡 Question Kubernetes 是否已部署 GPU device plugin? #### 🔧 Action ``` $ kubectl get daemonset -n kube-system | grep nvidia ``` #### 🧠 發現 `nvidia-device-plugin-daemonset` ✅ 有啟動 --- ### ✅ Step 5:Device Plugin 是否成功找到 GPU #### 🟡 Question plugin 有偵測到 GPU 嗎? #### 🔧 Action ``` $ kubectl logs -n kube-system -l name=nvidia-device-plugin-ds ``` #### 🧠 發現 ``` No devices found. Waiting indefinitely. Incompatible strategy detected auto Did you configure the NVIDIA Container Toolkit? ``` ➡️ plugin 執行了,但 containerd 未正確設定 NVIDIA runtime,導致無法掛載 GPU。 --- ### ✅ Step 6:Container Runtime 是否支援 GPU #### 🟡 Question 主機 containerd 是否正確整合 GPU 支援? #### 🔧 Action 檢查 NVIDIA Container Toolkit CLI: ``` $ nvidia-container-cli info ``` #### 🧠 發現 ✅ 成功偵測所有 GPU。 ➡️ Toolkit 安裝成功,但 containerd 未設定使用它。 --- ### ✅ Step 7:containerd 設定檢查與修復 #### 🟡 Question containerd 是否設定了 `nvidia` runtime? #### 🔧 Action 編輯 `/etc/containerd/config.toml`,加入以下區段: ``` [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] runtime_type = "io.containerd.runc.v2" privileged_without_host_devices = false [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "/usr/bin/nvidia-container-runtime" ``` (如需全站啟用,可設 `default_runtime_name = "nvidia"`) 然後重新啟動: ``` sudo systemctl restart containerd ``` --- ### ✅ Step 8:重啟 device plugin 並驗證 #### 🟡 Question containerd 修好後,plugin 是否能偵測 GPU? #### 🔧 Action ``` kubectl delete pod -n kube-system -l name=nvidia-device-plugin-ds ``` plugin 重啟後,驗證節點資源: ``` kubectl describe node <node-name> | grep -A7 Capacity ``` #### 🧠 預期結果 ``` nvidia.com/gpu: 4 ``` ➡️ 代表 GPU 成功掛載給 Kubernetes,Pod 可排程。 --- ### ✅ Step 9:確認 Pod 是否成功執行 #### 🟡 Question Pod 是否已進入 Running? #### 🔧 Action ``` kubectl get pod ``` #### ✅ 結果 GPU Pod 成功排程並運行。 --- ### ✅ 總結 - GPU Pod Pending 問題處理流程 | 步驟 | 問題點 | 動作 | 工具 | |------|--------|------|------| | 1 | Pod Pending 原因? | `kubectl describe pod` | Scheduler | | 2 | 節點是否有 GPU? | `kubectl describe node` | Node 狀態 | | 3 | 主機是否偵測 GPU? | `nvidia-smi` | 驅動 | | 4 | Plugin 是否安裝? | `kubectl get daemonset` | DaemonSet | | 5 | Plugin 有偵測 GPU 嗎? | `kubectl logs` | Device Plugin | | 6 | Container Toolkit 有裝嗎? | `nvidia-container-cli info` | CLI 工具 | | 7 | containerd 有設定 runtime 嗎? | 編輯 `config.toml` | containerd | | 8 | 重啟 plugin 並驗證 | `kubectl delete pod` & `describe node` | Kubernetes | | 9 | 確認 Pod 執行成功 | `kubectl get pod` | 最終驗證 | <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}