K8s集群GPU算力接入与运维实操:从驱动到调度
在Kubernetes里使用GPU,核心是三件事:节点上要有可用的GPU驱动和容器运行时支持,集群里要装能上报GPU资源的设备插件,然后Pod通过nvidia.com/gpu这类资源名申请算力。
缺任何一环,Pod都会卡在Pending或看不到GPU。
下面按节点准备、插件安装、调度验证、日常运维的顺序讲清楚。
先确认节点和驱动条件
GPU节点一般用Ubuntu或CentOS系,内核和驱动要匹配。
先登录GPU节点执行:
nvidia-smi
能正常输出显卡型号、驱动版本和显存占用,说明驱动可用。
如果提示命令不存在,需要先装驱动;
如果报Failed to initialize NVML,多半是驱动和内核版本不匹配,先解决驱动问题再继续。
容器运行时方面,containerd是当前K8s主流选择。
确认它已启用NVIDIA runtime:
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd
nvidia-ctk来自nvidia-container-toolkit包。
执行后检查/etc/containerd/config.toml里是否出现nvidia runtime配置。
没有这一步,容器里就访问不到GPU设备。
安装NVIDIA设备插件
设备插件负责把节点GPU数量上报给kubelet。
用Helm安装最省事:
helm repo add nvidia https://nvidia.github.io/k8s-device-plugin
helm repo update
helm install nvidia-device-plugin nvidia/nvidia-device-plugin \
--namespace kube-system
装完确认DaemonSet在每个GPU节点都Running:
kubectl get pods -n kube-system | grep nvidia
kubectl describe node | grep nvidia.com/gpu
第二条命令应看到类似nvidia.com/gpu: 2的容量信息。
如果显示0或没有这一行,回到上一步检查驱动和runtime配置。
Pod申请GPU与调度验证
在容器里申请GPU,只需在resources里声明:
resources:
limits:
nvidia.com/gpu: 1
注意GPU资源目前通常只写在limits里,写requests可能不生效或被拒绝。
提交后验证:
kubectl get pod -o jsonpath='{.spec.nodeName}'
kubectl exec -it -- nvidia-smi
Pod能调度到GPU节点,且容器内nvidia-smi能看到显卡,说明整条链路通了。
如果Pod一直Pending,用kubectl describe pod看事件,常见原因是节点GPU已被占满或没有可调度GPU节点。
GPU Ops日常检查与避坑
日常运维建议固定检查这几项:节点nvidia-smi是否正常、设备插件Pod是否Running、kubectl describe node里GPU容量是否与实际一致。
几个高频坑:一是驱动升级后忘了重启containerd,导致容器内GPU不可见;
二是把GPU写进requests而非limits,调度器不识别;
三是多卡节点上设备插件只上报整数卡,不能按显存切分。
显存隔离需要额外方案,别默认K8s会帮你分显存。
另外,GPU节点重启后要确认设备插件自动恢复,必要时给DaemonSet配好容忍度,避免被污点挡在节点外。
常见疑问
为什么节点有GPU但Pod申请不到? 先看kubectl describe node里有没有nvidia.com/gpu容量,没有就是设备插件或驱动问题。
容器内nvidia-smi报错怎么办? 检查containerd是否配置了nvidia runtime,以及nvidia-container-toolkit是否安装完整。
一张卡能给多个Pod用吗? 默认不能,设备插件按整卡分配;
需要共享显存要引入MIG或第三方方案,并确认硬件支持。
整体思路就是驱动通、runtime通、插件通、调度通,四步逐一验证,GPU算力就能稳定接入K8s集群。