Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubelet从入门到放弃系列:GPU加持

Kubelet从入门到放弃系列:GPU加持

作者头像
zouyee
发布于 2021-03-06 14:52:39
发布于 2021-03-06 14:52:39
1.3K00
代码可运行
举报
文章被收录于专栏:Kubernetes GOKubernetes GO
运行总次数:0
代码可运行

友情提示:全文3090多文字,预计阅读时间5分钟

摘要

《Kubelet从入门到放弃系列》将对Kubelet组件由Linux基础知识到源码进行深入梳理。上一篇zouyee带各位看了Kubelet从入门到放弃:拓扑管理,其中提及设备插件,在本文<Kubelet从入门到放弃系列:与GPU齐飞>,今天zouyee跟段全峰童鞋为各位介绍Kubernetes如何利用Nvidia系列GPU,后续介绍Device Plugin的相关概念以及Kubelet组件源码逻辑。

一、需求说明

1.1 需求说明

在Kubernetes 1.8之前,用户使用GPU等设备时,推荐使用Accelerators Feature Gate的内置方式,延续Kubernetes的插件化的实现理念,各司其职,在Kubernetes 1.10版本后,引入设备插件框架,用户可以将系统硬件资源引入到Kubernetes生态。本文将介绍NVIDIA GPU如何安装部署,Device Plugins的相关介绍、工作机制和源码分析,包括插件框架、使用和调度GPU、和异常处理及优化等相关内容。

1.2 相关说明

在Kubernetes 1.10中Device Plugins升为Beta特性,在Kubernetes 1.8时,为了给第三方厂商通过插件化的方式将设备资源接入到Kubernetes,给容器提供Extended Resources。

通过Device Plugins方式,用户无需要改Kubernetes的代码,由第三方设备厂商开发插件,实现Kubernetes Device Plugins的相关接口即可(仔细想想,Kubernetes中的volume管理是否也是类似的逻辑?CSI、CNI、CRI?)。

目前Device Plugins典型实现有:

a) AMD GPU插件

b)Intel设备插件:GPU、FPGA和QuickAssist设备

c)KubeVirt用于硬件辅助的虚拟化设备插件

d)Nvidia提供的GPU插件

e)高性能低延迟RDMA卡插件

f)低延迟Solarflare万兆网卡驱动

g)SR-IOV网络设备插件

h)Xilinx FPGA设备插件

Kubelet启动Device plugins服务端,对应设备商启动Device Plugin服务,对外暴露几个gRPC Service提供服务,并通过/var/lib/kubelet/device-plugins/kubelet.sock与Kubelet通信。

二、部署介绍

2.1 部署说明

当前Nvidia GPU提供三种部署方式:docker方式、Containerd方式及Operator方式。

因docker后续不再内置,相关说明可以查看关于Kubernetes废弃内置docker CRI功能的说明,下文将主要介绍 Containerd部署,Operator方式后续单独成文,当前nvidia-container-toolkit已经支持containerd和cri-o两种部署方式,在接受containerd部署前,先说明前期遇到的相关问题:

a. 默认runtime设置

其中Kubelet问题描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Events:
  Type     Reason         Age                   From               Message
  ----     ------         ----                  ----               -------
  Normal   Scheduled      10m                   default-scheduler  Successfully assigned gpu-operator-resources/nvidia-device-plugin-daemonset-f99md to cl-gpu-md-0-f4gm6
  Warning  InspectFailed  10m (x3 over 10m)     kubelet            Failed to inspect image "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2": rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial unix /run/containerd/containerd.sock: connect: connection refused"

其中Nvidia Device Plugin Daemonset某一个Pod相关错误,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl logs ‐f nvidia‐device‐plugin‐daemonset‐q9svq ‐nkube‐system
2021/02/11 01:32:29 Loading NVML
2021/02/11 01:32:29 Failed to initialize NVML: could not load NVML library.
2021/02/11 01:32:29 If this is a GPU node, did you set the docker default runtime to `nvidia`?
2021/02/11 01:32:29 You can check the prerequisites at: https://github.com/NVIDIA/k8s-device-plugin#prerequisites
2021/02/11 01:32:29 You can learn how to set the runtime at: https://github.com/NVIDIA/k8s-device-plugin#quick-start
2021/02/11 01:32:29 If this is not a GPU node, you should set up a toleration or nodeSelector to only deploy this plugin on GPU nodes

