iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Cloud Native

K8s上的機器人沙盒系列 第 4

Day 4|部署 NVIDIA GPU Operator(Driver/Runtime/Device Plugin/GFD)

  • 分享至 

  • xImage
  •  

承接 Day 3(Cilium 就緒),今天把 NVIDIA GPU Operator 部署到我們的最小叢集(1 控制 + 1 八 GPU Worker),自動化安裝:Driver、Container Toolkit、Device Plugin、GPU Feature Discovery(GFD),並驗證 nvidia.com/gpu 資源可用,最後用 DCGM Exporter 打出第一份 GPU 監控指標。

為什麼用 GPU Operator?

手動逐台安裝驅動、Container Toolkit、Device Plugin、GFD、DCGM Exporter 不僅耗時,也難保持一致。GPU Operator 以 Helm/Operator 方式把這些元件自動化、可升級、可監控

  • Driver:在節點上安裝與維護 NVIDIA 驅動(可選擇由 Operator 安裝或跳過)
  • NVIDIA Container Toolkit:讓 containerd/CRI-O 能把 GPU 映射進容器
  • Device Plugin:讓 K8s 以 nvidia.com/gpu 形式調度 GPU
  • GFD:自動Labal節點(如型號、算力、MIG 能力)以利排程
  • DCGM Exporter:輸出 GPU Metrics(溫度/功耗/使用率/記憶體等)供 Prometheus 抓取

前置檢查(worker:gpu01

  • Secure Boot 關閉(Kernel module 需能載入)。
  • 節點具備 kernel headers / build-essential(Operator 需要編譯驅動模組)。
  • 沒有安裝衝突的驅動(例如 distro 內建的舊 nvidianouveau 模組仍在)。
  • containerd 已安裝且使用 systemd cgroup(Day 2 已設定)。

安裝步驟(Helm)

在Control Plane cp1 執行,kubectl 指向叢集。

1) 加入 Helm repo

helm repo add nvidia https://nvidia.github.io/gpu-operator
helm repo update

2) 建立命名空間並安裝 GPU Operator

# 建議獨立Name Space
kubectl create namespace gpu-operator || true

# 以預設值安裝(包含 Driver/Toolkit/Device Plugin/GFD/DCGM Exporter)
helm install gpu-operator \
  -n gpu-operator \
  nvidia/gpu-operator

等待幾分鐘讓 Driver DaemonSet 在 gpu01 編譯並載入模組。期間 nvidia-driver-daemonset 會從 Init → Running,Device Plugin 與 GFD 也會陸續 Ready。

3) 確認元件狀態

kubectl -n gpu-operator get pods -o wide
# 看到類似:
# nvidia-operator-validator-xxxxx
# nvidia-driver-daemonset-xxxxx
# nvidia-container-toolkit-daemonset-xxxxx
# nvidia-device-plugin-daemonset-xxxxx
# nvidia-gpu-feature-discovery-xxxxx
# nvidia-dcgm-exporter-xxxxx

驗證 nvidia.com/gpu 可調度

1) 檢查節點資源與標籤

kubectl get nodes gpu01 -o json | jq '.status.allocatable, .metadata.labels'
# 會看到類似:
#   "nvidia.com/gpu": "8"
# 以及由 GFD 自動貼的標籤(例如 GPU 型號、算力、MIG 支援)

2) 起一個 CUDA 測試 Pod

# cuda-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cuda-test
spec:
  restartPolicy: Never
  containers:
  - name: cuda
    image: nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04
    command: ["bash","-lc","nvidia-smi && python - <<'PY'\nimport torch; print('CUDA avail:', torch.cuda.is_available())\nPY"]
    resources:
      limits:
        nvidia.com/gpu: 1
kubectl apply -f cuda-test.yaml
kubectl logs -f pod/cuda-test
# 期待輸出 nvidia-smi 與 CUDA 可用(若你鏡像內有 PyTorch 也會顯示 True)

若想更純粹地驗證 CUDA,可改用 nvidia/cuda:12.4.1-base-ubuntu22.04 並執行 nvidia-smi 或 CUDA Samples。

啟用 DCGM Exporter 與基礎監控(最小示例)

GPU Operator 預設會幫你跑起 DCGM Exporter。先確認 Service:

kubectl -n gpu-operator get svc | grep dcgm

如果你已經有 Prometheus:

  • 直接新增 kubernetes-service-endpoints 的自動發現(Helm 的 kube-state-metrics/prometheus-operator 常見設定),即可抓到 nvidia-dcgm-exporter 指標。
  • 或建立一個簡單的 ServiceMonitor(若使用 Prometheus Operator):
# servicemonitor-dcgm.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: dcgm-exporter
  namespace: gpu-operator
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: nvidia-dcgm-exporter
  namespaceSelector:
    matchNames: [gpu-operator]
  endpoints:
  - port: metrics
    interval: 15s
kubectl apply -f servicemonitor-dcgm.yaml

常見變體(依現況調整)

  1. 已預裝 Driver(不讓 Operator 裝驅動)
helm upgrade --install gpu-operator -n gpu-operator nvidia/gpu-operator \
  --set driver.enabled=false
  1. 已預裝 Driver + Container Toolkit
helm upgrade --install gpu-operator -n gpu-operator nvidia/gpu-operator \
  --set driver.enabled=false \
  --set toolkit.enabled=false
  1. CRIO 或特殊 runtime
  • Operator 也能配置 CRI-O,或以 nvidia-ctk 預先寫好對應設定;請依你實際 runtime 調整。
  1. Time-Slicing(同卡多工作負載)
  • 透過 Device Plugin 的擴充選項開啟 time-slicing,讓多個 Pod 在同一張 GPU 上交錯運行

感想

これって、休日も書かなきゃ行けないの!?ヤバすぎだろう......


上一篇
Day 3|CNI 選型:Cilium vs Calico,並安裝 Cilium(eBPF 與 Hubble 初探)
下一篇
# Day 5|儲存入門:NFS + PersistentVolumeClaim
系列文
K8s上的機器人沙盒8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言