服务器K8s集群GPU算力CertificationOps:从节点准备到健康验证
在Kubernetes集群中做GPU算力认证,核心目标是确认节点能识别GPU、调度器能分配GPU资源、容器内能实际调用CUDA并跑出预期算力。
本文从零开始,覆盖节点准备、插件安装、算力验证和常见报错处理,适合刚接触K8s GPU运维的读者。
开始前需要确认三件事
- 集群版本建议1.20以上,支持Device Plugin机制。
- 每个GPU节点已安装与显卡型号匹配的NVIDIA驱动,并且
nvidia-smi能正常输出。 - 节点已安装nvidia-container-toolkit,并配置为Docker或containerd的默认运行时。
如果驱动未装好,后面的步骤都会失败,所以先在每个GPU节点上执行:
nvidia-smi
看到显卡型号、驱动版本和显存信息才算通过。
部署NVIDIA Device Plugin
K8s本身不直接管理GPU,需要Device Plugin把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 nvidia-device-plugin.yml。
部署后检查:
kubectl get pods -n kube-system | grep nvidia
kubectl describe node | grep -A 5 Capacity
在Capacity里应看到nvidia.com/gpu: 1或对应卡数,说明GPU已被kubelet识别。
跑一个算力验证Pod
最直接的方式是用CUDA官方镜像跑一段矩阵计算。创建gpu-test.yaml:
apiVersion: v1
kind: Pod
metadata:
name: gpu-burn-test
spec:
restartPolicy: Never
containers:
- name: cuda
image: nvcr.io/nvidia/cuda:12.2.0-base
command: ["bash","-c"]
args: ["nvidia-smi && echo 'GPU OK'"]
resources:
limits:
nvidia.com/gpu: 1
执行kubectl apply -f gpu-test.yaml,然后查看日志:
kubectl logs gpu-burn-test
如果输出显卡信息和GPU OK,说明调度和运行时链路正常。
要测实际算力,可换成gpu-burn镜像跑负载,观察nvidia-smi中的利用率。
避坑指南:三类高频问题
- Pod一直Pending:先
kubectl describe pod看事件,常见原因是节点没有可分配GPU或Device Plugin未就绪。 - 容器内
nvidia-smi报错:检查节点是否装了nvidia-container-toolkit,并确认容器运行时配置中nvidia运行时已启用。 - 算力明显低于预期:可能是驱动版本与CUDA镜像不匹配,或容器被限制了CPU/内存导致喂不满GPU。
如何确认验证通过
kubectl describe node中GPU资源数量与实际物理卡数一致。- 验证Pod能成功运行并输出GPU信息。
- 在持续负载下,
nvidia-smi的GPU利用率、显存占用和温度在合理范围波动,没有频繁掉卡。
如果以上三点都满足,可以认为该节点的GPU算力认证基本通过。
生产环境建议再补充监控告警和定期巡检。
常见疑问
- 没有GPU的节点会受影响吗?不会,Device Plugin只在有NVIDIA GPU的节点上报资源。
- 能用
kubectl exec进容器手动测吗?可以,但更规范的是用Job或Pod定义资源请求,便于复现。 - 验证Pod一直CrashLoopBackOff怎么办?先看日志,多数是镜像拉取失败或CUDA版本与驱动不兼容。