Kubernetesクラスター内の複数のノードで共有されているGPUリソースを分離するには、Docker 19.03.5とそのnvidia-container-runtimeバイナリを使用する必要があります。 Dockerランタイムのバージョンが19.03.5より前の場合、DockerランタイムをDocker 19.03.5にアップグレードする必要があります。 このトピックでは、これらのノードでDockerランタイムとそのnvidia-container-runtimeバイナリをアップグレードして、これらのノード間でGPUを共有する方法について説明します。
背景情報
nvidia-container-runtimeバイナリを使用すると、GPUで高速化されたDockerコンテナを構築および実行できます。 バイナリはコンテナーを自動的に構成します。 これにより、コンテナがNVIDIA GPUリソースを使用できるようになります。
手順
このトピックで説明する手順は、CentOSおよびAlibaba Cloud Linux 2にのみ適用されます。
次の手順を実行する前に、コマンドラインインターフェイス (CLI) を使用してContainer Service for Kubernetes (ACK) クラスターに接続する必要があります。 詳細については、「kubectl を利用した Kubernetes クラスターへの接続」をご参照ください。
マスターノードで次のコマンドを実行して、指定したノードをクラスターから切断します。
ノードにスケジュール不可としてラベルを付ける必要があります。 これにより、アップグレード中にポッドがノードにスケジュールされなくなります。
kubectl cordon <NODE_NAME>
説明<NODE_NAME> は、Dockerランタイムがアップグレードされるノードの名前を指定します。 kubectl get nodesコマンドを実行して、ノード名を照会できます。
マスターノードで次のコマンドを実行して、ノードのポッドを移行します。
ノードがクラスターから切断された後、ノード上のポッドを他の使用可能なノードに移行する必要があります。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
説明<NODE_NAME> は、Dockerランタイムがアップグレードされるノードの名前を指定します。
次のコマンドを実行して、kubeletとDockerランタイムを停止します。
ノードのDockerランタイムをアップグレードする前に、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ファイルをバックアップおよび削除します。
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 } 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 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をノードにインストールします。
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ファイルを作成します。
/etc/docker/daemon.jsonファイルに指定された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を開始します。
service docker start service kubelet start
次のコマンドを実行して、ノードをクラスターに接続します。
ノードのDockerランタイムがアップグレードされた後、ノードはクラスターでスケジュール可能な状態に変更されます。
kubectl uncordon <NODE_NAME>
説明<NODE_NAME> は、Dockerランタイムがアップグレードされたノードの名前を指定します。
次のコマンドを実行して、ノードでGPUインストーラを再起動します。
docker ps |grep cgpu-installer | awk '{print $1}' | xargs docker rm -f