K8s集群GPU与vGPU配置:从设备插件到虚拟化切分
在Kubernetes集群里使用GPU,核心就两件事:让节点识别到GPU,让Pod能申请到GPU。
物理GPU靠NVIDIA驱动加设备插件;
vGPU则多一层宿主机虚拟化切分,需要vGPU Manager和Guest驱动配合。
下面按实际部署顺序讲清楚。
先确认节点和驱动状态
登录每台GPU节点,确认显卡型号和系统版本:
lspci | grep -i nvidia
uname -r
cat /etc/os-release
安装与内核匹配的NVIDIA驱动。
生产环境建议用官方runfile或系统包管理器,安装后执行:
nvidia-smi
能看到显卡型号、显存和驱动版本即算通过。
如果提示NVIDIA-SMI has failed,先检查是否禁用了nouveau:
echo -e "blacklist nouveau\noptions nouveau modeset=0" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u # Ubuntu/Debian
sudo dracut --force # CentOS/RHEL
重启后再次验证。驱动没装好之前,后面所有步骤都无法进行。
部署NVIDIA设备插件
K8s本身不识别GPU,需要设备插件把GPU资源上报给kubelet。
使用官方DaemonSet:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.5/nvidia-device-plugin.yml
如果节点无法访问外网,先下载yaml再kubectl apply -f。
部署后检查:
kubectl get pods -n kube-system | grep nvidia
kubectl describe node <节点名> | grep nvidia.com/gpu
在Capacity和Allocatable里看到nvidia.com/gpu: 1之类的数字,说明节点GPU已可被调度。
数字为0或没有该字段,优先看插件Pod日志:
kubectl logs -n kube-system
常见原因是驱动版本与插件不兼容,或节点存在nvidia.com/gpu污点未容忍。
vGPU场景的额外配置
vGPU是把一块物理GPU切成多个虚拟GPU给不同Pod使用,需要宿主机安装vGPU Manager,虚拟机或容器内安装对应的Guest驱动。
在宿主机上安装vGPU Manager后,确认切分模式:
nvidia-smi vgpu -q
该命令会列出当前GPU支持的vGPU类型和可切分数量。
创建vGPU实例通常由上层虚拟化平台完成,K8s侧仍通过设备插件上报。注意:vGPU切分规格必须在宿主机层面预先配置好,K8s无法动态改变切分方案。
如果使用NVIDIA vGPU且需要K8s调度,
设备插件需以--fail-on-init-error=false方式启动,
并确保/dev/nvidia-vgpu*设备节点在容器内可见。
跑一个Pod验证GPU可用
写一个最小测试Pod:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda
image: nvcr.io/nvidia/cuda:12.2.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: Never
执行:
kubectl apply -f gpu-test.yaml
kubectl logs gpu-test
日志里出现显卡信息,说明调度和驱动链路全部打通。
如果Pod一直Pending,用kubectl describe pod gpu-test看Events,常见是Insufficient nvidia.com/gpu,说明节点资源未上报或已被占满。
容易踩的坑
- 驱动版本不匹配:宿主机驱动、设备插件、CUDA镜像三者版本要兼容,建议先查NVIDIA官方兼容矩阵再动手。
- 忘记加limits:K8s里GPU只能通过
limits申请,写在requests里无效。 - 多节点驱动不一致:集群里每台GPU节点驱动版本尽量统一,否则调度到不同节点行为可能不同。
- vGPU授权问题:部分vGPU模式需要License服务器,授权失效会导致GPU不可用,排查时先确认
nvidia-smi输出是否正常。 - 容器运行时配置:使用containerd时需确保配置了NVIDIA runtime,否则设备插件无法挂载设备。
怎么确认真的配好了
三个检查点全部通过才算完成:节点kubectl describe node能看到GPU资源数量;
测试Pod能正常输出nvidia-smi结果;
连续调度多个GPU Pod时资源计数正确递减。
任何一步不通过,按上面的日志和Events逐层排查,不要跳过驱动直接查K8s。