kubernetes集群GPU支持方案

一.kubernetes对GPU的支持版本

kubernetes提供对分布式节点上的AMD GPU和NVIDIA GPU管理的实验性的支持。在V1.6中已经添加了对NVIDIA GPU的支持,并且经历了多次
向后不兼容的迭代。通过设备插件在v1.9中添加了对AMD GPU的支持。

从1.8版本开始,使用GPU的推荐方法是使用驱动插件。要是在1.10版本之前通过设备插件启用GPU支持,必须在整个系统中将DevicePlugins功能
设置为true: --feature-gates="DevicePlugins=true 。1.10之后版本不需要这么做了。

然后,必须在节点上安装相应供应商GPU驱动程序,并从GPU供应商(AMD/NVIDIA)运行相应的设备插件。

二.kubernetes集群部署GPU

kubernetes集群版本: 1.13.5
docker版本: 18.06.1-ce
os系统是版本: centos7.5
内核版本: 4.20.13-1.el7.elrepo.x86_64
Nvidia GPU型号: P4000

2.1 安装nvidia驱动

2.1.1 安装gcc

[root@k8s-01 ~]# yum install -y gcc

image.gif

2.1.2 下载nvidia的驱动

下载链接: NVIDIA DRIVERS Linux x64 (AMD64/EM64T) Display Driver

这里我们下载的是如下版本:

[root@k8s-01 ~]# ls NVIDIA-Linux-x86_64-410.93.run -alh
-rw-r--r-- 1 root root 103M Jul 25 17:22 NVIDIA-Linux-x86_64-410.93.run

image.gif

2.1.3 修改/etc/modprobe.d/blacklist.conf文件,阻止nouveau模块的加载

[root@k8s-01 ~]# echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist.conf

image.gif

2.1.4 重新建立initramfs image

[root@k8s-01 ~]# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
[root@k8s-01 ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)

image.gif

2.1.5 执行驱动安装

[root@k8s-01 ~]# sh NVIDIA-Linux-x86_64-410.93.run -a -q -s 

image.gif

2.1.6 安装工具包

只有驱动是不够的,我们需要一些工具包便于我们使用,其中cuda、cudnn是相关工具包。

[root@k8s-01 ~]# cat /etc/yum.repos.d/cuda.repo 
[cuda]
name=cuda
baseurl=http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64
enabled=1
gpgcheck=1
gpgkey=http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub
[root@k8s-01 ~]#

image.gif

2.2 安装nvidia-docker2

nvidia-docker是一个可以使用GPU的docker,在docker的基础上做了一层封装。目前基本被弃用。
nvidia-docker2是一个runtime,能更好的和docker兼容。

  • 获取nvidia-docker2的yum源
[root@k8s-01 ~]# distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
[root@k8s-01 ~]# curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

image.gif
  • 查看nvidia-docker2的列表

这里我们需要安装支持docker-18.06.1-ce版本的nvidia-docker2版本,否则会不支持。

[root@k8s-01 ~]# yum list nvidia-docker2 --showduplicate
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirror01.idc.hinet.net
 * extras: mirrors.aliyun.com
 * updates: mirrors.163.com
Installed Packages
nvidia-docker2.noarch                                      2.0.3-1.docker18.06.1.ce                                      @nvidia-docker
Available Packages
nvidia-docker2.noarch                                      2.0.0-1.docker1.12.6                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.0-1.docker17.03.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.0-1.docker17.06.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.0-1.docker17.06.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.0-1.docker17.09.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker1.12.6                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker1.13.1                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker17.03.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker17.06.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker17.09.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.1-1.docker17.09.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker1.12.6                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker1.13.1                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker17.03.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker17.06.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker17.09.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker17.09.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.2-1.docker17.12.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker1.12.6                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker1.13.1                                          nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.03.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.06.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.09.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.09.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.12.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker17.12.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.03.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.03.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.06.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.06.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.06.2                                         nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.0.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.1.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.2                                         nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.3.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-1.docker18.09.4.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-2.docker18.06.2.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-2.docker18.09.5.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-3.docker18.06.3.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-3.docker18.09.5.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-3.docker18.09.6.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.0.3-3.docker18.09.7.ce                                      nvidia-docker 
nvidia-docker2.noarch                                      2.1.0-1                                                       nvidia-docker 
nvidia-docker2.noarch                                      2.1.1-1                                                       nvidia-docker 
nvidia-docker2.noarch                                      2.2.0-1                                                       nvidia-docker

image.gif

这里我们安装2.0.3-1.docker18.06.1.ce版本即可。

  • 安装nvidia-docker2
[root@k8s-01 ~]# yum install -y nvidia-docker2-2.0.3-1.docker18.06.1.ce

image.gif
  • 配置默认的docker runtime为nvidia
[root@k8s-01 ~]# cat /etc/docker/daemon.json 
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

image.gif
  • 重启docker
[root@k8s-01 ~]# systemctl restart docker 

image.gif
  • 查看docker信息
[root@k8s-01 wf-deploy]# docker info
Containers: 63
 Running: 0
 Paused: 0
 Stopped: 63
Images: 51
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc nvidia
Default Runtime: nvidia
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340-dirty (expected: 69663f0bd4b60df09991c08812a60108003fa340)
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.20.13-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.79GiB
Name: k8s-01
ID: DWPY:P2I4:NWL4:3U3O:UTGC:PLJC:IGTO:7ZXJ:A7CD:SJGT:7WT5:WNGX
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 192.168.50.2
 127.0.0.0/8
Live Restore Enabled: false

image.gif

可以看出docker的默认runtime为nvidia

2.3 安装驱动插件

  • 获取插件的最新yaml文件
[root@k8s-01 ~]# kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.11/nvidia-device-plugin.yml

image.gif

2.4 查看有GPU的节点

[root@wf-229 ~]# kubectl get node 192.18.1.26 -ojson | jq '.status.allocatable'
{
  "cpu": "48",
  "ephemeral-storage": "258961942919",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "131471388Ki",
  "nvidia.com/gpu": "1",
  "pods": "200"
}

image.gif

2.5 创建包含GPU资源的POD

[root@wf-229 gpu]# cat test.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx-pod
  name: nginx-pod
spec:
  containers:
  - image: nginx:latest
    imagePullPolicy: Always
    name: nginx
    ports:
    - containerPort: 80
      name: nginx
      protocol: TCP
    resources:
      limits:
        nvidia.com/gpu: "1"

image.gif

2.6 查看Pod中分配的GPU资源

[root@wf-229 gpu]# kubectl exec -it nginx-pod bash
root@nginx-pod:/# nvidia-smi 
Mon Aug 12 11:39:05 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.93       Driver Version: 410.93       CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro P4000        Off  | 00000000:3B:00.0 Off |                  N/A |
| 46%   34C    P8     5W / 105W |      0MiB /  8119MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

image.gif

三.CLI介绍

  • nvidia-container-cli

nvidia-container-cli 是一个命令行工具,用于配置Linux容器对GPU 硬件的使用。支持:
1)list: 打印nvidia驱动库及路径
2)info: 打印所有Nvidia GPU设备
3)configure: 进入给定进程的命名空间,执行必要操作保证容器内可以使用被指定的GPU以及对应能力(指定 Nvidia 驱动库)。 configure是我们使用到的主要命令,它将Nvidia 驱动库的so文件 和 GPU设备信息, 通过文件挂载的方式映射到容器中。

  • 查看NODE节点GPU
kubectl get node 192.18.1.26 -ojson | jq '.status.allocatable'
image.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容