直播预告
下周四晚8点半,将带你走进IoT的世界。企业在落地边缘计算的过程会遇到哪些挑战?什么是MQTT协议?如何设计企业的边缘架构?如何实现边缘侧的IoT设备管理?下节课通通告诉你!
点击【阅读原文】或访问以下链接即可报名:
http://z-mz.cn/PmxP
![c2c5fcaa32a2258f10a189b084dec423.png](https://i-blog.csdnimg.cn/blog_migrate/9c8fef434ac618aaa8419c744d73b7df.png)
前 言
本篇文章主要是配合Rancher的k3s进阶之路第四期《k3s实战演练(一):如何与GPU结合使用》,培训内容可以参考在线视频链接:
http://z-mz.cn/PmxF
本文内容作为这一期课程的补充,提供了非常详细的k3s环境中GPU相关的程序安装步骤。其中包括两种支持方式:Docker+GPU,以及Containerd+GPU。本文的目的是希望大家可以以此作为参考,减少初始入门时的安装困扰,把更多的精力放在场景落地和创新上。
本文使用的k3s版本为v1.17.3+k3s1,操作系统使用Ubuntu 18.04。
安装详解
安装cuda-drivers
准备GPU设备的主机,本文使用AWS的p2.2xlarge实例,它拥有一块Nvidia GPU卡,我们可以用于测试。首先需要安装cuda-drivers,这是我们能够在用户空间调用GPU做运算的驱动,所以主机上必须按照。在Nvidia官网可以找到下载链接,可以根据自身OS的需求选择,下面示例使用Ubuntu 18.04:
# https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork# 注意最后一行,我们只需安装cuda-drivers即可,不需要其他的cuda-toolkit wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"sudo apt-get update sudo apt-get -y install cuda-drivers # 注意安装后请重启reboot
运行时的选择
由于k3s支持Docker和Containerd用于容器管理,所以针对GPU容器的使用,我们也可以分为两种形式。
使用Nvidia-docker2
如果使用Docker,我们需要安装nvidia-docker2,参考下面示例:
# https://github.com/NVIDIA/k8s-device-plugin#preparing-your-gpu-nodes distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get update && sudo apt-get install -y nvidia-docker2sudo systemctl enable docker
安装完nvidia-docker2后,我们要确保设置default runtime设置到nvidia:
# /etc/docker/daemon.json{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }} sudo systemctl restart docker
一切妥当后,可以测试nvidia-docker2是否工作正常,启动一个示例容器查看运行结果:
# 检查nvidia-docker2可以起一个容器来测试docker run --rm nvidia/cuda:9.0-base nvidia-smi # 只有一块Tesla K80+-----------------------------------------------------------------------------+| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 ||-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. ||===============================+======================+======================|| 0 Tesla K80 On | 00000000:00:1E.0 Off | 0 || N/A 38C P8 31W / 149W | 0MiB / 11441MiB | 0% Default |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| Processes: GPU Memory || GPU PID Type Process name Usage ||=============================================================================|| No running processes found |+-----------------------------------------------------------------------------+
安装k3s,注意使用docker runtime:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -s -
使用Containerd
如果我们保持使用k3s中内置的containerd,我们需要单独安装Nvidia-container-runtime:
# https://nvidia.github.io/nvidia-container-runtime/# https://github.com/NVIDIA/nvidia-container-runtime curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \ sudo apt-key add -distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \ sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.listsudo apt-get updatesudo apt-get install nvidia-container-runtime
安装k3s并修改containerd配置,确保containerd可以使用nvidia-container-runtime:
curl -sfL https://get.k3s.io | sh - # /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl# 注意version=2 version = 2 [plugins."io.containerd.internal.v1.opt"] path = "/var/lib/rancher/k3s/agent/containerd" [plugins."io.containerd.grpc.v1.cri"] stream_server_address = "127.0.0.1" stream_server_port = "10010" sandbox_image = "docker.io/rancher/pause:3.1" [plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/var/lib/rancher/k3s/data/xxxxx/bin" conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d" [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "nvidia" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "nvidia-container-runtime" # 确保Nvidia相关程序在containerd的执行路径中cd /var/lib/rancher/k3s/data/*/ln -s /usr/bin/nvidia-container-cli .ln -s /usr/bin/nvidia-container-runtime .ln -s /usr/bin/nvidia-container-runtime-hook .ln -s /usr/bin/nvidia-container-toolkit . # 重启让containerd配置生效systemctl restart k3s
安装nvidia-device-plugin
运行时就绪后,我们需要安装k8s-device-plugin,它可以让kubelet获取GPU信息,进而使k3s拥有GPU卡资源的调度能力:
# https://github.com/NVIDIA/k8s-device-pluginkubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
确保device-plugin正常启动,可以检查其日志:
Loading NVMLFetching devices.Starting FS watcher.Starting OS watcher.Starting GRPC serverStarting to serve on /var/lib/kubelet/device-plugins/nvidia.sockRegistered device plugin with Kubelet
这里需要特殊说一下,先前版本的k3s在安装nvidia-device-plugin时需要手动修改一些挂载路径,通过本文验证这个问题已经被修复。参考issue:
https://github.com/rancher/k3s/issues/1390
现在,你可以运行你的GPU workload,当然如果导入Rancher后管理,会更加方便。
后 记
针对各个边缘环境中k3s集群增加GPU管理能力,并通过云端Rancher统一管理,对于边缘AI场景,可以形成一套云边协同的基础设施平台。而这一切的基础就是计算引擎对GPU的有效管理,Rancher也会加大投入,尤其是和Nvidia等此领域核心厂商合作共建生态,提供更好的产品输出。
别忘了下周四晚8点半的直播!带你走进IoT的世界。企业在落地边缘计算的过程会遇到哪些挑战?什么是MQTT协议?如何设计企业的边缘架构?如何实现边缘侧的IoT设备管理?下节课通通告诉你!
点击【阅读原文】或访问以下链接即可报名:
http://z-mz.cn/PmxP
About k3s
k3s 是目前全球用户量最大的 CNCF 认证轻量级 K8S 发行版。自 2019 年 3 月发布以来,备受全球开发者们关注。发行后仅用了10个月,GitHub Stars 数已超过 11,000,成为了开源社区最受欢迎的边缘计算 K8S 解决方案。
k3s 专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计,将满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的发布,为开发者们提供了以“Rancher 2.X + k3s”为核心的从数据中心到云到边到端的 K8S 即服务(Kubernetes-as-a-Service),推动 Kubernetes Everywhere。
![ba4ad6dfb5ca7eb3d1b8c987ee028a96.png](https://i-blog.csdnimg.cn/blog_migrate/540c3a83fa331201f70a445b0ea58715.jpeg)
扫码添加k3s中文社区助手
加入官方中文技术社区
官网:https://k3s.io
点击【阅读原文】,参加课程,了解IoT场景管理!
↓↓↓