Kubernetes 节点 GPU 支持
引言
本文将介绍如何在 Kubernetes 的节点上支持 GPU.
部署
接下来将介绍部署过程包含了以下几个部分
- 节点加入 Kubernetes,可以参考k8s deploy
- 安装 GPU 驱动
- 配置 nvidia-contaienr 运行时
- 安装 nvidia-device-plugin
安装 GPU 驱动
可以使用 ubuntu-drivers 工具安装 NVIDIA 驱动程序。
运行 ubuntu-drivers devices 命令获取 NVIDIA显卡和可用驱动程序的信息。
通常,最好安装推荐的驱动程序,当你决定使用驱动程序版本后请使用 apt 软件包管理器安装英伟达显卡驱动 nvidia-driver-535-server
由于我们安装的 Ubuntu-server,这里使用 server 版本
安装完成后,然后在终端运行命令 sudo reboot 重启系统。当返回到系统时,您可以在终端再次运行命令 nvidia-smi 启动监视工具查看图形卡/显卡的状态。
nvidia-smi 命令将显示所用驱动程序的版本以及有关NVIDIA显卡的其它信息。
sudo apt install nvidia-driver-535-server
sudo reboot
nvidia-smi参考 如何在 Ubuntu 20.04 安装 Nvidia 驱动程序 | myfreax
安装 nvidia-container-toolkit
我们需要配置 nvidia container用于节点支持GPU。
首先我们需要安装 nvidia container toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit接下来需要配置containerd 的运行时,执行以下命令
sudo nvidia-ctk runtime configure --runtime=containerd注意: 执行完以上命令之后,检查宿主机 /etc/containerd/config.toml 中 plugins."io.containerd.grpc.v1.cri".containerd.default_runtime_name 的值是否为 nvidia, 如果不是。需要在宿主机上修改 containerd 默认的 runtime 为 nvidia
sudo vim /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "nvidia"最后重启 containerd 服务
sudo systemctl restart containerd如果你使用的不是containerd,或者想查看详细过程请参考以下文档。
安装 nvidia-device-plugin
NVIDIA/k8s-device-plugin: NVIDIA device plugin for Kubernetes (github.com)
使用 helm部署
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvdp nvdp/nvidia-device-plugin \
--namespace nvidia-device-plugin \
--create-namespace \
--version 0.14.5 \
--values config.yaml节点 label
我们的集群中可能会有不同型号的 GPU 卡,在一些场景中,我们希望应用能够调度到相应型号的 GPU 卡上,这里我们使用 label 来给节点分类。如果想要使用某类 GPU 卡,只需要给应用增加 labelSelector.
kubectl label nodes kube-master-119 gpu-type=nvidia-geforce-rtx-4090
kubectl label nodes kube-node-120 gpu-type=nvidia-geforce-rtx-4090
kubectl label nodes kube-node-105 gpu-type=nvidia-rtx-a6000
kubectl label nodes kube-node-128 gpu-type=nvidia-geforce-rtx-4090
kubectl label nodes kube-node-106 gpu-type=nvidia-geforce-rtx-4090