共享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 http://kubeflow.oss-cn-beijing.aliyuncs.com/nvidia.zip sudo unzip nvidia.zip sudo yum -y -q --nogpgcheck localinstall /tmp/nvidia/*
- 执行以下命令,配置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