共用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 cd /tmp sudo tar -xf docker-${VERSION}.tar.gz cd /tmp/pkg/docker/${VERSION}/rpm sudo yum localinstall -y $(ls .)執行以下命令,在節點上安裝Nvidia-container-runtime。
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