必须通过NVIDIA Device Plugin v0.14.0+启用Time-Slicing实现GPU共享,需满足驱动≥515.65.01、安装nvidia-container-toolkit、配置ConfigMap定义replicas并重启插件Pod,验证节点容量更新为虚拟GPU数后,Pod直接请求nvidia.com/gpu: "1"即可调度。

在Kubernetes集群中让多任务安全共享单张GPU,必须通过NVIDIA Device Plugin启用时间切片(Time-Slicing)能力,否则Pod只能独占整卡、无法实现显存级隔离与并发调度。
确认节点GPU就绪并满足驱动要求
在每台GPU节点上执行 nvidia-smi -L,输出应为类似 GPU 0: NVIDIA RTX A6000 (UUID: GPU-xxxx) 的格式;若报错或无输出,说明驱动未安装或未加载内核模块。
确保驱动版本 ≥ 515.65.01(支持MIG和Time-Slicing),且已安装 【nvidia-container-toolkit】 并配置为containerd或docker的默认runtime;缺少该工具会导致Device Plugin注册成功但容器内看不到设备文件。
验证 /usr/bin/nvidia-container-runtime 存在且可执行,否则后续Allocate调用会静默失败。
部署支持共享的Device Plugin DaemonSet
使用官方v0.14.0+镜像,该版本起支持Time-Slicing配置注入:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
⚠️ 注意:不要直接使用master分支yaml——它可能含未稳定API字段,导致DaemonSet CrashLoopBackOff;v0.14.0是当前生产环境验证最稳的共享就绪版本。
检查Pod是否全部Running:kubectl get pods -n kube-system | grep nvidia-device-plugin;若状态为Pending,大概率是节点缺少nvidia.com/gpu污点容忍,需补加toleration。
启用GPU时间切片(Time-Slicing)
第一步:创建ConfigMap存放切片策略
kubectl create configmap gpu-time-slicing --from-file=time-slicing-config.yaml -n kube-system
其中 time-slicing-config.yaml 内容必须严格如下(replicas值决定单卡可被几个Pod同时申请):
version: v1<br>sharing:<br> timeSlicing:<br> resources:<br> - name: nvidia.com/gpu<br> replicas: 4
第二步:重启Device Plugin Pod,强制其重新读取ConfigMap
kubectl delete pod -n kube-system -l name=nvidia-device-plugin-daemonset
第三步:验证Node资源容量是否更新
kubectl get node <node-name> -o jsonpath='{.status.capacity.nvidia\.com/gpu}' → 应返回 "4" 而非原始物理卡数(如"1");若仍为"1",说明ConfigMap未挂载进容器或插件未识别配置路径。
调度带共享GPU的Pod
方法一:直接请求虚拟GPU单元
在Pod spec中设置 limits: { nvidia.com/gpu: "1" } 即可,无需额外annotation;此时调度器会按ConfigMap定义的replicas数拆分资源配额。
方法二:指定拓扑感知以避免跨NUMA访问延迟
添加nodeAffinity匹配GPU型号与PCIe拓扑标签,例如:
affinity:<br> nodeAffinity:<br> requiredDuringSchedulingIgnoredDuringExecution:<br> nodeSelectorTerms:<br> - matchExpressions:<br> - key: nvidia.com/gpu.product<br> operator: In<br> values: ["RTX-A6000"]
方法三:强制绑定到启用cgpu调度的节点(仅限阿里云ACK等托管集群)
给节点打标:kubectl label node <node> ack.node.gpu.schedule=cgpu,并在Pod中添加 nodeSelector: {ack.node.gpu.schedule: cgpu}。


















