k8s怎么使用GPU?这篇文章告诉你怎么做!

Posted by Naah on Saturday, Jun 22,2019 20:44:47

我是不会告诉你为啥要用docker,nvidia-docker,k8s的!
百度和google一堆,自己找找!
这里只教你怎么部署坑最少!

1 所需环境

可能大部分人喜欢用ubuntu来进行,但是我喜欢用centos,所以本文就用centos7

谁让我是作者,就是这么任性! 1. docker(版本小于19.03) 2. centos7 3. gpu驱动 4. cuda

使用该方案的前提下,需要你的linux机器已经安装好gpu的驱动cuda
gpu驱动cuda要两者单独安装,不要听信网上的可以一起安装,不然坑死你

2 安装和配置docker

去上一篇文章看看吧! 最完善的docker安装和配置教程

3 安装和配置nvidia-docker

我们要想在docker中使用gpu,就需要安装nvidia官方出的nvidia-docker

我们按照官方的文档来进行吧!Nvidia-Docker GitHub

3.1 配置安装源

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo

3.2 安装nvidia-docker

安装nvidia-docker会覆盖我们上面2.5.2中所配置的镜像加速,会在3.3中重新配置

sudo yum install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

让我们来测试下是否可以使用gpu吧,如果出现了熟悉的nvidia-smi的界面,说明就成功啦!

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

3.3 配置nvidia-docker

在我们安装nvidia-docker后,docker的默认执行引擎还是原生的,那么有没有更加简单便捷的方法来使用nvidia-docker呢,我们一起来看看吧

默认情况下,我们需要每次都加--runtime=nvidia 参数来声明使用gpu

sudo systemctl stop docker
sudo echo '{"registry-mirrors":["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://xgb5chrw.mirror.aliyuncs.com"],"default-runtime":"nvidia","runtimes":{"nvidia":{"path":"nvidia-container-runtime","runtimeArgs":[]}},"insecure-registries":["192.168.101.253:1234"]}' > /etc/docker/daemon.json
sudo systemctl start docker

上面这条命令又配置了镜像加速源,又配置了nvidia-docker作为执行引擎!

4 安装和配置k8s

安装过k8s的小伙伴都知道因为国内万能的墙的原因,我们安装k8s是相当痛苦的
下面我就介绍一种方法来快速安装k8s,那就是rancher

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。

让我们跟着文档一起吧!Rancher

偷偷告诉你Rancher可不止支持k8s呦!

4.1 安装Rancher

rancher有单点版本HA高可用版本,在这里我们主要使用k8s,所以对这个就洒洒水啦!(生产别用单点,小心被打死!)

使用这条命令就可以启动安装Rancher了,docker真tm方便!

docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /var/lib/rancher:/var/lib/rancher/ \
-v /root/var/log/auditlog:/var/log/auditlog \
-e AUDIT_LEVEL=3 \
rancher/rancher:stable

在上方我们发现映射了80和443端口,这两个端口就是web控制台的端口!
配置密码什么的,要是需要我告诉你,你就别往下看了!

对了,有个坑的地方!rancher的 server url 最好使用ip,不然可能有坑!

4.2 安装k8s

在rancher的界面依次进行如下操作

4.2.1 添加集群

4.2.2 CUSTOME,输入集群名称

4.2.3 添加节点

1.k8s环境配置:

一. 主机名(hostname)配置只支持包含 -.两种特殊符号,所有节点主机名不能相同

二. 配置每台主机的hosts(/etc/hosts),添加host_ip $hostname到/etc/hosts文件中。

三. CentOS关闭selinux

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/>config

四. 关闭防火墙

sudo systemctl stop firewalld
sudo chkconfig firewalld off

五. 配置主机时间、时区、系统语言

sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile

2.在已经安装配置了nvidia-docker的机器上,运行下方的docker命令

etcd:k8s注册中心

controller:k8s控制器

worker:k8s工作节点

我这里全部选中,如果多节点可以搭配选择!

3.因为这些机器需要运行rancher-agent,需要pull 这个镜像,所以可能要等等

运行命令后直到下方显示绿色框,框中显示已添加节点数跟你的相同,你再点击确定!

点击确定后,下面的状态代表pull k8s的镜像,因为k8s的部署也是节点形式,需要pull k8s的镜像

4.下面这个状态的时候,代表k8s集群已经安装完成啦!

4.2.4 安装kubectl

rancher默认不安装kubectl,但是没有kubect就是没有灵魂的k8s,下面我们就来安装吧!

1.进入页面 kubectl下载

2.选择对应版本下载

查看k8s版本:

点击rancher页面的集群 红线处标明了k8s的版本

3.下载

这里我们选择1.13.7版本下载

wget https://www.cnrancher.com/download/kubernetes/linux-amd64-v1.13.7-kubectl

4.安装kubectl

改名,授权,移动

mv linux-amd64-v1.13.7-kubectl kubectl
sudo chmod 777 ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

然后测试下,看看是否安装成功

kubectl version

你以为这就安完了?no!我们还要配置kubectl连接我们的k8s集群,毕竟kubectl只是个客户端

5.配置kubectl

进入rancher页面,点击集群

点击右方的kubeconfig文件,然后你会看到一大片yaml

滑动到底部,点击复制到剪贴板

这时候用vim或者其他方式写入文件吧!

mkdir ~/.kube
vim ~/.kube/config
#然后写入进去

6.运行试试

运行下面的命令,如果出现了你部署k8s的机器,那就说明成功啦!

kubectl get nodes

4.3 安装k8s-device-plugin

请确定你已经安装了nvidia-docker并且docker使用nvidia作为默认引擎

使用下面的命令就可以安装k8s-device-plugin了! k8s-device-plugin GitHub

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml

到目前为止,我们已经搭建好了一个可以用gpu资源的k8s集群啦!

下面我将介绍如何打包使用gpu的镜像

5 打包GPU镜像

dockerfile相关知识不在这里介绍了,自己去学!

要想在k8s里使用gpu资源,同时也需要我们的镜像支持!

nvidia/cuda dockerhub就是nvidia提供的基础镜像

nvidia目前只提供ubuntucentos镜像,我们打包只需要最基础的base版本就可以了

base版本还100多M(还没安装语言呢),让我很是怀念alpine-glib(alpine-glib才8M)

比如下面这个,我就是使用了cuda10版本的centos7系统镜像

FROM nvidia/cuda:10.0-base-centos7
...

好了!终于结束了!我可是踩了好几天的坑啊!