Kubeon中对Nvidia显卡的支持

kubernetes提供了device-plugin框架,只要设备厂商实现了自己的device-plugin就可以将硬件发布到kubelet,并在pod里访问这些设备

其中nvidia实现了nvidia-device-plugin,其显卡的ResourceName被公布为nvidia.com/gpu

节点是否支持及显卡数量可以通过describe nodesCapacity去查看。注意显卡调度的最小粒度是1,并且是pod独占的,也就是说一张显卡只能给一个pod使用

kubeon里通过--with-nvidia进行开启,默认是开启状态(只要检测到有nvidia显卡,在创建集群和新增节点时会自动开启容器的显卡支持),下面我们看下一般安装流程和限制

官方文档

官方文档上给出先决条件

  1. Kubernetes 的节点必须预先安装了 NVIDIA 驱动
  2. Kubernetes 的节点必须预先安装 nvidia-docker 2.0
  3. Docker 的默认运行时必须设置为 nvidia-container-runtime,而不是 runc
  4. NVIDIA 驱动版本 ~= 384.81

然后安装nvidia-device-plugin这个ds,这个ds其实只需要在有nvidia的显卡上运行,所以之后可以修改下

驱动和容器

kubeon在安装显卡驱动之前,无法确定显卡型号,也就无法下载驱动;所以显卡驱动程序还是要预先按照好,还好无论是物理还是虚拟网卡这一步都不麻烦

  • 物理显卡可以直接使用官方驱动,正常情况下这里可以下载的到
  • 虚拟化显卡,大部分云厂商会提供安装脚本或者直接安装好。注意虚拟卡的驱动是专用的,如果不用脚本而是手动安装驱动,还需要配置gridd查看nvidia-gridd服务状态
  • 可以使用./nvidia.run --silent --disable-nouveau安装

官方文档中的2 安装nvidia-docker已过时(除非还在使用docker)实际并不需要,也就是说kubeon不支持在docker环境下开启容器显卡支持

最终kubeon要实现对以下步骤的自动化

  1. 检测系统上是否有nvdia的显卡,实际是检测驱动程序是否安装
  2. 如果有显卡,则安装nvidia-container-runtime,实际此时还需要安装libnvidia-container相关依赖
  3. 修改containerd的配置,将BinaryName从默认的runc改为nvidia-container-runtime
  4. 等待集群完成安装后给有显卡的集群打上标签
  5. 安装nvidia-device-plugin时修改并使用上边的便签

容器支持

nvidia对容器支持的项目还挺多,我们来看一下分别是干什么的

  • nvidia-docker 2.0:主要通过修改docker的配置文件让docker使用nvidia-container-runtimecontainerd环境已经不需要了
  • nvidia-container-runtime:在runc的上增加一个pre-start hook,如果设置了环境变量NVIDIA_VISIBLE_DEVICES且不为none这个hook将会调用nvidia-container-cli来设置容器gpu
  • libnvidia-container:包括nvidia-container-cli,提供了在容器使用gpu的能力
  • nvidia-device-plugin:nvidia官方对device-plugins的实现,用于发布节点对显卡的支持能力
  • dcgm-exporter:采集nvidia显卡运行参数和性能指标

安装流程

检测环境

直接检测/dev下设备是否存在

1
2
3
4
5
6
for name in /dev/nvidia*; do
if test -c ${name}; then
echo yes;
break;
fi
done

安装ncr

通过官方源安装,下面示例是ubuntu20.04

1
2
3
4
5
6
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
echo "deb https://nvidia.github.io/libnvidia-container/stable/ubuntu20.04/\$(ARCH) /" > /etc/apt/sources.list.d/nvidia-container-runtime.list
echo "deb https://nvidia.github.io/nvidia-container-runtime/stable/ubuntu20.04/\$(ARCH) /" >> /etc/apt/sources.list.d/nvidia-container-runtime.list

apt-get update
apt-get install -y nvidia-container-runtime

配置和ds

kubeon在安装containerd时会生成一个默认的配置文件/etc/containerd/config.toml,只需要把里边的BinaryName那行通过sed替换掉即可

在集群安装完成后,使用kubectl label nodes xxx nvidia.com/gpu.present=yes添加一个标签,然后修改官方ds加上对这个标签的nodeSelector后apply即可

环境变量

NVIDIA_VISIBLE_DEVICES

默认会根据申请的gpu资源通过一定策略分配给容器,一般不需要手动设置

注意申请资源时,limit是有实际意义的,request可以不指定,但如果指定必须和limit相同

NVIDIA_DRIVER_CAPABILITIES

容器内gpu所能使用的能力,默认是utility,compute,可使用选项如下

  • all:全部开启
  • utility:可以使用nvidia-smi命令行和NVML库
  • compute:可以运行CUDA和OpenCL程序
  • compat32:可以运行32位程序(首先要驱动支持)
  • graphics:可以运行OpenGL和Vulkan程序
  • video:可以进行视频编解码
  • display:X11支持

Kubeon中对Nvidia显卡的支持
https://back.pub/post/kubeon-nvidia-support/
作者
Dash
发布于
2022年2月12日
许可协议