4.2. ノードの使用

管理者として、クラスターの効率をさらに上げる多数のタスクを実行することができます。

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

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

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

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

注記

Pod の退避を実行するときは、先にノードをスケジュール対象外としてマークする必要があります。

$ oc adm cordon <node1>
NAME        STATUS                        ROLES     AGE       VERSION
<node1>     NotReady,SchedulingDisabled   worker   1d        v1.14.6+c4799753c

完了したら、oc adm uncordon を使ってノードをスケジュール対象としてマークします。

$ oc adm uncordon <node1>
  • 以下のコマンドは、1 つまたは複数のノードのすべてのまたは選択した Pod を退避します。

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

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

    $ oc adm drain <node1> <node2> --grace-period=-1
  • 以下のコマンドは、true に設定された --ignore-daemonsets フラグを使用して、 DeamonSet が管理する Pod を無視します。

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

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

    $ oc adm drain <node1> <node2> --delete-local-data=true
  • 以下のコマンドは、true に設定された --dry-run オプションを使用して、退避を実行せずに移行するオブジェクトを一覧表示します。

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

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

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

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

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

注記

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

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

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

    以下は例になります。

    $ oc label nodes webconsole-7f7f6 unhealthy=true
  • 以下のコマンドは、namespace 内のすべての Pod を更新します。

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

    以下は例になります。

    $ oc label pods --all status=unhealthy

4.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> オプションを使用して選択したノードをスケジュール対象またはスケジュール対象外としてマークすることができます。

4.2.4. マスターノードをスケジュール対象 (Schedulable) として設定

OpenShift Container Platform 4.2 の時点で、マスターノードをスケジュール対象 (Schedulable) に設定できるようになりました。つまり、新規 Pod はマスターノードに配置できるようになりました。デフォルトで、マスターノードはスケジュール対象ではありません。ただし、クラスターにワーカーノードが含まれていない場合、マスターノードはデフォルトでスケジュール対象としてマークされます。

重要

バージョン 4.2 では、ワーカーノードのないクラスターを作成する機能は、テクノロジープレビューとして、ベアメタルにデプロイされるクラスターのみで利用できます。すべてのクラスタータイプについては、マスターをスケジュール対象 (Schedulable) に設定できますが、ワーカーノードを保持する必要があります。

マスターノードをスケジュール対象/対象外としてマークするには、mastersSchedulable フィールドを設定します。

手順

  1. schedulers.config.openshift.io リソースを編集します。

    $ oc edit schedulers.config.openshift.io cluster
  2. mastersSchedulable フィールドを設定します。

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      creationTimestamp: "2019-09-10T03:04:05Z"
      generation: 1
      name: cluster
      resourceVersion: "433"
      selfLink: /apis/config.openshift.io/v1/schedulers/cluster
      uid: a636d30a-d377-11e9-88d4-0a60097bee62
    spec:
      mastersSchedulable: false 1
      policy:
        name: ""
    status: {}
    1
    マスターノードがスケジュール対象 (Schedulable) になるのを許可する場合は true に設定し、マスターノードがスケジュール対象となるのを拒否するは、false に設定します。
  3. 変更を適用するためにファイルを保存します。

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

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

手順

OpenShift Container Platform クラスターからノードを削除するには、適切な MachineSet を編集します。

  1. クラスターにある MachineSet を表示します。

    $ oc get machinesets -n openshift-machine-api

    MachineSet は <clusterid>-worker-<aws-region-az> の形式で一覧表示されます。

  2. MachineSet をスケーリングします。

    $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

MachineSet を使用してクラスターをスケーリングする方法の詳細は、MachineSet の手動によるスケーリングについて参照してください。

4.2.6. カーネル引数のノードへの追加

特殊なケースとして、クラスターのノードセットにカーネル引数を追加する必要がある場合があります。これは十分に注意して実行する必要があり、設定する引数による影響を十分に理解している必要があります。

警告

カーネル引数を正しく使用しないと、システムが起動不可能になる可能性があります。

設定可能なカーネル引数の例には、以下が含まれます。

  • selinux=0: SELinux (Security Enhanced Linux) を無効にします。実稼働環境には推奨されませんが、SELinux を無効にすると、パフォーマンスが 2%~ 3% 上がります。
  • nosmt: カーネルの対称マルチスレッド (SMT) を無効にします。マルチスレッドは、各 CPU の複数の論理スレッドを許可します。潜在的なクロススレッド攻撃に関連するリスクを減らすために、マルチテナント環境での nosmt の使用を検討できます。SMT を無効にすることは、基本的にパフォーマンスよりもセキュリティーを重視する選択をしていることになります。

