6.2. ノードの使用

管理者は、複数のタスクを実行して、クラスターを効率化できます。

6.2.1. ノード上の Pod を退避させる方法

Pod を退避させると、所定のノードからすべての Pod または選択した Pod を移行できます。

退避させることができるのは、レプリケーションコントローラーが管理している Pod のみです。レプリケーションコントローラーは、他のノードに新しい Pod を作成し、指定されたノードから既存の Pod を削除します。

ベア Pod、つまりレプリケーションコントローラーが管理していない Pod はデフォルトで影響を受けません。Pod セレクターを指定すると Pod のサブセットを退避できます。Pod セレクターはラベルに基づくので、指定したラベルを持つすべての Pod を退避できます。

手順

  1. Pod の退避を実行する前に、ノードをスケジュール対象外としてマークします。

    1. ノードにスケジュール対象外 (unschedulable) のマークを付けます。

      $ oc adm cordon <node1>

      出力例

      node/<node1> cordoned

    2. ノードのステータスが Ready,SchedulingDisabled であることを確認します。

      $ oc get node <node1>

      出力例

      NAME        STATUS                     ROLES     AGE       VERSION
      <node1>     Ready,SchedulingDisabled   worker    1d        v1.25.0

  2. 以下の方法のいずれかを使用して Pod を退避します。

    • 1 つ以上のノードで、すべてまたは選択した Pod を退避します。

      $ oc adm drain <node1> <node2> [--pod-selector=<pod_selector>]
    • --force オプションを使用してベア Pod の削除を強制的に実行します。true に設定されると、Pod がレプリケーションコントローラー、レプリカセット、ジョブ、デーモンセット、またはステートフルセットで管理されていない場合でも削除が続行されます。

      $ oc adm drain <node1> <node2> --force=true
    • --grace-period を使用して、各 Pod を正常に終了するための期間 (秒単位) を設定します。負の値の場合には、Pod に指定されるデフォルト値が使用されます。

      $ oc adm drain <node1> <node2> --grace-period=-1
    • true に設定された --ignore-daemonsets フラグを使用してデーモンセットが管理する Pod を無視します。

      $ oc adm drain <node1> <node2> --ignore-daemonsets=true
    • --timeout を使用して、中止する前の待機期間を設定します。値 0 は無限の時間を設定します。

      $ oc adm drain <node1> <node2> --timeout=5s
    • --delete-emptydir-data フラグを true に設定して、emptyDir ボリュームを使用する Pod がある場合にも Pod を削除します。ローカルデータはノードがドレイン (解放) される場合に削除されます。

      $ oc adm drain <node1> <node2> --delete-emptydir-data=true
    • true に設定された --dry-run オプションを使用して、実際に退避を実行せずに移行するオブジェクトをリスト表示します。

      $ oc adm drain <node1> <node2>  --dry-run=true

      特定のノード名 (例: <node1> <node2>) を指定する代わりに、--selector=<node_selector> オプションを使用し、選択したノードで Pod を退避することができます。

  3. 完了したら、ノードにスケジュール対象のマークを付けます。

    $ oc adm uncordon <node1>

6.2.2. ノードでラベルを更新する方法について

ノード上の任意のラベルを更新できます。

ノードラベルは、ノードがマシンによってバックアップされている場合でも、ノードが削除されると永続しません。

注記

MachineSet への変更は、コンピュートマシンセットが所有する既存のマシンには適用されません。たとえば、編集されたか、既存の MachineSet に追加されたラベルは、マシンセットに関連付けられた既存マシンおよびノードには伝播しません。

  • 以下のコマンドは、ノードのラベルを追加または更新します。

    $ oc label node <node> <key_1>=<value_1> ... <key_n>=<value_n>

    以下に例を示します。

    $ oc label nodes webconsole-7f7f6 unhealthy=true
    ヒント

    以下の YAML を適用してラベルを適用することもできます。

    kind: Node
    apiVersion: v1
    metadata:
      name: webconsole-7f7f6
      labels:
        unhealthy: 'true'
    #...
  • 以下のコマンドは、namespace 内のすべての Pod を更新します。

    $ oc label pods --all <key_1>=<value_1>

    以下に例を示します。

    $ oc label pods --all status=unhealthy

6.2.3. ノードをスケジュール対象外 (Unschedulable) またはスケジュール対象 (Schedulable) としてマークする方法

デフォルトで、Ready ステータスの正常なノードはスケジュール対象としてマークされます。つまり、新規 Pod をこのノードに配置できます。手動でノードをスケジュール対象外としてマークすると、新規 Pod のノードでのスケジュールがブロックされます。ノード上の既存 Pod には影響がありません。

  • 以下のコマンドは、ノードをスケジュール対象外としてマークします。

    出力例

    $ oc adm cordon <node>

    以下に例を示します。

    $ oc adm cordon node1.example.com

    出力例

    node/node1.example.com cordoned
    
    NAME                 LABELS                                        STATUS
    node1.example.com    kubernetes.io/hostname=node1.example.com      Ready,SchedulingDisabled

  • 以下のコマンドは、現時点でスケジュール対象外のノードをスケジュール対象としてマークします。

    $ oc adm uncordon <node1>

    または、特定のノード名 (たとえば <node>) を指定する代わりに、--selector=<node_selector> オプションを使用して選択したノードをスケジュール対象またはスケジュール対象外としてマークすることができます。

