扩展资源是什么
CPU 与内存之外的硬件资源(nvidia.com/gpu、amd.com/gpu、以及厂商自定义资源)统称扩展资源:节点上的 Device Plugin 把设备数量上报给 kubelet,节点 Capacity 与 Allocatable 里就出现对应资源名。调度器按整数单位分配,既不支持拆分也不支持超卖,容器申请时必须写整数,requests 与 limits 必须相等。设备真正被挂进容器由 Device Plugin 与容器运行时协作完成,声明资源只是第一步。
基本信息
| 适用平台 | Kubernetes 各版本,扩展资源由 Device Plugin 机制提供 |
|---|---|
| 上报者 | 每个节点上以 DaemonSet 形式运行的 Device Plugin |
| 声明方式 | resources.limits 里写完整资源名,requests 会自动取相同值 |
| 计量单位 | 整数,不支持小数,不可超额分配 |
| 查看入口 | kubectl describe node,Capacity 与 Allocatable 两段 |
典型使用场景
- GPU 训练与推理任务:按卡数申请,多卡任务需整体占用同一节点
- 专用加速设备:FPGA、加解密卡、智能网卡等按设备粒度分配
- 排队管理:以设备为硬约束规划任务队列,避免超出物理数量
- 节点扩容决策:设备不足时提前扩容 GPU 节点而不是加副本
- 故障隔离:单卡异常时定位到具体节点与设备
GPU 申请示例
GPU 申请示例
resources:
limits:
nvidia.com/gpu: 1 # 只写 limits 即可,requests 自动等于 limits
# 同时写 requests 与 limits 时两者必须相等,写 0.5 会被 API 直接拒绝核对节点与插件
核对节点与插件
kubectl describe node gpu-node1 | grep -A8 'Capacity:' | grep -i gpu
kubectl describe node gpu-node1 | grep -i -A3 'Allocatable'
kubectl -n kube-system get pods | grep -i -E 'device|gpu' # 插件是否就绪
kubectl get pod train-x -o jsonpath='{.status.conditions}' # Pending 时看资源不足原因
kubectl get nodes -l accelerator=nvidia -o custom-columns='NODE:.metadata.name,TAINT:.spec.taints'从上报到挂载的几个环节
| 环节 | 观察入口 | 异常表现 |
|---|---|---|
| 设备上报 | describe node 的 Capacity 与 Allocatable | 看不到资源名说明插件未就绪 |
| 调度分配 | Pod 事件与 Pending 原因 | 提示资源不足,长期排队 |
| 设备挂载 | 容器内设备节点与驱动命令 | 设备不可见或驱动版本不匹配 |
| 设备健康 | 厂商工具与插件日志 | 掉卡后新任务无法调度 |
扩展资源只写 limits 就够了;如果同时写 requests 且与 limits 不等,API 会直接拒绝,这类报错信息很明确,不必怀疑调度器。
设备数量是硬上限,没有超卖空间:一个节点有 4 张卡,最多同时跑 4 个各占 1 卡的 Pod,容量规划要按物理设备数而不是按 CPU 余量来算。