NVKE 为裸金属 GPU Kubernetes 提供集中式管理平面,统一处理节点初始化、集群配置、节点接入和生命周期运维。它不是一套新的 GPU 调度器,也不替代 NVIDIA 驱动、容器运行时或 Kubernetes 调度器。
NVKE 近期进入 GitHub 趋势榜,仓库将其定位为“面向裸金属 GPU Kubernetes 的管理平面”。它受到关注,与裸金属 AI 基础设施从依赖脚本和人工经验转向可重复交付、集中协调和持续运维的工程化模式有关。本文重点回答三个问题:NVKE 到底管理什么,裸金属节点怎样接入并变成可调度的 GPU 集群,以及生产环境如何定位故障、扩容和升级。
NVKE 的管理平面边界在哪里?
从仓库公开的架构、接口和部署组织方式看,NVKE 的管理链路可分为四层:管理入口负责接收目标集群和节点的期望配置;控制与状态协调层负责持续比较期望状态与实际状态,并推进集群生命周期;节点侧执行部分负责初始化、配置、接入和状态上报;最终交付的是仍遵循 Kubernetes API、控制器和调度机制的受管集群。
Kubernetes 本身提供可扩展、声明式和可移植的工作负载管理能力,NVKE 沿用这些机制,没有另建一套面向 AI 工作负载的 API[4]。因此,NVKE 管理的是“如何形成并持续运行一个 GPU Kubernetes 集群”,容器管理仍由 Kubernetes 承担。
各组件的职责边界如下:
| 组件 | 主要职责 | 与 NVKE 的边界 |
|---|---|---|
| NVKE | 裸金属 GPU 集群的集中交付、配置协调和生命周期管理 | 不负责容器内 GPU 计算,也不实现新的调度算法 |
| Kubernetes 控制面与 kube-scheduler | API、状态管理、工作负载调度和控制器循环 | 属于受管集群,是 NVKE 管理和交付的对象 |
| NVIDIA Device Plugin | 发现 GPU,并向 kubelet 注册 nvidia.com/gpu 扩展资源 |
负责设备注册,不负责创建整个集群 |
| GPU Feature Discovery | 生成 GPU 型号、显存和拓扑等节点标签 | 拓扑信息只有被调度器使用后才会影响放置结果 |
| GPU Operator | 管理驱动、容器工具和相关节点组件的生命周期 | 可以自动化节点侧 GPU 栈,但不是 NVKE 的集群入口 |
| DCGM Exporter | 采集 GPU 利用率、显存、温度等监控指标 | 提供数据,不负责调度或控制 |
| KAI Scheduler | 面向大规模 AI 工作负载的拓扑感知调度方案 | 是可独立引入的调度器,不应视为 NVKE 内置组件 |
| 驱动与 NVIDIA 容器运行时 | 让容器访问 GPU,并提供 CUDA 等运行环境 | 属于 GPU 数据面,需要与节点内核和容器镜像匹配 |
标准的 GPU 调度链路通常是:工作节点运行 NVIDIA Device Plugin,插件向 kubelet 注册 nvidia.com/gpu,kube-scheduler 再依据扩展资源进行分配。NVKE 可以负责编排这条链路的安装、接入和持续检查,但不会改变 Device Plugin 的基本职责。
进入 GitHub 趋势榜代表开发者关注度上升,却不能证明其 API、升级机制或高可用方案已经经过长期生产验证。尤其不能因为 NVKE 已经部署,就默认 MIG、时间切片、拓扑调度和监控都已启用;这些能力分别取决于设备模式、节点插件、标签生产链路、调度器以及监控组件是否真正配置到位。
从裸金属到 GPU 可调度,部署链路如何落地?
裸金属 GPU 集群的前置条件比普通 Kubernetes 节点更多。至少需要检查以下几类事项:
- GPU 硬件、主板和 PCIe 拓扑,以及与目标节点操作系统匹配的 NVIDIA 驱动。
- 节点访问方式,包括仓库部署清单要求的认证信息和密钥。
- 管理平面到工作节点、镜像仓库、DNS 和时间同步服务的网络。
- 节点 kubelet、容器运行时、CNI、集群 CA 以及节点加入所需的证书材料。
- 容器镜像仓库地址、认证信息和私有仓库 CA。
- NVKE 自身配置、凭据以及部署清单要求的后端或持久化目录。
通用 GPU 接入教程通常把 NVIDIA 驱动、CUDA、nvidia-docker 2、k8s-device-plugin 和 GPU 计算容器验证串成一条链路。这条链路有助于理解 GPU 数据面,但其中的 PPA、镜像版本和软件包名称都依赖具体环境,不能直接改写成 NVKE 官方安装命令。实际部署应分别确认宿主机驱动、容器运行时和容器内 CUDA Runtime 的兼容关系;宿主机安装了某个 CUDA Toolkit 版本,也不意味着容器镜像中的 CUDA Runtime 必然与其一致。
部署时应先固定版本,不直接执行仓库主分支的清单:
git clone https://github.com/dsx-ai-factory/nvke.git
cd nvke
git checkout <release-tag>
选定 release 后,应使用该版本 README 和部署清单所定义的方式安装管理平面。管理平面适合部署在与 GPU worker 分离的管理环境中,并应先完成配置、认证 Secret、外部后端或持久化目录等依赖。随后检查管理服务是否正常启动、控制组件是否持续完成状态协调,以及节点侧执行组件能否连接管理入口。这里应依据该版本公开的健康检查方式和日志进行判断,不要依赖某个未经保证的固定端口或内部服务名。
第二步是声明目标集群和节点。需要明确节点地址、控制面或 worker 角色、GPU 型号、网络配置、认证信息以及节点加入顺序。裸金属节点通常先完成系统初始化和远程连接,再下发集群配置、证书和网络参数,最后加入 Kubernetes。单节点验证阶段可以先打通完整链路;扩展到多节点时,则需要额外验证管理平面到所有节点的连通性、正反向 DNS、时间同步、镜像仓库访问和证书信任。
第三步才是 GPU 资源注册。每个符合条件的 worker 都需要能够运行 NVIDIA 容器运行时和 Device Plugin。宿主机上的 nvidia-smi 正常,只能证明驱动和 GPU 本身可见;只有 Device Plugin 成功向 kubelet 注册资源后,调度器才能感知 GPU 数量:
kubectl get nodes -o wide
kubectl get nodes -o json | jq -r '.items[] | [.metadata.name, (.status.allocatable["nvidia.com/gpu"] // "0")] | @tsv'
kubectl -n kube-system get pods -o wide | grep nvidia-device-plugin
kubectl get events -A --sort-by=.lastTimestamp
如果节点可分配资源中没有 nvidia.com/gpu,应先检查宿主机驱动、容器运行时和 Device Plugin,而不是反复重建业务 Pod。插件正常但资源数量与物理卡数不一致时,再检查设备可见性、MIG 配置以及插件实际采用的资源模型。
第四步是提交实际 GPU 工作负载。下面的清单用于验证请求资源、调度、镜像启动和 GPU 枚举链路;镜像 tag 只是示例,生产环境应按驱动与 CUDA 兼容矩阵选择:
apiVersion: v1
kind: Pod
metadata:
name: gpu-check
spec:
restartPolicy: Never
containers:
- name: gpu-check
image: nvcr.io/nvidia/cuda:12.0-base
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
kubectl apply -f gpu-check.yaml
kubectl get pod gpu-check -o wide
kubectl logs gpu-check
kubectl describe pod gpu-check
验收不应止于 Pod 变成 Running。日志中的 nvidia-smi 需要正常枚举 GPU,Pod 事件中不应出现调度或挂载异常。多节点环境还应提交多个单 GPU Pod,确认它们能够落到预期节点;随后模拟节点故障,检查工作负载是否迁移,以及不可调度节点是否会持续占用容量。
任何环节失败,都应在对应层级排查:管理入口不可用时检查管理平面;节点执行组件未就绪时检查配置分发、认证和时钟;节点 NotReady 时检查 kubelet、CNI 和证书;GPU 资源为零时检查驱动、运行时和 Device Plugin;Pod Pending 时检查资源数量、污点、亲和性、配额和持久卷卷;镜像启动后再检查 CUDA 与驱动兼容性。这样可以避免把所有问题都归因于 GPU。
上线后如何观测、排障与扩容?
生产环境应按“管理平面状态—Kubernetes 节点—GPU 设备—工作负载”四级顺序定位问题。第一,管理平面关注进程健康、控制循环、状态后端连接和节点上报;第二,Kubernetes 层关注 Node 条件、kubelet、CNI 和事件;第三,GPU 层关注宿主机 nvidia-smi、Device Plugin 日志和设备模式;第四,工作负载层关注调度事件、镜像启动、容器日志和实际 CUDA 输出。DCGM Exporter 可以补充设备指标,但它位于观测链路中,不参与控制决策。
常见症状可以按下面的顺序处理:
| 症状 | 优先检查 | 判断重点 |
|---|---|---|
| 管理接口无响应 | 管理服务、TLS、认证和后端连接 | 先确认管理平面自身是否健康,再看 worker |
| 控制器或节点执行组件未就绪 | 配置、Secret、证书、时钟和镜像拉取 | 区分“未收到配置”和“收到后执行失败” |
| 节点长期 NotReady | 节点日志、kubelet、CNI、磁盘和证书 | 确认故障发生在加入集群阶段还是 GPU 阶段 |
nvidia.com/gpu 数量为零 |
宿主机 nvidia-smi、容器运行时、Device Plugin |
驱动可见不等于资源已经注册 |
| Pod 长时间 Pending | 节点可分配资源、污点、亲和性、配额和 PVC | 不要把资源不足与运行时错误混为一谈 |
| 容器出现 CUDA 或驱动错误 | 宿主机驱动、容器运行时和镜像 CUDA 版本 | 对照 NVIDIA 兼容矩阵检查 |
| 镜像拉取或证书异常 | DNS、仓库 CA、认证 Secret 和 containerd 配置 | 此类错误通常不属于 GPU 调度问题 |
资源运营也不能只看 GPU 利用率。物理卡数、已分配资源、实际利用率和空闲容量是四个不同指标。一个节点可能已经分配了全部 GPU,却只运行了少量任务;另一组空闲卡可能因型号、显存或拓扑不匹配而无法满足工作负载。因此,容量表至少应记录节点、物理 GPU、插件暴露的可分配资源、已分配量、实际使用量、型号及拓扑标签。
整卡、MIG 和时间切片需要分别核验。整卡场景直接检查 nvidia.com/gpu 数量;MIG 场景应同时检查设备模式、MIG profile、插件配置和资源名称,必要时在节点执行:
nvidia-smi mig -lg
时间切片则需要核对 Device Plugin 的相应配置;配置后的可分配份额可能多于物理卡数,因此资源计数本身不能代替并发和性能验证。拓扑调度还要确认 GPU Feature Discovery 已生成 nvidia.com/gpu.product、nvidia.com/gpu.memory、nvidia.com/gpu.topology 等标签,并确认实际使用的调度器会消费这些标签。对于需要队列、优先级,或需要面向数千节点进行拓扑调度的环境,KAI Scheduler 可作为独立方案评估,不应把它列进 NVKE 的默认能力清单。
租户隔离通常仍要借助 Kubernetes 的 ResourceQuota、LimitRange、命名空间和 RBAC。NVKE 可以改善集群交付和节点生命周期管理,但不能据此认为它已经提供细粒度租户计费或配额系统。生产环境还要准备节点维护流程:
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets
排空前应确认守护进程和工作负载重建策略,并评估本地数据风险。节点重启后,还要检查驱动、容器运行时、Device Plugin 和 GPU 资源是否重新注册,而不是只看 Kubernetes Node 恢复为 Ready。
升级应建立完整版本矩阵,至少覆盖 NVKE、Kubernetes、GPU Operator、Device Plugin、容器运行时和 CNI。升级前备份管理配置、渲染后的部署清单、集群状态以及密钥和证书;随后在测试或小规模集群验证兼容性,再分批推进。控制面与工作节点的升级顺序必须遵循所选版本支持的范围,不能把普通应用的回滚思路直接套到集群组件上。尤其是涉及状态迁移、证书轮换和节点重新加入时,回滚成本远高于一次 Pod rollout。
NVKE 不替代 Kubernetes、Device Plugin 或 NVIDIA GPU Operator,它试图把裸金属 GPU 集群从一组一次性脚本变成可持续运营的集群交付过程。我的判断是:对于拥有同构裸金属 GPU 节点、又没有成熟自研管理平台的技术团队,NVKE 值得进入试点和二次开发评估;但在接口稳定性、高可用、状态备份和跨版本升级回滚获得更多生产验证之前,它更适合作为可替换的管理层,不宜作为唯一的容灾底座。
[email protected]
。
我们承诺在核实信息后,将第一时间删除相关内容或断开链接。























暂无评论内容