LabHub
学习 学习路径 课程

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

把运行时注册到 containerd

在 LabHub 中继续学习

一句话总结

要在容器中使用GPU,必须有驱动程序(内核)+工具包(注入工具)+**运行时注册(config.toml)**这三个。即使只缺少一个,症状也一样是“看不到GPU”。

概念图: 驱动程序(内核) · 工具包(注入工具) · 运行时注册(config.toml) · 运行时未注册

为什么需要这个?

安装驱动程序后nvidia-smi也可以正常运行,但在容器内看不到GPU。这是常见的情况,原因通常是运行时未注册

怎么行动

三层

什么 确认方法
内核 nvidia.ko模块,/dev/nvidia*设备节点 lsmod | grep nvidials /dev/nvidia*
用户空间 libcuda.solibnvidia-ml.so nvidia-smildconfig -p | grep nvidia
容器注入 nvidia-container-cli,CDI规格,运行时注册 nvidia-ctk cdi listconfig.toml

容器中没有内核(与主机共享)。所以需要做的就是把用户空间库和设备节点放入容器中,而做这件事就是工具包。

containerd config.toml

containerd config default在创建基本文件后添加运行时间。不要用手组装头文件——部分头文件根据containerd主版本全部变更。

config version 2(containerd 1.x):

version = 2

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
  runtime_type = "io.containerd.runc.v2"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
  BinaryName = "/usr/bin/nvidia-container-runtime"
  SystemdCgroup = true

在config version 3(containerd 2.x)中,CRI设置分为运行时和映像两个部分。

version = 3

[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.nvidia.options]
  BinaryName = '/usr/bin/nvidia-container-runtime'
  SystemdCgroup = true

**版本2文件在2.x中也支持,并自动转换。版本1从2.0开始不支持。**贴了从网上收集的片段,如果没有任何效果的话,大部分都是这个版本不一致。

nvidia-ctk代替我进行编辑。

nvidia-ctk runtime configure --runtime=containerd --set-as-default=false

--set-as-default=false很重要。如果将基本运行时间改为nvidia,**即使是不使用GPU的板块也会经历该运行时间。**如果运行时间出现问题,整个群集都会受到影响。

SystemdCgroup

基本值都是false。但是,在基于systemd的主机上建议使用true。因为只有kubelet改为systemd cgroup驱动程序,而保持containerd不变,两个管理员就会有不同的cgroup视图。这种不一致会以资源限制运行异常或进程被提取的方式出现。

RuntimeClass

让注册的运行时间由工作负载选择。

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia          # config.toml 의 runtimes.<이름> 과 일치해야 한다
spec:
  runtimeClassName: nvidia
  containers:
    - name: cuda
      resources:
        limits:
          nvidia.com/gpu: 1

**handler值和config.toml的运行时名称必须完全一致。**不一致的话,帕德RunContainerError弹出,消息中显示“no runtime for ... is configured”。

管理型节点的陷阱

在管理型节点组中,在节点引导时config.toml这种情况重生很多。**用手修改的设置在节点更换的瞬间消失,更糟糕的是,只在部分节点上留下,造成无法再复制的差异。**如果需要更改设置,就需要修改引导脚本或启动模板,或者修改节点映像本身。进入节点修改的是诊断,而不是部署。

在现场相遇的样子

**驱动程序更新后GPU无法捕获。**忘记了CDI规格的生成。规格中包含带有版本的库路径。

**只有GPU板启动慢。**每次容器启动时,都需要注入库并更新ldcache,这需要成本。图像越大,效果就越明显。

下次实习要做的事情

config.toml在e nvidia注册运行时间并通过TOML解析器进行验证。配置CDI规格并编写RuntimeClass YAML。即使没有实际GPU,也可以验证所有设置的准确性。