该问题由于containerd的配置文件containerd.toml未将default_runtime_name = "runc"修改为default_runtime_name = "nvidia",相关问题:https://github.com/NVIDIA/gpu-operator/issues/143

b. kubelet cgroup driver配置

相关问题:https://github.com/NVIDIA/libnvidia-container/issues/119

在kubelet配置的cgroup driver为systemd时,Nvidia的container prestart hook在处理cgroup路径逻辑与containerd不一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
containerd[76114]: time="2020-12-04T08:52:13.029072066Z" level=error msg="StartContainer for "7a1453c6e7ab8af7395ccc8dac5efcffa94a0834aa7b252e1dcd5b51f92bf13e" failed" error="failed to create containerd task: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: mount error: open failed: /sys/fs/cgroup/devices/system.slice/containerd.service/kubepods-pod80540e95304d8cece2ae2afafd8b8976.slice/devices.allow: no such file or directory: unknown"

解决方案为升级libnvidia-container或者container-toolkit。

接下来,介绍部署相关内容。

2.2 Containerd方式

‍‍‍ 1)版本说明

软件

版本说明

CentOS

7

内核

4.19.25

GPU型号

Tesla T4

driver版本

418.39

CUDA版本

10.1

K8S

1.18.5

Nvidia Device Plugin

0.7.3

Containerd

v1.4.3

runc‍‍‍‍

1.0.0-rc1

2)安装

注:下文为内网离线部署,若各位在联网环境下,只需参考部署步骤及部署配置即可

a. 安装驱动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tar ‐zxvf gpu.tar.gz 
## 安装依赖 
$ cd gpu/runtime 
$ tar ‐zxvf dependency.tar.gz 
$ cd dependency 
## 查看是否支持CUDA的Nvidia的GPU 
$ cd ./lspci/ 
$ yum localinstall ‐y *.rpm 
$ lspci | grep ‐i nvidia ## 安装devel 
$ cd ../devel 
$ yum localinstall ‐y *.rpm 
## 安装gcc $ cd ../gcc 
$ yum localinstall ‐y *.rpm 
## 卸载nouveau驱动 
$ lsmod | grep nouveau 
$ rmmod nouveau 
## 安装驱动,过程见下面附的图片。如果要更新驱动,从https://developer.nvidia.com/cuda‐75‐downloads‐ archive下载 
$ cd ../../../driver 
$ sh cuda_10.1.105_418.39_linux.run ## 测试驱动,有如下输出则正常安装

结果验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ nvidia‐smi

附:安装驱动图

(1) 输入accept,回车

(2) 选择install,回车

