すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:GPUノードのDockerランタイムのアップグレード

最終更新日:Oct 23, 2024

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 クラスターへの接続」をご参照ください。

  1. マスターノードで次のコマンドを実行して、指定したノードをクラスターから切断します。

    ノードにスケジュール不可としてラベルを付ける必要があります。 これにより、アップグレード中にポッドがノードにスケジュールされなくなります。

    kubectl cordon <NODE_NAME>
    説明

    <NODE_NAME> は、Dockerランタイムがアップグレードされるノードの名前を指定します。 kubectl get nodesコマンドを実行して、ノード名を照会できます。

  2. マスターノードで次のコマンドを実行して、ノードのポッドを移行します。

    ノードがクラスターから切断された後、ノード上のポッドを他の使用可能なノードに移行する必要があります。

    kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
    説明

    <NODE_NAME> は、Dockerランタイムがアップグレードされるノードの名前を指定します。

  3. 次のコマンドを実行して、kubeletとDockerランタイムを停止します。

    ノードのDockerランタイムをアップグレードする前に、kubeletとDockerランタイムを停止します。

    service kubelet stop
    docker rm -f $(docker ps -aq)
    service docker stop
  4. 次のコマンドを実行して、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*
  5. 次のコマンドを実行して、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
  6. 次のコマンドを実行して、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 .)
  7. 次のコマンドを実行して、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/*
  8. 次のコマンドを実行して、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
    }
  9. 次のコマンドを実行して、Dockerランタイムとkubeletを開始します。

    service docker start
    service kubelet start
  10. 次のコマンドを実行して、ノードをクラスターに接続します。

    ノードのDockerランタイムがアップグレードされた後、ノードはクラスターでスケジュール可能な状態に変更されます。

    kubectl uncordon <NODE_NAME>
    説明

    <NODE_NAME> は、Dockerランタイムがアップグレードされたノードの名前を指定します。

  11. 次のコマンドを実行して、ノードでGPUインストーラを再起動します。

    docker ps |grep cgpu-installer | awk '{print $1}' | xargs docker rm -f