[建置] 安裝 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 %}