要讓?Kubernetes (K8s) 集群?使用?GPU,并且節點是?KVM 虛擬化?出來的,需要確保以下幾點:
-
KVM 虛擬機透傳 GPU(PCIe Passthrough)
-
宿主機和 K8s 節點正確安裝 NVIDIA 驅動
-
K8s 集群安裝?
nvidia-device-plugin
-
Pod 配置 GPU 資源請求
1. KVM 虛擬機透傳 GPU(PCIe Passthrough)
要讓 KVM 虛擬機直接訪問 GPU,必須啟用?PCIe Passthrough(VFIO 直通)。
步驟 1:宿主機啟用 IOMMU
編輯?/etc/default/grub
,修改?GRUB_CMDLINE_LINUX
:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt" # Intel CPU
# 或
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt" # AMD CPU
更新 GRUB 并重啟:
sudo update-grub
sudo reboot
驗證 IOMMU 是否啟用:
dmesg | grep -i iommu
# 應看到類似輸出:
# DMAR: IOMMU enabled
步驟 2:屏蔽宿主機 GPU 驅動
echo "options vfio-pci ids=10de:13c2,10de:0fbb" | sudo tee /etc/modprobe.d/vfio.conf # 替換 `ids` 為你的 GPU PCI ID(用 `lspci -nn | grep NVIDIA` 查)
echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio-pci.conf
sudo update-initramfs -u
sudo reboot
驗證 GPU 是否綁定到?vfio-pci
:
lspci -nnk -d 10de:
# 應顯示 `Kernel driver in use: vfio-pci`
步驟 3:KVM 虛擬機配置 GPU 直通
使用?virt-manager
?或?virsh
?給虛擬機添加 PCI 設備:
virsh edit <vm-name>
添加:
<hostdev mode='subsystem' type='pci' managed='yes'><source><address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/></source>
</hostdev>
(替換?bus/slot/function
?為?lspci
?查到的 GPU PCI 地址)
2. K8s 節點安裝 NVIDIA 驅動
在?每個 K8s 節點(包括 KVM 虛擬機)?上安裝 NVIDIA 驅動:
# Ubuntu/Debian
sudo apt install -y nvidia-driver-535 nvidia-dkms-535 # 替換為適合的驅動版本
sudo reboot# 驗證
nvidia-smi
如果?nvidia-smi
?無輸出,檢查:
-
KVM 直通是否成功(
lspci -nnk | grep NVIDIA
) -
驅動是否正確安裝(
dkms status
)
3. K8s 集群安裝?nvidia-device-plugin
方法 1:使用 Helm(推薦)
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install --generate-name nvidia/nvidia-device-plugin
方法 2:直接部署 DaemonSet
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml
檢查是否正常運行:
kubectl get pods -n kube-system | grep nvidia
kubectl describe node <node-name> | grep nvidia.com/gpu
4. 在 Pod 中使用 GPU
在 Pod 的?resources.requests
?中申請 GPU:
apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: cuda-containerimage: nvidia/cuda:12.2.0-base-ubuntu22.04command: ["sleep", "infinity"]resources:limits:nvidia.com/gpu: 1 # 申請 1 個 GPU
部署并驗證:
kubectl apply -f gpu-pod.yaml
kubectl exec -it gpu-pod -- nvidia-smi
5. 驗證 K8s GPU 支持
檢查節點 GPU 資源:
kubectl describe node <node-name> | grep -A 10 "Capacity"
輸出應包含:
Capacity:nvidia.com/gpu: 1
Allocatable:nvidia.com/gpu: 1
常見問題
Q1:?nvidia-device-plugin
?Pod CrashLoopBackOff
-
檢查 KVM 直通是否成功(
nvidia-smi
?是否能在虛擬機內運行)。 -
檢查?
kubectl logs <nvidia-device-plugin-pod>
?是否有錯誤。
Q2: Pod 無法調度(0/1 nodes are available: 1 Insufficient nvidia.com/gpu
)
-
確認節點有 GPU(
kubectl describe node
)。 -
檢查?
nvidia-device-plugin
?是否正常運行。
Q3: KVM 虛擬機無法識別 GPU
-
檢查?
lspci -nn | grep NVIDIA
?是否顯示 GPU。 -
確保?
vfio-pci
?正確綁定(dmesg | grep vfio
)。
總結
步驟 | 操作 |
---|---|
1. KVM GPU 直通 | 啟用 IOMMU +?vfio-pci |
2. 節點安裝驅動 | nvidia-driver ?+?nvidia-smi ?驗證 |
3. K8s 安裝插件 | nvidia-device-plugin |
4. Pod 申請 GPU | resources.limits: nvidia.com/gpu: 1 |
如果你的 KVM 虛擬機成功識別 GPU,并且 K8s 節點能運行?nvidia-smi
,那么 K8s 集群就可以調度 GPU 任務!