6.2.4. アプリケーション Pod をドレインせずにノードを再起動した場合の単一ノード OpenShift クラスターでのエラーの処理

単一ノードの OpenShift クラスターおよび OpenShift Container Platform クラスター一般では、最初にノードをドレインせずにノードの再起動が発生してしまう可能性があります。これは、デバイスを要求するアプリケーション Pod が UnexpectedAdmissionError エラーで失敗した場合に発生する可能性があります。DeploymentReplicaSet、または DaemonSet エラーが報告されるのは、これらのデバイスを必要とするアプリケーション Pod が、それらのデバイスにサービスを提供する Pod より前に開始されるためです。Pod の再起動の順序を制御できません。

この動作は想定範囲内ですが、正常にデプロイできなかった場合でも、Pod がクラスター上に残る可能性があります。Pod は、引き続き UnexpectedAdmissionError を報告します。この問題は、アプリケーション Pod が通常 DeploymentReplicaSet、または DaemonSet に含まれるため、軽減されます。Pod がこのエラー状態にある場合は、別のインスタンスが実行されているはずなので、ほとんど問題はありません。DeploymentReplicaSet、または DaemonSetの一部であることにより、後続の Pod の正常な作成と実行が保証され、アプリケーションは確実かつ正常にデプロイメントされます。

このような Pod が正常に終了するように、アップストリームで作業が進行されます。この作業が解決されるまで、単一ノードの OpenShift クラスターで失敗した Pod を削除するには、以下のコマンドを実行します。

$ oc delete pods --field-selector status.phase=Failed -n <POD_NAMESPACE>
注記

単一ノードの OpenShift クラスターでは、ノードをドレインするオプションは利用できません。

6.2.5. ノードの削除

6.2.5.1. クラスターからのノードの削除

OpenShift Container Platform クラスターからノードを削除するには、適切な MachineSet オブジェクトをスケールダウンします。

重要

クラスターがクラウドプロバイダーと統合されている場合、ノードを削除するには対応するマシンを削除する必要があります。このタスクに oc delete node コマンドは使用しないでください。

CLI を使用してノードを削除する場合、ノードオブジェクトは Kubernetes で削除されますが、ノード自体にある Pod は削除されません。レプリケーションコントローラーで管理されていないベア Pod は、OpenShift Container Platform からアクセスできなくなります。レプリケーションコントローラーで管理されるベア Pod は、他の利用可能なノードに再スケジュールされます。ローカルのマニフェスト Pod は削除する必要があります。

注記

ベアメタルでクラスターを実行している場合、MachineSet オブジェクトを編集してノードを削除することはできません。コンピュートマシンセットは、クラスターがクラウドプロバイダーに統合されている場合にのみ利用できます。代わりに、ノードを手作業で削除する前に、ノードをスケジュール解除し、ドレイン (解放) する必要があります。

手順

  1. 次のコマンドを実行して、クラスター内のコンピュートマシンセットを表示します。

    $ oc get machinesets -n openshift-machine-api

    コンピュートマシンセットは、<cluster-id>-worker-<aws-region-az> の形式で一覧表示されます。

  2. 次のいずれかの方法で、コンピュートマシンセットをスケールダウンします。

    • 次のコマンドを実行して、スケールダウンするレプリカの数を指定します。

      $ oc scale --replicas=2 machineset <machine-set-name> -n openshift-machine-api
    • 次のコマンドを実行して、コンピュートマシンセットのカスタムリソースを編集します。

      $ oc edit machineset <machine-set-name> -n openshift-machine-api

      出力例

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        # ...
        name: <machine-set-name>
        namespace: openshift-machine-api
        # ...
      spec:
        replicas: 2 1
        # ...

      1
      スケールダウンするレプリカの数を指定します。

6.2.5.2. ベアメタルクラスターからのノードの削除

CLI を使用してノードを削除する場合、ノードオブジェクトは Kubernetes で削除されますが、ノード自体にある Pod は削除されません。レプリケーションコントローラーで管理されないベア Pod は、OpenShift Container Platform からはアクセスできなくなります。レプリケーションコントローラーで管理されるベア Pod は、他の利用可能なノードに再スケジュールされます。ローカルのマニフェスト Pod は削除する必要があります。

手順

以下の手順を実行して、ベアメタルで実行されている OpenShift Container Platform クラスターからノードを削除します。

  1. ノードにスケジュール対象外 (unschedulable) のマークを付けます。

    $ oc adm cordon <node_name>
  2. ノード上のすべての Pod をドレイン (解放) します。

    $ oc adm drain <node_name> --force=true

    このステップは、ノードがオフラインまたは応答しない場合に失敗する可能性があります。ノードが応答しない場合でも、共有ストレージに書き込むワークロードを実行している可能性があります。データの破損を防ぐには、続行する前に物理ハードウェアの電源を切ります。

  3. クラスターからノードを削除します。

    $ oc delete node <node_name>

    ノードオブジェクトはクラスターから削除されていますが、これは再起動後や kubelet サービスが再起動される場合にクラスターに再び参加することができます。ノードとそのすべてのデータを永続的に削除するには、ノードの使用を停止 する必要があります。

  4. 物理ハードウェアを電源を切っている場合は、ノードがクラスターに再度加わるように、そのハードウェアを再びオンに切り替えます。