10.2. ノードのメンテナンスモードへの設定

Web コンソール、CLI、または NodeMaintenance カスタムリソースを使用してノードをメンテナンス状態にします。

10.2.1. Web コンソールでのノードのメンテナンスモードへの設定

ComputeNodes 一覧で各ノードにある Options メニュー kebab を使用するか、または Node Details 画面の Actions コントロールを使用してノードをメンテナンスモードに設定します。

手順

  1. OpenShift Virtualization コンソールで、 ComputeNodes をクリックします。
  2. この画面からノードをメンテナンスモードに設定できます。 これにより、1 つの画面で複数のノードに対してアクションを実行することがより容易になります。 または、Node Details 画面からノードをメンテナンスモードに設定することもできます。 この場合、選択されたノードの総合的な詳細情報を確認できます。

    • ノードの末尾の Options メニュー kebab をクリックし、Start Maintenance を選択します。
    • ノード名をクリックし、Node Details 画面を開いて ActionsStat Maintenance をクリックします。
  3. 確認ウィンドウで Start Maintenance をクリックします。

ノードは liveMigration エビクションストラテジーを持つ仮想マシンインスタンスのライブマイグレーションを行い、このノードはスケジュール対象外となります。このノードの他のすべての Pod および仮想マシンは削除され、別のノードで再作成されます。

10.2.2. CLI でのノードのメンテナンスモードへの設定

ノードをスケジュール対象外としてマークし、oc adm drain コマンドを使用してノードから Pod をエビクトまたは削除して、ノードをメンテナンスモードに設定します。

手順

  1. ノードにスケジュール対象外 (unschedulable) のマークを付けます。ノードのステータスが NotReady,SchedulingDisabled に切り替わります。

    $ oc adm cordon <node1>
  2. メンテナンスの準備のためにノードをドレイン (解放) します。ノードは、LiveMigratable の状態が True に設定され、 spec:evictionStrategy フィールドが LiveMigrate に設定された仮想マシンインスタンスのライブマイグレーションを行います。このノードの他のすべての Pod および仮想マシンは削除され、別のノードで再作成されます。

    $ oc adm drain <node1> --delete-emptydir-data --ignore-daemonsets=true --force
    • --delete-emptydir-data フラグは、emptyDir ボリュームを使用するノード上の仮想マシンインスタンスを削除します。これらのボリュームのデータは一時的なものであり、終了後に削除しても問題はありません。
    • --ignore-daemonsets=true フラグは、デーモンセットは無視され、Pod のエビクションが正常に続行されるようにします。
    • --force フラグは、レプリカセットまたはデーモンセットコントローラーによって管理されない Pod を削除するために必要です。

10.2.3. NodeMaintenance カスタムリソースを使用したノードのメンテナンスモードへの設定

NodeMaintenance カスタムリソース (CR) を使用してノードをメンテナンスモードにできます。NodeMaintenance CR を適用する場合、許可されるすべての Pod はエビクトされ、ノードはシャットダウンします。エビクトされた Pod は、クラスター内の別のノードに移動するようにキューに置かれます。

前提条件

  • OpenShift Container Platform CLI (oc) をインストールしている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。

手順

  1. 以下のノードメンテナンス CR を作成し、そのファイルを nodemaintenance-cr.yaml として保存します。

    apiVersion: nodemaintenance.kubevirt.io/v1beta1
    kind: NodeMaintenance
    metadata:
      name: maintenance-example  1
    spec:
      nodeName: node-1.example.com 2
      reason: "Node maintenance" 3
    1
    ノードのメンテナンス CR 名
    2
    メンテナンスモードに設定するノードの名前
    3
    メンテナンスの理由のプレーンテキストの説明
  2. 以下のコマンドを実行してノードのメンテナンススケジュールを適用します。

    $ oc apply -f nodemaintenance-cr.yaml
  3. 以下のコマンドを実行して、<node-name> をノードの名前に置き換えて、メンテナンスタスクの進捗を確認します。

    $ oc describe node <node-name>

    出力例

    Events:
      Type     Reason                     Age                   From     Message
      ----     ------                     ----                  ----     -------
      Normal   NodeNotSchedulable         61m                   kubelet  Node node-1.example.com status is now: NodeNotSchedulable

10.2.3.1. 現在の NodeMaintenance CR タスクのステータスの確認

現在の NodeMaintenance CR タスクのステータスを確認できます。

前提条件

  • OpenShift Container Platform CLI (oc) をインストールしている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  • 以下のコマンドを実行して、現在のノードのメンテナンスタスクのステータスを確認します。

    $ oc get NodeMaintenance -o yaml

    出力例

    apiVersion: v1
    items:
    - apiVersion: nodemaintenance.kubevirt.io/v1beta1
      kind: NodeMaintenance
      metadata:
    ...
      spec:
        nodeName: node-1.example.com
        reason: Node maintenance
      status:
        evictionPods: 3   1
        pendingPods:
        - pod-example-workload-0
        - httpd
        - httpd-manual
        phase: Running
        lastError: "Last failure message" 2
        totalpods: 5
    ...

    1
    evictionPods はエビクションにスケジュールされる Pod 数です。
    2
    lastError は、最新のエビクションエラーが存在する場合は、最新のエビクションエラーを記録します。