Nvidia-Docker2在kubernetes上实践
现在公司线上所有的k8s集群对GPU资源的使用都是nvidia-docker 1.0
(历史遗留问题)。并且还专门写了篇文章记录是如何使用的GPU Container on Kubernetes。但是现在的kubernetes1.9推荐使用device plugin
的方式来对接外部厂商的资源。这样所有的厂商的资源就不要kubernetes去特定的支持,而是各服务厂商只要按照kubernetes
提供的device plugin实现自己的一套就可以了。今天就针对nvidia-docker2.0
进行了下测试。在此做下记录。
实验环境
- CentOS Linux release 7.2.1511 (Core)
- kuberntes: 1.9
- GPU: nvidia-tesla-k80
Installation (version 2.0)
直接参照官方的安装教程:Installation (version 2.0))
在安装nvidia-docker 2.0需要做一些准备的工作,要求如下:
- GNU/Linux x86_64 with kernel version > 3.10
- Docker >= 1.12
- NVIDIA GPU with Architecture > Fermi (2.1)
- NVIDIA drivers~= 361.93 (untested on older versions)
Your driver version might limit your CUDA capabilities (see CUDA requirements)
简单的描述下安装的过程:
CentOS 7 (docker-ce), RHEL 7.4/7.5 (docker-ce), Amazon Linux 1/2
1 | # If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers |
nvidia-docker 2.0安装完成之后,需要配置docker的runtime为nvidia-container-runtime
。具体的内容如下:
1 | { |
重新启动docker服务:
1 | systemctl restart docker |
注意:
1 | If you have a custom /etc/docker/daemon.json, the nvidia-docker2 package might override it. |
GPU on kubernetes
简述的描述下现在kubernetes对GPU的支持情况。kubernetes在1.6
版本就开始对nvidia GPU
的支持,并且仍然在不断的优化改进中。kubernetes对AMD GPU
的支持是在1.9
版本才支持。但是现在kubernetes仍然还没有支持多容器使用同一块GPU卡的情况
。这样就会照成GPU资源的浪费。
kubernetes 官方文档描述:
1 | Each container can request one or more GPUs. It is not possible to request a fraction of a GPU. |
nvidia-docker2.0 已经安装完成了,继续,下来就是如果在kubernetes上使用了。kubernetes要调度GPU 有这么几点要求:
- 开启kubernetes对GPU的支持。(在1.10之前需要指定
--feature-gates="DevicePlugins=true"
。1.10之后就不需要在指定了)。 - 在kubernetes计算节点安装
GPU drivers
(安装方法:GPU Container on Kubernetes)及device plugin
。
对Device Plugins
进行下简单的描述:
从kuberntes 1.8版本开始提供一套device plugin framework来为服务厂商接入它们自己的资源(GPUs, High-performance NICs, FPGAs)。而不需要更改kubernetes的源码。
现在我们只关心Nvidia-GPU,让我们来部署GPU device plugin
, 具体的部署流程流程如下:
nvidia-docker-plugin.yml
1 | apiVersion: extensions/v1beta1 |
创建GPU-device-plugin资源:
1 | kubectl create -f nvidia-docker-plugin.yml |
创建成功之后,在每台GPU机器上会有nvidia-device-plugin-daemonset
的资源。
现在所有的准备工作都完成了。让我们来测试GPU能否正常的调度到GPU机器上吧。测试的gpu-pod资源mainfest内容如下:
nvidia-docker2-gpu-pod.yml
1 | apiVersion: v1 |
根据上面的文件创建资源并进行校验:
1 | kubectl create -f nvidia-docker2-gpu-pod.yml |
进入到容器中查看相关的设备及cuda库是否挂载到了容器中,并且验证我们给容器分配的只有一块卡。
总结
在kubernetes中使用nvidia-docker 1.0
的弊端在于,在使用资源对象进行资源创建的时候,需要在配置中将GPU Driver
已volume的方式挂载到容器中,这步需要人为的进行干涉。但是使用nvidia-docker 2.0
的方式不要在在配置中指定GPU Driver
的位置。完全有device plugin
来做这件事。方便省事儿。并且kubernetes对外提供了device plugin
的接口。也方便各个厂商来对自家的资源实现对k8s的无缝接入。不仅仅是device plugin
, kubernetes对容器运行时,也提供了同样的interface的方式,来对外提供对各家运行时的支持。这也就是kubernetes扩展性的强大之处吧。