You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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集群未部署设备插件。

修复步骤

  1. 部署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
    
  2. 验证插件运行状态
    确认插件Pod处于Running状态:

    kubectl get pods -n kube-system | grep nvidia-device-plugin
    
  3. 重启K3s服务(单节点集群)
    若插件运行正常但节点仍未上报GPU资源,重启K3s服务:

    sudo systemctl restart k3s
    
  4. 检查节点资源
    重新执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:29:52