Kubeon中对Nvidia显卡的支持
kubernetes
提供了device-plugin
框架,只要设备厂商实现了自己的device-plugin
就可以将硬件发布到kubelet
,并在pod
里访问这些设备
其中nvidia
实现了nvidia-device-plugin
,其显卡的ResourceName
被公布为nvidia.com/gpu
节点是否支持及显卡数量可以通过describe nodes
的Capacity
去查看。注意显卡调度的最小粒度是1,并且是pod独占的,也就是说一张显卡只能给一个pod使用
在kubeon
里通过--with-nvidia
进行开启,默认是开启状态(只要检测到有nvidia显卡,在创建集群和新增节点时会自动开启容器的显卡支持),下面我们看下一般安装流程和限制
官方文档
官方文档上给出先决条件
- Kubernetes 的节点必须预先安装了 NVIDIA 驱动
- Kubernetes 的节点必须预先安装 nvidia-docker 2.0
- Docker 的默认运行时必须设置为 nvidia-container-runtime,而不是 runc
- 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
要实现对以下步骤的自动化
- 检测系统上是否有nvdia的显卡,实际是检测驱动程序是否安装
- 如果有显卡,则安装nvidia-container-runtime,实际此时还需要安装
libnvidia-container
相关依赖 - 修改
containerd
的配置,将BinaryName
从默认的runc
改为nvidia-container-runtime
- 等待集群完成安装后给有显卡的集群打上标签
- 安装
nvidia-device-plugin
时修改并使用上边的便签
容器支持
nvidia
对容器支持的项目还挺多,我们来看一下分别是干什么的
- nvidia-docker 2.0:主要通过修改docker的配置文件让docker使用
nvidia-container-runtime
。containerd
环境已经不需要了 - 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 |
|
安装ncr
通过官方源安装,下面示例是ubuntu20.04
1 |
|
配置和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支持