L1.9 GPU Operator 与 Device Plugin 部署
三维坐标
layer: L1(算力与编排)|level: Senior|pillar: 硬件架构L1.4 讲了 device plugin → kubelet → 调度器链路;本章给出落地清单:如何在 K8s 集群上用 GPU Operator 自动装驱动、container toolkit、device plugin、DCGM,并验收
nvidia.com/gpu资源可见。读完你应当能回答:「一台裸金属 GPU 节点,到『Pod 里能跑nvidia-smi』之间隔着哪几层,每层坏了长什么样」。
学习目标
- 前置知识:读过 L1.7 K8s 核心对象 与 L1.4 调度原理;集群已有 K8s 1.28+(截至 2026 年中稳定版为 v1.36)。无需写过 Operator。
- 学完产出:① 能列出 GPU Operator 管理的 6 大组件及其依赖顺序,并说清「为什么 driver 必须先于 toolkit、toolkit 必须先于 device plugin」;② 能解释 device plugin 的
ListAndWatch如何把 GPU 上报为nvidia.com/gpu,以及掉卡时 healthy → unhealthy 的传播路径;③ 能完成 Helm 安装 +gpu-feature-discovery节点标签验收;④ 能提交一个resources.limits.nvidia.com/gpu: 1的测试 Pod 并进入容器跑nvidia-smi;⑤ 知道 MIG 模式下资源名变为nvidia.com/mig-1g.5gb等切片名,并能对一个推理业务做「整卡 / MIG / time-slicing」三选一的容量决策。 - 阅读姿势:几百张 GPU 节点手工装驱动是运维事故温床——GPU Operator 把「节点 GPU 就绪」变成 GitOps 可声明的状态。盯住一条主线:GPU 在 K8s 里不是「插上就能用」的一等公民,而是靠一条脆弱的组件链条「翻译」成可调度资源的;本章所有内容都在回答「这条链条怎么搭、怎么验、断在哪」。
背景与现状
裸金属 GPU 节点要上 K8s,传统手工步骤:
- 装 NVIDIA 驱动(版本与 CUDA 用户态匹配)
- 装
nvidia-container-toolkit(让 runtime 挂/dev/nvidia*) - 部署
nvidia-device-pluginDaemonSet(向 kubelet 注册扩展资 源) - (可选)DCGM Exporter、MIG Manager、GPU Feature Discovery
GPU Operator 用一组 CRD + Operator 控制器自动编排上述步骤,并支持驱动容器化(driver container)以便与 host kernel 解耦升级。
一个真实感的业务症状:某团队周五扩容了 8 台新 GPU 节点,周一发现训练任务全部 Pending。kubectl describe pod 显示 0/8 nodes are available: 8 Insufficient nvidia.com/gpu——节点明明插着卡,调度器却「看不见」GPU。逐层排查:nvidia-smi 在节点上报 command not found(驱动没装)→ 追到 GPU Operator 的 driver DaemonSet 在新节点上 CrashLoopBackOff → 日志显示新节点镜像用了更新的内核版本,driver 容器仓库里没有匹配该 kernel 的预编译驱动镜像。这个案例浓缩了本章的核心认知:nvidia.com/gpu 这个数字是一条组件链条层层翻译出来的,链条上任何一环断掉,表象都是同一个「Insufficient nvidia.com/gpu」——不懂链条就只能瞎猜,懂链条则五分钟定位。
📅 时效口径(截至 2026 年中):K8s 稳定版为 v1.36;DRA(Dynamic Resource Allocation)已于 v1.34(2025-08)GA,正逐步接替「整数 GPU 计数」的 device plugin 模型,但生产环境仍以 device plugin + GPU Operator 为绝对主流,DRA 适合表达 MIG/拓扑/MPS 等细粒度需求;NVIDIA GPU Operator 持续活跃迭代(驱动预编译镜像、DRA driver 整合等 roadmap 项以官方 release notes 为准)。本章命令以 GPU Operator 24.x~25.x 时代的稳定接口为基线,长期有效。