2)配置Containerd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 更新runc,下载地址https://github.com/opencontainers/runc/releases 
$ cd ../runtime 
$ cp runc /usr/bin/ 
## 更新containerd,下载地址 https://github.com/containerd/containerd/releases 
$ tar ‐zxvf containerd‐1.4.3‐linux‐amd64.tar.gz 
$ cp bin/* /usr/bin/ 
## 安装nvidia‐container‐runtime,yum源https://nvidia.github.io/nvidia‐docker/centos7/nvidia‐ docker.repo,yum安装:yum install ‐y nvidia‐container‐runtime $ tar ‐zxvf nvidia‐container‐runtime.tar.gz 
$ cd nvidia‐container‐runtime 
$ yum localinstall ‐y *.rpm
修改containerd启动参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置containerd的参数 
$ mkdir /etc/containerd/ 
$ vi /etc/containerd/config.toml 
# 配置containerd.service 
$ vi /usr/lib/systemd/system/containerd.service 
$ systemctl daemon‐reload 
$ systemctl restart containerd 
# 配置crictl 
$ tar ‐zxvf crictl‐v1.18.0‐linux‐amd64.tar.gz 
$ mv crictl /usr/bin/ 
$ vi /etc/profile alias crictl='crictl ‐‐runtime‐endpoint unix:///run/containerd/containerd.sock' 
$ source /etc/profile 
# 测试containerd和nvidia‐container‐runtime安装是否成功 
$ cd test‐image 
$ ctr images import cuda‐vector‐add_v0.1.tar 
$ ctr images push ‐‐plain‐http registry.paas/cmss/cuda‐vector‐add:v0.1

执行检验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ctr run ‐t ‐‐gpus 0 registry.paas/cmss/cuda‐vector‐add:v0.1 cp nvidia‐smi
结果如下

清理容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ctr c rm cp

配置config.toml

执行containerd config default > /etc/containerd/config.toml生成配置,并做如下修改:

注意:如上所述,1)default_runtime_name值为nvidia,2)新增一个runtimes 3)若有内部镜像仓库,可修改docker.io为内部仓库名称

配置containerd.service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Unit] 
Description=containerd container runtime 
Documentation=https://containerd.io After=network.target

[Service] 
ExecStartPre=/sbin/modprobe overlay 
ExecStart=/usr/bin/containerd 
KillMode=process 
Delegate=yes 
LimitNOFILE=1048576 
# Having non‐zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container‐local accounting. LimitNPROC=infinity 
LimitCORE=infinity 
TasksMax=infinity 
[Install] 
WantedBy=multi‐user.target    

c. 部署Device Plugin

在部署完Kubernetes集群后,修改kubelet运行时配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ vi /apps/conf/kubernetes/kubelet.env ‐‐container‐runtime=remote ‐‐container‐runtime‐endpoint=unix:///run/containerd/containerd.sock
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd device‐plugin 
$ docker load ‐i k8s‐device‐plugin_v0.7.3.tar 
$ docker push
// https://github.com/NVIDIA/k8s-device-plugin/tree/master/deployments/static
$ kubectl apply ‐f nvidia‐device‐plugin.yml 
$ kubectl logs ‐f nvidia‐device‐plugin‐daemonset‐q9svq ‐nkube‐system 
2021/02/08 06:32:36 Loading NVML 2021/02/08 06:32:42 Starting FS watcher. 2021/02/08 06:32:42 Starting OS watcher. 2021/02/08 06:32:42 Retreiving plugins. 2021/02/08 06:32:42 Starting GRPC server for 'nvidia.com/gpu' 2021/02/08 06:32:42 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device‐ plugins/nvidia‐gpu.sock 2021/02/08 06:32:42 Registered device plugin for 'nvidia.com/gpu' with Kubelet

d. 功能测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd test‐image 
# 启动测试pod 
$ kubectl apply ‐f demo.yml
// https://github.com/NVIDIA/gpu-operator/blob/master/tests/gpu-pod.yaml
$ kubectl logs ‐f cuda‐vector‐add 
[Vector addition of 50000 elements] 
Copy input data from the host memory to the CUDA device 
CUDA kernel launch with 196 blocks of 256 threads 
Copy output data from the CUDA device to the host memory 
Test PASSED 
Done

未完,待续.

三、参考资料

1. https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/

2.https://github.com/kubernetes/community/blob/master/contributors/design-proposals/resource-management/device-plugin.md

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DCOS 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker实操:安装MySQL5.7详解(保姆级教程)
Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql
不惑
2023/11/10
28.5K5
Docker实操:安装MySQL5.7详解(保姆级教程)
docker安装es
(3) mkdir -p /mydata/elasticsearch/config
用户2337871
2020/04/24
1.1K0
docker安装es
Docker部署Mysql,如何开启binlog
参考:https://www.freebytes.net/it/java/dokcer-mysql-binlog.html
OY
2022/03/12
2.6K0
Docker部署Mysql,如何开启binlog
使用docker安装mysql和redis
docker 安装 mysql 下载镜像文件 docker pull mysql:5.7 创建实例并启动 docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 参数说明
一个风轻云淡
2022/11/15
7630
小湖商贸初始环境搭建
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。我们可以使用它来干如下这些事:
乐心湖
2021/01/18
6150
小湖商贸初始环境搭建
docker安装MySQL主从复制 读写分离
参数说明  -p 3307:3306:将容器的3306端口映射到主机的3307端口  -v /mydata/mysql/master/conf:/etc/mysql:将配置文件夹挂在到主机  -v /mydata/mysql/master/log:/var/log/mysql:将日志文件夹挂载到主机  -v /mydata/mysql/master/data:/var/lib/mysql/:将配置文件夹挂载到主机  -e MYSQL_ROOT_PASSWORD=root:初始化root用户的密码 修改master基本配置
周杰伦本人
2022/10/25
8860
docker安装MySQL主从复制 读写分离
分布式基础篇-docker安装mysql和redis
docker run -p 3306:3306 --name 12mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
源码之路
2023/02/14
5700
分布式基础篇-docker安装mysql和redis
Docker安装MySql-挂载外部数据和配置
在上一篇中《在CentOS7中使用Docker安装MySql》中介绍了怎样在Docker中安装Mysql,但存在两个问题:
oec2003
2019/07/19
6.4K0
Docker安装MySql-挂载外部数据和配置
Docker学习11-Docker常规方式安装软件
本文咱们将通过按照Tomcat、按照MySQL、安装Redis这三个实战安装,来熟悉在docker中怎么安装软件,咱们使用端口映射,及数据卷的使用场景
凯哥Java
2022/12/16
1.6K0
Docker学习11-Docker常规方式安装软件
Docker 安装 MySQL8 数据库
程序员NEO
2023/10/12
1.9K0
Docker安装MySQL
MySQL文档地址: https://hub.docker.com/_/mysql/
似水的流年
2019/12/07
8880
Linux安装mariadb
Enter current password for root (enter for none):<–初次运行直接回车
week
2018/08/24
2.5K0
Linux安装mariadb
Kubesphere手把手教你轻松打造高可用MySQL集群!
JavaEdge
2023/07/09
5410
Kubesphere手把手教你轻松打造高可用MySQL集群!
Nacos的持久化和集群部署
  mysql/mysql-server:5.7   nacos/nacos-server:1.1.4
用户10196776
2023/10/17
4400
Nacos的持久化和集群部署
Docker学习系列11-Docker常规方式安装软件
本文咱们将通过按照Tomcat、按照MySQL、安装Redis这三个实战安装,来熟悉在docker中怎么安装软件,咱们使用端口映射,及数据卷的使用场景
凯哥Java
2022/12/14
3820
Docker学习系列11-Docker常规方式安装软件
MYSQL高级篇----简介介绍
MySQL配置文件讲解:https://www.cnblogs.com/gaoyuechen/p/10273102.html
默 语
2024/11/20
890
MYSQL高级篇----简介介绍
记录Docker部署官方 MySQL5.7
chmod 750 /home/gahc/data/mysql/conf/my.cnf
青丝束马尾
2024/05/31
3170
记录Docker部署官方 MySQL5.7
Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问(图文教程)
随着分布式微服务的火爆,越来越多的服务需要一个个的部署很麻烦,随之带动了自动化部署的趋势.小编也是刚刚入门,自动化的部署还没有学完,刚刚接触Docker,觉得非常方便,直接运行镜像就可以!!
掉发的小王
2022/07/11
1.3K0
Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问(图文教程)
mall在Linux环境下的部署(基于Docker容器)
mall在Linux环境下的部署(基于Docker容器) 本文主要以图文的形式讲解mall在Linux环境下的部署,涉及在Docker容器中安装Mysql、Redis、Nginx、RabbitMQ、Elasticsearch、Mongodb,以及SpringBoot应用部署,基于CenterOS7.6。 Docker环境安装 安装yum-utils: yum install -y yum-utils device-mapper-persistent-data lvm2 为yum源添加docker仓库位置:
macrozheng
2019/07/22
1.6K0
mall在Linux环境下的部署(基于Docker容器)
Docker安装Mysql、Redis
参数 -v /mydata/mysql/data:/var/lib/mysql\ 将数据文件挂载到主机 :前面的是主机目的地址:后面的是容器中的目录地址
暴躁的程序猿
2022/06/02
3740
相关推荐
Docker实操:安装MySQL5.7详解(保姆级教程)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验