カーネル引数の一覧と説明については、「Kernel.org カーネルパラメーター」を参照してください。

次の手順では、以下を識別する MachineConfig を作成します。

  • カーネル引数を追加する一連のマシン。この場合、ワーカーロールを持つマシン。
  • 既存のカーネル引数の最後に追加されるカーネル引数。
  • MachineConfig の一覧で変更が適用される場所を示すラベル。

前提条件

  • 作業用の OpenShift Container Platform クラスターに対する管理者権限が必要です。

手順

  1. OpenShift Container Platform クラスターの既存の MachineConfig を一覧表示し、MachineConfig にラベルを付ける方法を判別します。

    $ oc get MachineConfig
    NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   CREATED
    00-master                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    00-worker                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-master-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-master-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-worker-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    01-worker-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-master-1131169f-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-master-ssh                                                                                          2.2.0             30m
    99-worker-114e8ac7-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    99-worker-ssh                                                                                          2.2.0             30m
    rendered-master-b3729e5f6124ca3678188071343115d0            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
    rendered-worker-18ff9506c718be1e8bd0a066850065b7            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             30m
  2. カーネル引数を識別する MachineConfig ファイルを作成します (例: 05-worker-kernelarg-selinuxoff.yaml)。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker1
      name: 05-worker-kernelarg-selinuxoff2
    spec:
      config:
        ignition:
          version: 2.2.0
      kernelArguments:
        - selinux=03
    1
    新しいカーネル引数をワーカーノードのみに適用します。
    2
    Machineconfigs (05) 内の適切な場所を特定するための名前が指定されます (SELinux をオフにするためにカーネル引数を追加します)。
    3
    正確なカーネル引数を selinux=0として特定します。
  3. 新規の MachineConfig を作成します。

    $ oc create -f 05-worker-kernelarg-selinuxoff.yaml
  4. MachineConfig で新規の追加内容を確認します。

    $ oc get MachineConfig
    NAME                                                        GENERATEDBYCONTROLLER                      IGNITIONVERSION   CREATED
    00-master                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    00-worker                                                   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-master-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-master-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-worker-container-runtime                                 577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    01-worker-kubelet                                           577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    
    05-worker-kernelarg-selinuxoff                                                                         2.2.0             105s
    
    99-master-1131169f-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    99-master-ssh                                                                                          2.2.0             30m
    99-worker-114e8ac7-dae9-11e9-b5dd-12a845e8ffd8-registries   577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    99-worker-ssh                                                                                          2.2.0             31m
    rendered-master-b3729e5f6124ca3678188071343115d0            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
    rendered-worker-18ff9506c718be1e8bd0a066850065b7            577c2d527b09cd7a481a162c50592139caa15e20   2.2.0             31m
  5. ノードを確認します。

    $ oc get node
    NAME                           STATUS                     ROLES    AGE   VERSION
    ip-10-0-136-161.ec2.internal   Ready                      worker   28m   v1.14.6+90fadebfa
    ip-10-0-136-243.ec2.internal   Ready                      master   34m   v1.14.6+90fadebfa
    ip-10-0-141-105.ec2.internal   Ready,SchedulingDisabled   worker   28m   v1.14.6+90fadebfa
    ip-10-0-142-249.ec2.internal   Ready                      master   34m   v1.14.6+90fadebfa
    ip-10-0-153-11.ec2.internal    Ready                      worker   28m   v1.14.6+90fadebfa
    ip-10-0-153-150.ec2.internal   Ready                      master   34m   v1.14.6+90fadebfa

    変更が適用されているため、各ワーカーノードのスケジューリングが無効にされていることを確認できます。

  6. ワーカーノードのいずれかに移動し、カーネルコマンドライン引数 (ホストの /proc/cmdline 内) を一覧表示して、カーネル引数が機能することを確認します。

    $ oc debug node/ip-10-0-141-105.ec2.internal
    Starting pod/ip-10-0-141-105ec2internal-debug ...
    To use host binaries, run `chroot /host`
    
    sh-4.2# cat /host/proc/cmdline
    BOOT_IMAGE=/ostree/rhcos-... console=tty0 console=ttyS0,115200n8
    rootflags=defaults,prjquota rw root=UUID=fd0... ostree=/ostree/boot.0/rhcos/16...
    coreos.oem.id=qemu coreos.oem.id=ec2 ignition.platform.id=ec2 selinux=0
    
    sh-4.2# exit

    selinux=0 引数が他のカーネル引数に追加されていることを確認できるはずです。

4.2.7. 追加リソース

MachineSet を使用してクラスターをスケーリングする方法の詳細は、「MachineSet の手動によるスケーリング」を参照してください。