nvidia-container-runtime を使用して Docker を 19.03.5 にアップグレードし、クラスターノード上で共有 GPU リソース分離を有効にします。
背景情報
nvidia-container-runtime を使用すると、GPU アクセラレーション対応の Docker コンテナをビルドおよび実行できます。このコンポーネントは、NVIDIA GPU を使用するようにコンテナを自動的に設定します。
前提条件
以下を確認してください:
-
CentOS または Alibaba Cloud Linux 2 を実行している GPU ノードがあること
-
kubectl が ACK クラスターに接続されています。詳細については、「kubectl を使用してクラスターに接続する」をご参照ください。
-
kubectl get nodesから GPU ノード名を取得していること。以下の手順では、<NODE_NAME>をこの値に置き換えてください
操作手順
ノードの cordon
マスターノードで次のコマンドを実行して、対象ノードをスケジュール不可としてマークし、アップグレード中の新しい Pod のスケジューリングをブロックします。
kubectl cordon <NODE_NAME>
ノードの drain
既存の Pod を他の利用可能なノードに移行します。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
GPU ノードへのログインとサービスの停止
アップグレードの前に、kubelet と Docker を停止します。
service kubelet stop
docker rm -f $(docker ps -aq)
service docker stop
Docker と nvidia-container-runtime の削除
既存の Docker ランタイムと nvidia-container-runtime パッケージを削除します。
yum remove -y docker-ce docker-ce-cli containerd
yum remove -y nvidia-container-runtime* libnvidia-container*
daemon.json のバックアップ
現在の設定を確認してから、バックアップとしてファイルを /tmp に移動します。
-
現在の設定を確認します。出力例:
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 } -
ファイルを
/tmpに移動します:mv /etc/docker/daemon.json /tmp
Docker 19.03.5 のインストール
Docker 19.03.5 をダウンロードしてインストールします。
VERSION=19.03.5
URL=http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/public/pkg/docker/docker-${VERSION}.tar.gz
curl -ssL $URL -o /tmp/docker-${VERSION}.tar.gz
cd /tmp
tar -xf docker-${VERSION}.tar.gz
cd /tmp/pkg/docker/${VERSION}/rpm
yum localinstall -y $(ls .)
nvidia-container-runtime 3.1.0 のインストール
nvidia-container-runtime 3.1.0 をダウンロードしてインストールします。
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 の復元
バックアップした設定ファイルを復元します。
-
ファイルを復元します:
mv /tmp/daemon.json /etc/docker/daemon.json -
設定を確認します。出力例:
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 の起動
Docker と kubelet を起動します。
service docker start
service kubelet start
ノードの uncordon
ノードをスケジュール可能としてマークして、Pod のスケジューリングを再開します。
kubectl uncordon <NODE_NAME>
cGPU インストーラーの再起動
ノード上の cGPU インストーラーを再起動します。
docker ps |grep cgpu-installer | awk '{print $1}' | xargs docker rm -f