本ページでは、ノード管理に関するよくある質問について説明します。

クラスターの GPU ノードのカーネルを手動でアップグレードするにはどうすればよいですか。

次の手順を使用して、クラスターの GPU ノードのカーネルを手動でアップグレードできます。
現在のカーネルバージョンは、3.10.0-957.21.3 より前のバージョンです。
  1. kubectl を利用した Kubernetes クラスターへの接続.
  2. ターゲット GPU ノードをスケジュール対象外に設定します。 この例では、ノード cn-beijing.i-2ze19qyi8votgjz12345 をターゲットノードとして使用します。
    kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
  3. ターゲットノードのポッドを他のノードに移行します。
    # kubectl drain cn-beijing.i-2ze19qyi8votgjz12345 --grace-period=120 --ignore-daemonsets=true
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 cordoned
    WARNING: Ignoring DaemonSet-managed pods: flexvolume-9scb4, kube-flannel-ds-r2qmh, kube-proxy-worker-l62sf, logtail-ds-f9vbg
    pod/nginx-ingress-controller-78d847fb96-5fkkw evicted
  4. 既存の nvidia-driver をアンインストールします。
    この手順では、バージョン 384.111 ドライバーがアンインストールされます。 ドライバーのバージョンが 384.111 でない場合は、NVIDIA の公式 Web サイトからドライバーをダウンロードし、384.111 を実際のバージョン番号で置換する必要があります。
    1. GPU ノードにログインし、nvidia-smi コマンドを実行してドライバーのバージョンを確認します。
      # nvidia-smi -a | grep 'Driver Version'
      Driver Version                      : 384.111
    2. ドライバーのインストールパッケージをダウンロードします。
      cd /tmp/
      curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
      ドライバーをアンインストールするには、インストールパッケージが必要です。
    3. 既存のドライバーをアンインストールします。
      chmod u+x NVIDIA-Linux-x86_64-384.111.run
      . /NVIDIA-Linux-x86_64-384.111.run --uninstall -a -s -q
  5. カーネルをアップグレードします。
    ニーズに基づいてカーネルをアップグレードします。
  6. GPU ノードを再起動します。
    reboot
  7. GPU ノードにログインし、対応する kernel-devel パッケージをインストールします。
    yum install -y kernel-devel-$(uname -r)
  8. NVIDIA の公式 Web サイトにアクセスし、必要なドライバーをダウンロードしてターゲットノードにインストールします。 この例では、410.79 を使用しています。
    cd /tmp/
    curl -O https://cn.download.nvidia.cn/tesla/410.79/NVIDIA-Linux-x86_64-410.79.run
    chmod u+x NVIDIA-Linux-x86_64-410.79.run
    sh . /NVIDIA-Linux-x86_64-410.79.run -a -s -q
    
    # GPU のウォームアップ
    nvidia-smi -pm 1 || true
    nvidia-smi -acp 0 || true
    nvidia-smi --auto-boost-default=0 || true
    nvidia-smi --auto-boost-permission=0 || true
    nvidia-modprobe -u -c=0 -m || true
  9. /etc/rc.d/rc.local ファイルをチェックし、次の設定が含まれているかどうかを確認します。 含まれていない場合は、次の内容を追加します。
    nvidia-smi -pm 1 || true
    nvidia-smi -acp 0 || true
    nvidia-smi --auto-boost-default=0 || true
    nvidia-smi --auto-boost-permission=0 || true
    nvidia-modprobe -u -c=0 -m || true
  10. kubelet と Docker を再起動します。
    service kubelet stop
    service docker restart
    service kubelet start
  11. GPU ノードをスケジュール対象に設定します。
    # kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
  12. nvidia-device-plugin コンテナーで次のコマンドを実行し、GPU ノードにインストールされているドライバーのバージョンを確認します。
    kubectl exec -n kube-system -t nvidia-device-plugin-cn-beijing.i-2ze19qyi8votgjz12345 nvidia-smi
    Thu Jan 17 00:33:27 2019
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 410.79       Driver Version: 410.79       CUDA Version: N/A      |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla P100-PCIE...  On   | 00000000:00:09.0 Off |                    0 |
    | N/A   27C    P0    28W / 250W |      0MiB / 16280MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    docker ps コマンドを実行して GPU ノードでコンテナーが開始されていないことがわかった場合は、「GPU ノードでコンテナーを開始できない」をご参照ください。

GPU ノードでコンテナーが開始されない問題を修正するにはどうすればよいですか。

特定の Kubernetes バージョンがインストールされている GPU ノードで kubelet と Docker を再起動すると、再起動後にノードでコンテナーが開始されないことがあります。
# service kubelet stop
Redirecting to /bin/systemctl stop kubelet.service
# service docker stop
Redirecting to /bin/systemctl stop docker.service
# service docker start
Redirecting to /bin/systemctl start docker.service
# service kubelet start
Redirecting to /bin/systemctl start kubelet.service

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
以下のコマンドを実行して、cgroup ドライバーを表示します。
docker info | grep -i cgroup
Cgroup Driver: cgroupfs
この出力は、cgroup ドライバーが cgroupfs に設定されていることを示しています。

次の手順を使用して問題を修正できます。

  1. /etc/docker/daemon.json のコピーを作成し、次のコマンドを実行して /etc/docker/daemon.json を更新します。
    cat >/etc/docker/daemon.json <<-EOF
    {
        "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"
        },
        "oom-score-adjust": -1000,
        "storage-driver": "overlay2",
        "storage-opts":["overlay2.override_kernel_check=true"],
        "live-restore": true
    }
    EOF
  2. 次のコマンドを実行して Docker と kubelet を再起動します。
    # service kubelet stop
    Redirecting to /bin/systemctl stop kubelet.service
    # service docker restart
    Redirecting to /bin/systemctl restart docker.service
    # service kubelet start
    Redirecting to /bin/systemctl start kubelet.service
  3. 次のコマンドを実行し、cgroup ドライバーが systemd に設定されているかどうかを確認します。
    # docker info | grep -i cgroup
    Cgroup Driver: systemd