K3s集群NVIDIA容器运行时GPU检测失败,Pod调度受阻求助
K3s集群NVIDIA GPU资源未识别及分片GPU请求解决方案
问题1:节点未暴露GPU资源导致Pod调度失败
核心原因
你已正确配置containerd的NVIDIA运行时和RuntimeClass,但Kubernetes需要NVIDIA设备插件来发现GPU硬件并将其作为可调度资源上报给集群。缺少该插件时,节点不会向K8s暴露nvidia.com/gpu资源,直接导致Pod因资源不足无法调度。
桌面Ubuntu的GPU被桌面环境占用的概率极低(你已验证Docker可正常运行CUDA程序),核心问题在于K3s集群未部署设备插件。
修复步骤
部署NVIDIA设备插件DaemonSet
创建nvidia-device-plugin.yml文件,内容如下:apiVersion: apps/v1 kind: DaemonSet metadata: name: nvidia-device-plugin-daemonset namespace: kube-system spec: selector: matchLabels: name: nvidia-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: labels: name: nvidia-device-plugin-ds spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - image: nvcr.io/nvidia/k8s-device-plugin:v0.14.0 name: nvidia-device-plugin-ctr securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins执行部署命令:
kubectl apply -f nvidia-device-plugin.yml验证插件运行状态
确认插件Pod处于Running状态:kubectl get pods -n kube-system | grep nvidia-device-plugin重启K3s服务(单节点集群)
若插件运行正常但节点仍未上报GPU资源,重启K3s服务:sudo systemctl restart k3s检查节点资源
重新执行kubectl describe node pop-os,查看Capacity和Allocatable区域是否出现nvidia.com/gpu: 1(对应你的GPU数量)。
问题2:分片GPU请求的实现方案
Kubernetes原生不支持 fractional GPU请求,可通过以下方式实现类似效果:
方案1:NVIDIA MIG(多实例GPU)
适用于支持MIG的GPU(如A100、A30等),将物理GPU分割为多个独立实例,每个实例可作为独立GPU资源调度:
- 启用MIG模式:
sudo nvidia-smi mig -i 0 -e enable(替换0为目标GPU索引) - 创建MIG实例:
sudo nvidia-smi mig -i 0 -cgi <profile-id>(如19对应10GB显存实例) - 确保使用的NVIDIA设备插件版本≥v0.10,K8s会自动识别每个MIG实例为独立GPU资源。
方案2:时间分片调度
利用NVIDIA MPS(多进程服务)实现多容器共享同一GPU:
- 在Pod的环境变量中添加
NVIDIA_MPS_ENABLED=1和NVIDIA_VISIBLE_DEVICES=all - 通过
nvidia-container-runtime配置限制每个容器的GPU时间片占比。
方案3:软限制模拟分片
通过限制容器的GPU显存和使用率实现近似分片:
- 在Pod资源限制中添加
nvidia.com/memory: 512Mi(需设备插件支持该参数) - 在容器内通过
nvidia-smi命令手动限制显存使用(非强制约束)。
内容的提问来源于stack exchange,提问作者Vinay B
相关产品推荐
相关产品推荐

