LabHub
学习 学习路径 课程

闭网环境的 GPU 驱动搬入与安装

把 nvidia 运行时注册到 containerd

在 LabHub 中继续学习

目标

在 containerd 中注册 nvidia runtime,验证 TOML 语法,并编写 CDI spec 和 RuntimeClass。即使没有真实 GPU,也能完整验证配置的准确性。

为什么重要

“驱动已经安装,nvidia-smi 也能运行,但容器中看不到 GPU”这类问题,原因通常是遗漏 runtime 注册。如果从网上复制的片段没有任何效果,大多是因为 config version 不匹配:section header 会随 containerd 主版本整体改变。

还有一项重要判断:不要把 default_runtime_name 改为 nvidia。否则,连不使用 GPU 的 Pod 也会经过该 runtime,runtime 故障将扩散到整个集群。更安全的做法是通过 RuntimeClass 只为有需要的工作负载指定它。

步骤

  1. 创建 /etc/containerd 目录,将 /opt/fixtures/gpu-airgap/containerd/config.toml.base 复制为 /etc/containerd/config.toml。同时创建 /root/toolkit 工作目录。
  2. config.toml 中添加 nvidia runtime section。section header 必须是 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia],并包含 runtime_type = "io.containerd.runc.v2"
  3. 在其下添加 options section。在 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] 下必须包含 BinaryName = "/usr/bin/nvidia-container-runtime"SystemdCgroup = true
  4. 检查 default_runtime_name 的值,并按以下两行写入 /root/toolkit/default.txtDEFAULT=runc / WHY=runtimeclass (默认 runtime 必须是 runc,不要修改。)
  5. 使用 TOML parser 读取 config.toml,将 version 值和已注册的 runtime 名称列表保存到 /root/toolkit/parsed.txt。必须同时显示 runcnvidia
  6. 确认 /etc/cdi/nvidia.yaml 存在且包含 kind: nvidia.com/gpu;若不存在则创建。然后将顶层键列表保存到 /root/toolkit/cdi-keys.txt
  7. 编写 /root/toolkit/runtimeclass.yaml。必须包含 apiVersion: node.k8s.io/v1kind: RuntimeClassmetadata.name: nvidiahandler: nvidia 四项。
  8. 按以下 5 行创建 /root/toolkit/report.txtCONFIG_VERSION=2 / RUNTIME=nvidia / RUNTIME_TYPE=io.containerd.runc.v2 / SYSTEMD_CGROUP=true / HANDLER=nvidia

参考

放置基础配置文件

创建 /etc/containerd 目录,将 /opt/fixtures/gpu-airgap/containerd/config.toml.base 复制为 /etc/containerd/config.toml。同时创建 /root/toolkit 工作目录。

fixture 中有精简的基础配置。真实环境中可通过 containerd config default 生成。

添加 nvidia runtime section

config.toml 中添加 nvidia runtime section。section header 必须是 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia],并包含 runtime_type = "io.containerd.runc.v2"

在 config version 2 的 CRI plugin 路径下采用 runtimes.<名称> 的形式,关键是 runtime_type 的值。

指定 runtime 选项

在其下添加 options section。在 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] 下必须包含 BinaryName = "/usr/bin/nvidia-container-runtime"SystemdCgroup = true

options 是 runtime section 的子表,需要 binary 路径和 cgroup driver 两个键。

检查默认 runtime

检查 default_runtime_name 的值,并按以下两行写入 /root/toolkit/default.txtDEFAULT=runc / WHY=runtimeclass (默认 runtime 必须是 runc,不要修改。)

default_runtime_name 必须为 runc,同时记录这样设置的原因。

验证 TOML 语法

使用 TOML parser 读取 config.toml,将 version 值和已注册的 runtime 名称列表保存到 /root/toolkit/parsed.txt。必须同时显示 runcnvidia

Python 3.11 及更高版本的标准库包含 TOML parser。能够成功解析就表示语法正确。

放置 CDI spec

确认 /etc/cdi/nvidia.yaml 存在且包含 kind: nvidia.com/gpu;若不存在则创建。然后将顶层键列表保存到 /root/toolkit/cdi-keys.txt

结构与前一课程创建的文件相同。本步骤只检查放置路径和最少必需键。

编写 RuntimeClass

编写 /root/toolkit/runtimeclass.yaml。必须包含 apiVersion: node.k8s.io/v1kind: RuntimeClassmetadata.name: nvidiahandler: nvidia 四项。

需要 apiVersion、kind、metadata.name 和 handler 四项。handler 必须与 config.toml 中的 runtime 名称一致。

注册验证报告

按以下 5 行创建 /root/toolkit/report.txtCONFIG_VERSION=2 / RUNTIME=nvidia / RUNTIME_TYPE=io.containerd.runc.v2 / SYSTEMD_CGROUP=true / HANDLER=nvidia

这些值必须通过解析已编写的文件获得。路径请写为绝对路径。