K8s集群gpu支持(直通和vgpu)

这篇具有很好参考价值的文章主要介绍了K8s集群gpu支持(直通和vgpu)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.gpu直通方式

1-1v1.8之前的老版本:基于nvidia-docker实现(基本不用了,了解)

前期准备:1、nvidia driver 2、cuda 3、nvidia-docker

K8s 启动pod时指定参数,即可使用gpu

(1)alpha.kubernetes.io/nvidia-gpu 指定调用nvidia gpu的数量

(2)为了能让GPU容器运行起来,需要将Nvidia驱动和CUDA库文件指定到容器中。这里需要使用hostPath,您只需要将hostPath指定到/var/lib/nvidia-docker/volumes/nvidia_driver/384.98即可,并不需要指定多个bin和lib目录。

resources:

    limits:

        alpha.kubernetes.io/nvidia-gpu: 1

volumes:

    - hostPath:

        path: /usr/lib/nvidia-375/bin

        name: bin

    - hostPath:

        path: /usr/lib/nvidia-375

        name: lib

K8s版本:v1.8、v1.9、v1.10、v1.11和v1.12

传统的alpha.kubernetes.io/nvidia-gpu即将在1.11版本中下线,和GPU相关的调度和部署的代码将彻底从主干代码中移除。

取而代之的是通过Extended Resource+Device Plugin两个Kubernetes的内置模块,外加由设备提供商实现的相应Device Plugin, 完成从设备的集群级别调度至工作节点,到设备与容器的实际绑定,1.10之后的版本默认开启deviceplugins。仅需配置limits,无需指定volumes

    resources:

      limits:

        nvidia.com/gpu: 1

1-2、基于devicePlugins实现(重点)

根据官方说明,安装英伟达GPU plugin前必须安装好nvidia-docker2,但是docker19.0+版本又不需要安装nvidia-docker2了,所以我姑且试了一下,发现确实不需要安装nvidia-docker2,只需要配置/etc/docker/daemon.json文件,将默认运行时改成nvidia就可以了。(但如果你使用的是docker19.0以下的版本,还是老老实实安装官方教程走。)

K8s版本:v1.8、v1.9、v1.10、v1.11和v1.12

传统的alpha.kubernetes.io/nvidia-gpu在1.11版本中下线,和GPU相关的调度和部署的代码将彻底从主干代码中移除。取而代之的是通过Extended Resource+Device Plugin两个Kubernetes的内置模块,外加由设备提供商实现的相应Device Plugin, 完成从设备的集群级别调度至工作节点,到设备与容器的实际绑定,1.10之后的版本默认开启deviceplugins。

安装k8s前需要先禁用虚拟内存 swapoff –a,否则安装会出错

0、前提:安装好nvidia-driver驱动和支持的cuda,并禁用nouveau:lsmod | grep nouveau没有输出即禁用了。

  1. 安装nvidia-container-runtime(CentOS版本)

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.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

yum clean all

yum makecache

sudo yum install -y nvidia-container-toolkit nvidia-container-runtime

(Ubuntu版本:前面俩行命令都是一样的)

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

apt-get update

apt-get install -y nvidia-container-toolkit nvidia-container-runtime

