K8s集群GPU驱动升级:从节点准备到Pod验证
在Kubernetes集群中升级GPU驱动,核心操作其实发生在每个GPU节点上:先把节点从调度中摘除,停掉占用GPU的Pod,再安装新驱动并重启,最后确认device-plugin重新上报资源、Pod能正常申请GPU。
下面按这个顺序展开。
先分清要升级的是哪一层
GPU节点上通常有三层东西,升级前必须分清,否则容易白忙一场:
- 内核态驱动(NVIDIA Driver):决定GPU能否被操作系统识别,
nvidia-smi能否正常输出。 - 用户态库(CUDA / cuDNN 等):训练框架依赖,一般打包在容器镜像里,不一定要动宿主机。
- Kubernetes侧组件(NVIDIA device-plugin、GPU Operator):负责把节点上的GPU数量上报给kubelet。
本文主要讲宿主机内核态驱动的升级。
如果你用的是NVIDIA GPU Operator,驱动可能由Operator以容器方式管理,那就应该改Operator配置而不是手动装,这一点在动手前务必确认。
升级前的准备与节点隔离
动手前先记录现状,方便升级后对比:
nvidia-smi
kubectl get nodes -o wide
kubectl describe node | grep -A5 nvidia.com/gpu
确认当前驱动版本、GPU型号、节点上正在运行的GPU Pod,以及集群里注册的GPU资源数量。
升级驱动需要重启节点,所以要把节点标记为不可调度并驱逐业务Pod:
kubectl cordon
kubectl drain --ignore-daemonsets --delete-emptydir-data
cordon只是禁止新Pod调度上来,drain才会驱逐已有Pod。
如果节点上跑的是训练任务,务必先和业务确认可以中断,或者提前把任务迁移到其他GPU节点。
安装新驱动与版本匹配
在目标节点上停掉相关服务,卸载旧驱动(如果是从.run包安装的):
sudo systemctl stop kubelet
sudo /usr/bin/nvidia-uninstall # 视安装方式而定
如果原驱动是包管理器安装的,用对应的卸载命令,不要混用两种安装方式,否则容易出现库文件冲突。
安装新驱动时,驱动版本要和CUDA版本、框架版本匹配。
比如某些较新的框架对驱动最低版本有要求,升级前查一下框架的发布说明。
安装示例:
sudo sh NVIDIA-Linux-x86_64-.run --silent --dkms
加上--dkms可以避免内核更新后驱动失效。
安装完成后重启节点:
sudo reboot
重启后先确认驱动本身没问题,再启动kubelet:
nvidia-smi
sudo systemctl start kubelet
让K8s重新识别GPU资源
节点重启后,device-plugin通常以DaemonSet形式运行,会自动重新注册GPU。
取消节点隔离并观察:
kubectl uncordon
kubectl describe node | grep -A5 nvidia.com/gpu
如果GPU数量显示为0或没有nvidia.com/gpu字段,先检查device-plugin的Pod日志:
kubectl get pods -n kube-system | grep nvidia
kubectl logs -n kube-system
常见原因是驱动版本和device-plugin版本不兼容,或者驱动安装后nvidia-smi本身就不正常。
验证Pod能正常调用GPU
资源上报正常后,用一个简单Pod验证:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda
image: nvidia/cuda:12.4.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
日志里能看到GPU信息,说明驱动、device-plugin、Pod调用这条链路都通了。
几个容易踩的坑
- 只升级了驱动没升级容器镜像里的CUDA:如果框架对CUDA版本敏感,宿主机驱动升级后镜像里的CUDA可能反而不兼容,需要同步更新镜像。
- drain时漏了DaemonSet:不加
--ignore-daemonsets会卡住,因为DaemonSet Pod无法被驱逐。 - 多节点升级没有分批:建议先升级一个节点验证,再滚动升级其他节点,避免全部GPU同时不可用。
- 忽略了内核版本:如果节点内核也升级过,旧驱动可能加载失败,需要重新编译或使用DKMS。
常见疑问
升级驱动一定要重启服务器吗?
大多数情况下需要。
内核态驱动和内核模块绑定,加载新模块通常要重启才能干净生效。
少数场景可以卸载旧模块再加载新模块,但稳定性不如重启,生产环境建议按重启处理。
GPU Operator环境下还能手动装驱动吗?
不建议。
手动装会和Operator管理的驱动冲突,应该通过修改Operator的配置来指定驱动版本,让Operator负责分发和安装。
升级后Pod报no NVIDIA devices found怎么办?
先确认宿主机nvidia-smi正常,再检查device-plugin是否Running,最后看Pod是否被调度到了有GPU的节点上。
三处逐一排查,基本能定位到具体环节。
按上面的顺序执行,服务器K8s集群GPU驱动升级的风险可控。
如果集群规模较大,建议先在测试节点走一遍完整流程,确认业务镜像和新驱动兼容后再推到生产节点。