当前位置: 首页 > Linux

Kubernetes和GPU一起飞

时间:2023-04-07 01:06:38 Linux

系列将从基础知识到源码对Kubelet组件进行深度回顾。在这篇《Kubernetes和GPU一起飞翔》中,zouyee将首先介绍Nvidia系列GPU如何支持Kubernetes,然后介绍DevicePlugin的相关概念和Kubelet组件DeviceManager的源码。1.背景介绍1.1需求说明Kubernetes1.8之前,用户在使用GPU等设备时,推荐使用AcceleratorsFeatureGate内置的方法,延续了Kubernetes插件的实现理念,各司其职.在Kubernetes1.10之后,引入了devices插件框架,允许用户将系统硬件资源引入到Kubernetes生态中。本文将介绍如何安装和部署NVIDIAGPU,DevicePlugins介绍,工作机制和源码分析,包括插件框架,GPU的使用和调度,异常处理和优化。1.2相关技术在Kubernetes1.10中,DevicePlugins升级为Beta特性。在Kubernetes1.8中,为了让第三方厂商通过插件的方式将设备资源接入到Kubernetes中,为容器提供了ExtendedResources。通过DevicePlugins方式,用户不需要改动Kubernetes的代码,第三方设备厂商可以开发插件来实现KubernetesDevicePlugins的相关接口(仔细想想,Kubernetes中的volume管理是不是也是类似的逻辑?CSI、CNI、CRI?)。目前DevicePlugins的典型实现包括:a)AMDGPU插件b)Intel设备插件:GPU、FPGA和QuickAssist设备c)KubeVirt用于硬件辅助虚拟化设备插件d)GPU插件由Nvidia提供e)高性能低延迟RDMACard插件f)低延迟Solarflare10GigabitNIC驱动程序g)SR-IOV网络设备插件h)XilinxFPGA设备插件Deviceplugins暴露了几个gRPC服务启动时提供服务,提供服务通过/var/lib/kubelet/device-plugins/kubelet.sock与kubelet通信。2.部署介绍目前NvidiaGPU提供了三种部署方式:docker方式、containerd方式和operator方式。由于以后不再内置docker,相关说明可以参考《关于放弃Kubernetes内置dockerCRI功能的说明》。下面主要介绍Containerd的部署,Operator方法单独写。目前nvidia-container-toolkit已经支持containerd和cri-o在接受containerd部署之前,说明一下前期遇到的相关问题:1)Errorwhiledialingdialunix:///run/containerd/containerd.sockwhereKubelet问题描述:Events:TypeReasonAgeFromMessage----------------------------NormalScheduled10mdefault-schedulerSuccessfullyassignedgpu-operator-resources/nvidia-device-plugin-daemonset-f99md到cl-gpu-md-0-f4gm6警告InspectFailed10m(x3超过10m)kubelet无法检查图像“nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2”:rpcerror:code=Unavailabledesc=allSubConnsareinTransientFailure,latestconnectionerror:connectionerror:desc="transport:Errorwhiledialingdialunix/run/containerd/containerd.sock:connect:connectionrefused"哪里与NvidiaDevicePluginDaemonset的Pod相关的错误如下#kubectllogs-fnvidia-device-plugin-daemonset-q9svq-nkube-system2021/02/1101:32:29LoadingNVML2021/02/1101:32:29无法初始化NVML:无法加载NVML库。2021/02/1101:32:29如果这是GPU节点,您是否将docker默认运行时设置为`nvidia`?2021/02/1101:32:29您可以在以下位置查看先决条件:https://github.com/NVIDIA/k8s-device-plugin#prerequisites2021/02/1101:32:29您可以了解如何设置runtimeat:https://github.com/NVIDIA/k8s-device-plugin#quick-start2021/02/1101:32:29如果这不是GPU节点,你应该设置一个toleration或nodeSelector来只部署这个插件在GPU节点上的问题是由于containerd的配置文件containerd.toml没有修改default_runtime_name="runc"todefault_runtime_name="nvidia"相关问题:https://github.com/NVIDIA/gpu-operator/问题/1432)devices.allow:没有这样的文件或目录:未知相关问题:https://github.com/NVIDIA/libnvidia-container/issues/119c在kubelet中配置groupdriver为systemd时,Nvidia的containerprestarthook在处理cgroup路径逻辑与containerd不一致containerd[76114]:time="2020-12-04T08:52:13.029072066Z"level=errormsg="StartContainerfor"7a1453c6e7ab8af7395ccc8dac5efcffa94a0834aa7b252e1dcd5b51f92bf13e"failed"error="创建containerd任务失败:OCI运行时创建失败:container_linux.go:370:启动容器进程导致:process_linux.go:459:容器初始化导致:运行挂钩#0::错误运行挂钩:退出状态1,标准输出:,标准错误:nvidia-container-cli:安装错误:打开失败:/sys/fs/cgroup/devices/system.slice/containerd.service/kubepods-pod80540e95304d8cece2ae2afafd8b8976.slice/devices.allow:没有这样的文件或目录:unknown”的解决方案是升级libnvidia-container或者container-toolkit接下来介绍部署相关的内容。2.1Containerd版本说明版本说明软件名称CentOS操作系统4.19.25内核版本TeslaT4GPU型号418.39驱动程序版本10.1CUDA版本1.18.5K8Sv0.7.3NvidiaDevicepluginv1.4.3Containerd1.0.0-rc1runc安装说明:如下内网离线部署,如果是联网环境,直接参考部署步骤和部署配置a。安装驱动$tar‐zxvfgpu.tar.gz##安装依赖$cdgpu/runtime$tar‐zxvfdependency.tar.gz$cddependency##检查NvidiaGPU是否支持CUDA$cd./lspci/$yumlocalinstall-y*.rpm$lspci|grep-invidia##installdevel$cd../devel$yumlocalinstall-y*.rpm##安装gcc$cd../gcc$yumlocalinstall-y*.rpm##卸载nouveau驱动$lsmod|grepnouveau$rmmodnouveau##安装驱动,过程见下图。如果要更新驱动程序,请从https://developer.nvidia.com/cuda‐75‐downloads‐archive下载它$cd../../../driver$shcuda_10.1.105_418.39_linux.run##测试驱动如果有如下输出,则表示正常安装,执行命令验证结果$nvidia-smi附:安装驱动图(1)输入accept,回车(2)选择install,回车b.配置Containerd##更新runc,下载地址https://github.com/opencontainers/runc/releases$cd../runtime$cprunc/usr/bin/##更新containerd,下载地址https://github.com/containerd/containerd/releases$tar-zxvfcontainerd-1.4.3-linux-amd64.tar.gz$cpbin/*/usr/bin/##安装nvidia-container-runtime,yumsourcehttps://nvidia。github.io/nvidia-docker/centos7/nvidia-docker.repo,yum安装:yuminstall-ynvidia-container-runtime$tar-zxvfnvidia-container-runtime.tar.gz$cdnvidia-container-runtime$yumlocalinstall‐y*.rpmmodifycontainerdstartupparameters#配置containerd参数$mkdir/etc/containerd/$vi/etc/containerd/config.toml#配置containerd.service$vi/usr/lib/systemd/system/containerd.service$systemctldaemon-reload$systemctlrestartcontainerd#配置crictl$tar-zxvfcrictl-v1.18.0-linux-amd64.tar.gz$mvcrictl/usr/bin/$vi/etc/profilealiascrictl='crictl--runtime-endpointunix:///run/containerd/containerd.sock'$source/etc/profile#测试containerd和nvidia-container-runtime是否安装成功$cdtest-image$ctrimagesimportcuda-vector-add_v0.1.tar$ctrimagespush--plain-httpregistry.paas/cmss/cuda-vector-add:v0.1执行检查ctrrun-t-gpus0registry.paas/cmss/cuda-vector-add:v0.1cpnvidia-smi结果如下:清理容器ctrcrmcp1)config.tomlexecutecontainerdconfigdefault>/etc/containerd/config.toml生成配置,做如下修改:注意:如上所说,1)default_runtime_name的值为nvidia,2)添加一个runtimes3)如果有内部镜像仓库,可以修改docker.io为Internalrepositoryname2)containerd.service[Unit]Description=containerdcontainerruntimeDocumentation=https://containerd.ioAfter=network.target[Service]ExecStartPre=‐/sbin/modprobeoverlayExecStart=/usr/bin/containerdKillMode=processDelegate=yesLimitNOFILE=1048576#具有非零的Limit*s会导致性能问题,因为内核中的计算开销。我们推荐建议使用cgroups进行容器本地记账。LimitNPROC=infinityLimitCORE=infinityTasksMax=infinity[安装]WantedBy=multi-user.targetc。部分DevicePlugin在部分完成Kubernetes集合后,修改kubelet运行时配置:$vi/apps/conf/kubernetes/kubelet.env‐container‐runtime=remote‐container‐runtime‐endpoint=unix:///run/containerd/containerd.sock$cddevice-plugin$dockerload-ik8s-device-plugin_v0.7.3.tar$dockerpush//https://github.com/NVIDIA/k8s-device-plugin/tree/master/deployments/static$kubectlapply-fnvidia-device-plugin.yml$kubectllogs-fnvidia-device-plugin-daemonset-q9svq-nkube-system2021/02/0806:32:36加载NVML2021/02/0806:32:42启动FS观察器。2021/02/0806:32:42启动操作系统观察器。2021/02/0806:32:42检索插件。2021/02/0806:32:42为“nvidia.com/gpu”启动GRPC服务器2021/02/0806:32:42开始在/var/lib/kubelet/device上为“nvidia.com/gpu”提供服务-plugins/nvidia-gpu.sock2021/02/0806:32:42注册设备带有Kubeletd的'nvidia.com/gpu'插件。功能测试$cdtest-image#启动测试pod$kubectlapply-fdemo.yml//https://github.com/NVIDIA/gpu-operator/blob/master/tests/gpu-pod.yaml$kubectllogs-fcuda-vector-add[向量添加50000个元素]将输入数据从主机内存复制到CUDA设备CUDA内核启动,有196个块,每块256个线程将输出数据从CUDA设备复制到主机内存测试通过完成后续相关内容请查看公众号:DCOShttps://mp.weixin.qq.com/s/kl...