若出现’dpkg 被中断,您必须手工运行 sudo dpkg –configure -a解决此问题’:删除 rm /var/lib/dpkg/updates/* ,重新构建即可sudo apt-get update

PS:如果是docker19.3以下版本需要安装nvidia-docker2:

# 添加nvidia-docker2源

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

# 安装nvidia-docker2,重载Docker daemon configuration

yum install -y nvidia-docker2

sudo pkill -SIGHUP dockerd

  1. 配置/etc/docker/daemon.json (centOS与unbuntu均是此目录,不存在需要手动创建)

# /etc/docker/daemon.json

{

    "default-runtime": "nvidia",

    "runtimes": {

        "nvidia": {

            "path": "/usr/bin/nvidia-container-runtime",

            "runtimeArgs": []

        }

    },

"registry-mirrors": ["https://3lz3ongc.mirror.aliyuncs.com"],

"live-restore": true

}

systemctl daemon-reload

systemctl restart docker

3、配置kubelet参数并启动deviceplugins(Kubernetes 1.10之前的版本,默认disable DevicePlugins,需要添加参数开启。1.10之后的版本无需添加kubelet参数,是默认开启的)

kubelet配置在文件/etc/sysconfig/kubelet中

增加配置:

KUBELET_EXTRA_ARGS=--fail-swap-on=false --cadvisor-port=4194 --feature-gates=DevicePlugins=true

重启服务:

systemctl daemon-reload

systemctl restart kubelet

kubectl命令使用时报错:The connection to the server 172.20.231.234:6443 was refused。Systemctl status kubelet查看是否还存活,journalctl -u kubelet 查看kubelet日志

4.创建daemonset(daemonset会在每个节点运行一个pod)

kubectl create -f - <<EOF

apiVersion: apps/v1

kind: DaemonSet

metadata:

  name: nvidia-device-plugin-daemonset

  namespace: kube-system

spec:

  selector:

    matchLabels:

      name: nvidia-device-plugin-ds

  updateStrategy:

    type: RollingUpdate

  template:

    metadata:

      # This annotation is deprecated. Kept here for backward compatibility

      # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/

      annotations:

        scheduler.alpha.kubernetes.io/critical-pod: ""

      labels:

        name: nvidia-device-plugin-ds

    spec:

      tolerations:

      # This toleration is deprecated. Kept here for backward compatibility

      # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/

      - key: CriticalAddonsOnly

        operator: Exists

      - key: nvidia.com/gpu

        operator: Exists

        effect: NoSchedule

      # Mark this pod as a critical add-on; when enabled, the critical add-on

      # scheduler reserves resources for critical add-on pods so that they can

      # be rescheduled after a failure.

      # See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/

      priorityClassName: "system-node-critical"

      containers:

      - image: nvidia/k8s-device-plugin:1.0.0-beta6

        name: nvidia-device-plugin-ctr

        securityContext:

          allowPrivilegeEscalation: false

          capabilities:

            drop: ["ALL"]

        volumeMounts:

          - name: device-plugin

            mountPath: /var/lib/kubelet/device-plugins

      volumes:

        - name: device-plugin

          hostPath:

            path: /var/lib/kubelet/device-plugins

EOF

5、查看GPU节点GPU卡数量

kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"

使用kubectl describe node也可查看资源。节点中gpu资源和cpu内存等一样,分配给pod使用后,其他pod无法再使用,资源不够pod是无法启动的

如果出现某个节点无法获取到gpu资源,需要从这些方面排查:

5.1查看一下 Device Plugin 的日志(即创建的daemonset日志,pod要部署到所有节点)

5.2检查Nvidia 的 runC 是否配置为 docker 默认 runC(运行时)

 /etc/docker/daemon.json"default-runtime": "nvidia", "runtimes": { "nvidia": {"path": "nvidia-container-runtime",  "runtimeArgs": []   } }  此配置即用于替换docker的默认runC

配置完使用docker info会看到相应的更改已生效。

Server Version: 18.09.6

Storage Driver: overlay

Cgroup Driver: cgroupfs

Runtimes: nvidia runc

Default Runtime: nvidia

Docker Root Dir: /data05

5.3检查Nvidia 驱动是否安装成功

6、测试k8s调度gpu:(ps:因为nvidia/cuda镜像是内置cuda的,所以需要指定版本和本机的匹配才行)

apiVersion: v1

kind: Pod

metadata:

  name: gpu-pod

spec:

  restartPolicy: Never

  containers:

  - image: nvidia/cuda:10.0-base

    name: cuda

    command: ["nvidia-smi"]

    resources:

      limits:

        nvidia.com/gpu: 1

kubectl create -f gpu-pod.yaml

kubectl logs gpu-pod   #查看是否有输入nvidia-msi信息

ps:注意k8s的gpu方案也是基于nvidia-docker的,docker19.03内置了。nvidia.com/gpu: 1分配gpu后,pod内默认是使用宿主机的nvidia驱动和cuda版本进行gpu调度所以pod内无需再安装cuda了节点中gpu资源和cpu内存等一样,分配给pod使用后,其他pod无法再使用,gpu资源不够了pod是无法启动的。

以上是Nvidia Gpu DevicePlugin:Nvidia 贡献的调度方案,这是最常用的调度方案;

除此之外还有GPU Share DevicePlugin:由阿里云服务团队贡献的 GPU 共享的调度方案,其目的在于解决用户共享 GPU 调度的需求

报错:CUDA error:out of memory 原因:gpu显存不足。 一块gpu可以被好多进程使用,每个进程使用一部分现存。

在matlab中第一次创建gpuArray,或者调用gpuDevice()会慢那么一点,可是接下来再调用就很快了。因为第一次启动要加载很多gpu库。

2、Orion vGPU

没有将物理GPU直通进容器内部,不依赖于nvidia-docker

Ps:使用的时vgpu虚拟化技术,对gpu显卡需求版本较高,需高价格的显卡,由于资金问题,此方案未测试。

配置pod指定参数,启用gpu

用户配置POD的yaml文件应该包含如下的内容

   resources:

     limits:

       virtaitech.com/gpu: 1

   env:

     - name : ORION_GMEM

       value : "4096"

上述表明该POD使用1个Orion的vGPU,每个vGPU的显存大小为4096MB

参考:https://gitee.com/teacherandchang/orion文章来源地址https://www.toymoban.com/news/detail-701290.html

到了这里,关于K8s集群gpu支持(直通和vgpu)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GPU虚拟化理解包含直通,k8s安装,GPU-manager

    vGPU,即真正意义上的GPU虚拟化方案,就是将一块GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,以vGPU为单位分配GPU的计算能力, 并将单块GPU卡分配给多台虚拟机使用,使得虚拟机能够运行3D软件、播放高清视频等,极大地提升了用户体验。真正实现了GPU资源的按需分

    2024年02月13日
    浏览(47)
  • 基于Docker的K8s(Kubernetes)集群部署

    开始搭建k8s集群 三台服务器修改主机名称 关闭对话窗口,重新连接 三台主机名称呢就修改成功了。 接下来修改每台节点的 hosts 文件 所有节点关闭 setLinux 查看是否关闭成功 为每个节点添加 k8s 数据源 如果安装docker数据源找不到yum-config 所有节点安装kubelet kubelet安装中… k

    2024年02月08日
    浏览(100)
  • K8s(Kubernetes)学习(二):k8s集群搭建

    minikube 只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。 裸机安装 至少需要两台机器(主节点、工作节点个一台),需要自己安装 Kubernetes 组件,配置会稍微麻烦点。 缺点:配置麻烦,缺少生态支持,例如负载均衡器、云存储。 直接用

    2024年02月09日
    浏览(62)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(69)
  • Kubernetes(K8S)集群部署

    目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节点加入集群 五、token过期怎么办?

    2024年02月07日
    浏览(84)
  • Kubernetes(k8s)集群安装部署

    名称 IP 系统 配置 主控节点 192.168.202.101 CentOS 7.9.2009 2核4G 工作节点1 192.168.202.102 CentOS 7.9.2009 2核4G 工作节点2 192.168.202.103 CentOS 7.9.2009 2核4G 2.1 升级操作系统内核 导入elrepo gpg key 安装elrepo YUM源仓库 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本 设置grub2默认引导为0 重

    2024年02月10日
    浏览(80)
  • yum部署kubernetes(k8s)集群、k8s常用资源管理

    目录 一、环境搭建 1、准备环境 1)计算机说明,建议系统版本7.4或者7.6 2)修改所有主机的计算机名设置host文件  2、安装master节点 1)安装etcd配置etcd 2)安装k8s-master节点 3)配置apiserver 4)配置controller和scheduler 5)启动k8s服务 3、安装k8s-master上的node 1)安装node 2)配置kube

    2024年02月13日
    浏览(64)
  • Kubernetes(k8s)集群部署----->超详细

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes(简称k8s)是一个开源的容器编排平台,可以帮助开发人员和运维团队更轻松地管理容器化应用程序。本文将详细介绍如何进行k8s集群的部署,以帮助读者快速搭建一个高可用、可伸缩的k8s集群。 1、操作系统:至少三台物理机或

    2024年02月05日
    浏览(65)
  • Containerd+Kubernetes搭建k8s集群

    视频教程地址:https://space.bilibili.com/3461573834180825/channel/seriesdetail?sid=3316691 之前写了一篇基于docker安装kubernetes的文章,这篇文档我们来使用containerd来安装kubernetes,相较于docker,containerd运行容器的时候效率更高,并且可以兼容docker镜像。基于docker安装kubernetes的文章地址:ht

    2024年02月07日
    浏览(46)
  • K8S:Rancher管理 Kubernetes 集群

    Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes 集群在混合云+本地数据中心的集中部署与管理, 以确保集群的安全性,加速企业数字化转型。超过 40000 家企业每天使用 Rancher 快速创新。 官网:https://docs.rancher.cn/ Rancher 和 k8s 都是用来作为容器的调度与

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包