K8s集群GPU算力调度:从插件安装到多卡分配实操
在Kubernetes集群里调度GPU,本质上不是让Pod直接找到显卡,而是先把GPU注册成节点资源,再由调度器按nvidia.com/gpu资源量分配。
零基础用户只需要抓住一条主线:节点能识别GPU,K8s能看到GPU,Pod能申请到GPU。
下面按这条主线逐步操作,适用于已有K8s集群、新增或已有GPU节点的场景。
先确认节点和运行时是否具备GPU条件
在GPU节点上执行以下命令,确认系统能识别显卡:
nvidia-smi
如果能看到显卡型号、显存和驱动版本,说明驱动正常。
接着确认容器运行时。
K8s默认的containerd或Docker需要把NVIDIA运行时设为默认,否则容器内看不到GPU。
containerd用户检查/etc/containerd/config.toml,确认存在:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
修改后重启containerd:
systemctl restart containerd
Docker用户则确认/etc/docker/daemon.json中default-runtime为nvidia,然后重启Docker。
这一步没做好,后面设备插件会报找不到设备。
安装NVIDIA设备插件并给节点打标
设备插件的作用是把节点上的GPU数量上报给K8s。
官方推荐用DaemonSet方式部署:
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
如果集群无法访问外网,需要先下载YAML再apply。
部署后检查Pod状态:
kubectl get pods -n kube-system -l name=nvidia-device-plugin-ds
看到Running后,给GPU节点打上标签,避免普通节点被误调度:
kubectl label nodes <节点名> accelerator=nvidia-gpu
再查看节点可分配资源:
kubectl describe node <节点名> | grep nvidia.com/gpu
正常应显示类似nvidia.com/gpu: 2,数字为节点GPU数量。
若显示为0或不存在,优先回查驱动、运行时和设备插件日志。
让Pod申请GPU并验证调度结果
创建测试Pod,明确申请1块GPU:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
nodeSelector:
accelerator: nvidia-gpu
containers:
- name: cuda
image: nvidia/cuda:12.2.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
应用后查看日志:
kubectl logs gpu-test
如果输出显卡信息,说明调度和容器访问都成功。
需要注意,GPU资源只能写在limits里,不能只写requests。
多个Pod竞争同一块GPU时,K8s会按资源量排队,不会自动共享。
常见调度失败和容易踩的坑
Pod一直Pending,先用kubectl describe pod看事件。
常见原因包括:节点没有nvidia.com/gpu资源、节点标签不匹配、GPU已被占满、镜像拉取失败。
设备插件Pod反复重启,多半是运行时配置错误或驱动版本不兼容。
查看日志:
kubectl logs -n kube-system <设备插件Pod名>
另外,不要在同一个Pod里把GPU资源拆给多个容器,K8s不支持这种分配方式。
如果业务需要共享GPU,需要额外方案,不属于默认调度能力。
效果验证和日常检查
完成配置后,建议固定做三项检查:节点nvidia-smi正常、节点资源里能看到GPU数量、测试Pod能输出显卡信息。
日常巡检可以用:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\\.com/gpu
观察GPU资源是否被正确上报和释放。
删除测试Pod后,资源应回到可分配状态。
总结:服务器K8s集群GPU算力调度的关键顺序是驱动与运行时、设备插件、节点标签、Pod资源申请、结果验证。
任何一步缺失,调度都会失败。
先在单节点跑通,再扩展到多节点,排错成本最低。