服务器K8s集群GPU算力Serverless入门:从准备到验证
把GPU算力接入K8s集群并做成Serverless调度,核心是三件事:让节点能识别GPU、让K8s能调度GPU、让任务按需拉起和释放。
下面按零基础可执行的顺序讲清楚。
环境准备与前置检查
开始前确认三件事:集群版本、节点驱动状态、容器运行时类型。
以下命令在任意能执行kubectl的机器上运行即可。
kubectl get nodes -o wide
kubectl version --short
登录GPU节点检查驱动和nvidia-smi是否可用:
nvidia-smi
nvidia-container-cli --version
如果nvidia-smi报command not found,说明驱动未装或未加入PATH,先装驱动再继续。
容器运行时如果是containerd,需确认已配置NVIDIA runtime,否则Pod内看不到GPU。
避坑: 不要在未确认驱动版本的情况下直接装设备插件,插件与驱动版本不匹配是最常见的失败原因。
部署NVIDIA设备插件与GPU节点标记
K8s本身不认识GPU,需要设备插件把节点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 \
--set failOnInitError=false
安装完成后给GPU节点打标签,方便后续调度:
kubectl label nodes accelerator=nvidia-gpu
验证资源是否上报成功:
kubectl describe node | grep -A5 Capacity
看到nvidia.com/gpu: 1(或对应卡数)即表示节点已就绪。
配置Serverless式按需调度
Serverless在这里指不长期占用GPU,任务来了才申请、跑完就释放。
关键在Pod的资源声明和调度约束。
一个最小GPU任务示例:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
restartPolicy: Never
nodeSelector:
accelerator: nvidia-gpu
containers:
- name: cuda
image: nvidia/cuda:12.0-base
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
应用后查看结果:
kubectl apply -f gpu-test.yaml
kubectl logs gpu-test
日志中输出GPU型号和显存信息,说明调度和容器内GPU访问都正常。
跑完删除Pod即释放算力:
kubectl delete pod gpu-test
如果需要更接近Serverless的弹性体验,可结合KEDA或集群自动扩缩容,根据队列长度动态增减GPU节点。
常见报错与排查思路
Pod一直Pending: 先看事件kubectl describe pod ,常见原因是节点没有可用GPU或nodeSelector标签写错。
Pod内nvidia-smi找不到设备: 检查容器运行时是否配置了NVIDIA runtime,
containerd需在/etc/containerd/config.toml中设置default_runtime_name = "nvidia",
改完重启containerd。
设备插件Pod反复重启: 查看kubectl logs -n kube-system ,多为驱动版本与插件不兼容,按官方兼容矩阵调整版本。
避坑要点: 修改containerd配置或重启运行时会影响该节点上所有容器,建议在业务低峰操作并提前备份配置文件。
验证与收尾
完整验证分三步:节点资源上报正确、Pod能调度到GPU节点、容器内能实际调用GPU。
三步都通过后,再接入你的训练或推理任务镜像即可。
如果任务量大,建议给GPU节点单独打污点,只允许声明了GPU资源的Pod调度上去,避免普通业务抢占。
常见疑问
没有GPU节点能用Serverless算力吗? 可以借助云厂商的GPU Serverless服务,但本地K8s集群必须至少有一个真实GPU节点才能做设备上报。
一块GPU能同时跑多个Pod吗? 默认不行,K8s把GPU当整数资源。
需要共享要用MIG或时间片方案,配置更复杂,建议先跑通独占模式。
设备插件装完要重启kubelet吗? 通常不需要,插件以DaemonSet运行,装完自动生效;
若资源未上报,可先检查插件Pod日志再考虑重启kubelet。
整体思路就是:驱动通了、插件上报了、资源声明对了、验证过了,GPU算力就能在K8s里按需调度。