共享GPU的隔离能力依赖Docker 19.03.5以及与其对应的Nvidia-container-runtime版本,如果Kubernetes集群节点安装的Docker版本低于19.03.5,您需要将其升级至19.03.5。本文介绍如何升级Docker以及与其对应的Nvidia-container-runtime,从而使节点支持共享GPU。
背景信息
Nvidia-container-runtime允许用户构建和运行GPU加速的Docker容器,能够自动对容器进行配置,以达到容器使用Nvidia GPU的目的。
操作步骤
本文操作步骤仅适用于CentOS和Alibaba Cloud Linux 2操作系统。
在执行以下操作前,您需要使用命令行工具连接您的Kubernetes集群。详情请参见获取集群KubeConfig并通过kubectl工具连接集群。
在Master节点执行以下命令,下线节点。
为避免在Docker升级期间,有Pod调度到该节点,您需要将节点标记为不可调度。
kubectl cordon <NODE_NAME>
说明<NODE_NAME>为待升级Docker版本的节点名称。执行命令kubectl get nodes查询节点名称。
在Master节点上执行以下命令,迁移节点中的Pod。
节点下线以后,需要将该节点上的Pod迁移至其他节点。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
说明<NODE_NAME>为待升级Docker版本的节点。
执行以下命令,暂停kubelet和Docker服务。
在待升级Docker版本的节点上停止kubelet和Docker服务。
sudo service kubelet stop sudo docker rm -f $(docker ps -aq) sudo service docker stop
执行以下命令,卸载Docker和Nvidia-container-runtime。
在待升级Docker版本的节点上卸载旧版Docker和Nvidia-container-runtime。
sudo yum remove -y docker-ce docker-ce-cli containerd sudo yum remove -y nvidia-container-runtime* libnvidia-container*
执行以下命令,备份并移除daemon.json文件。
sudo cat /etc/docker/daemon.json { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "10" }, "bip": "169.254.123.1/24", "oom-score-adjust": -1000, "storage-driver": "overlay2", "storage-opts":["overlay2.override_kernel_check=true"], "live-restore": true } sudo mv /etc/docker/daemon.json /tmp
执行以下命令,安装Docker。
在待升级Docker版本的节点上下载Docker安装包。
VERSION=19.03.5 URL=http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/public/pkg/docker/docker-${VERSION}.tar.gz sudo curl -ssL $URL -o /tmp/docker-${VERSION}.tar.gz sudo cd /tmp sudo tar -xf docker-${VERSION}.tar.gz sudo cd /tmp/pkg/docker/${VERSION}/rpm sudo yum localinstall -y $(ls .)
执行以下命令,在节点上安装Nvidia-container-runtime。
sudo cd /tmp sudo yum install -y unzip sudo wget https://aliacs-k8s-cn-hongkong.oss-cn-hongkong.aliyuncs.com/public/pkg/nvidia-container-runtime/nvidia-container-runtime-3.13.0-linux-amd64.tar.gz sudo tar -xvf nvidia-container-runtime-3.13.0-linux-amd64.tar.gz sudo yum -y -q --nogpgcheck localinstall pkg/nvidia-container-runtime/3.13.0/common/*
执行以下命令,配置daemon.json。
将上述的daemon.json覆盖/etc/docker/daemon.json,使原有配置生效。
sudo mv /tmp/daemon.json /etc/docker/daemon.json sudo cat /etc/docker/daemon.json { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "10" }, "bip": "169.254.123.1/24", "oom-score-adjust": -1000, "storage-driver": "overlay2", "storage-opts":["overlay2.override_kernel_check=true"], "live-restore": true }
执行以下命令,启动Docker和kubelet服务。
sudo service docker start sudo service kubelet start
执行以下命令,上线节点。
节点Docker升级完成后,使节点在集群中的状态变成可调度。
kubectl uncordon <NODE_NAME>
说明<NODE_NAME>为升级完Docker版本的节点名称。
执行以下命令,在该GPU节点重新启动GPU安装程序。
sudo docker ps |grep cgpu-installer | awk '{print $1}' | xargs docker rm -f