4.9. Descheduler を使用した Pod のエビクト

スケジューラー は、新しい Pod をホストするのに最適なノードを決定するために使用されますが、デスケジューラーは、実行中の Pod を削除して、Pod をより適切なノードに再スケジュールできるようにするために使用できます。

4.9.1. Descheduler について

Descheduler を使用して Pod を特定のストラテジーに基づいてエビクトし、Pod がより適切なノードに再スケジュールされるようにできます。

以下のような状況では、実行中の Pod のスケジュールを解除することに利点があります。

  • ノードの使用率が低くなっているか、使用率が高くなっている。
  • テイントまたはラベルなどの、Pod およびノードアフィニティーの各種要件が変更され、当初のスケジュールの意思決定が特定のノードに適さなくなっている。
  • ノードの障害により、Pod を移動する必要がある。
  • 新規ノードがクラスターに追加されている。
  • Pod が再起動された回数が多すぎる。
重要

Descheduler はエビクトされた Pod の置き換えをスケジュールしません。スケジューラーは、エビクトされた Pod に対してこのタスクを自動的に実行します。

Descheduler がノードから Pod をエビクトすることを決定する際には、以下の一般的なメカニズムを使用します。

  • openshift-* および kube-system namespace の Pod はエビクトされることがありません。
  • priorityClassNamesystem-cluster-critical または system-node-critical に設定されている Critical Pod はエビクトされることがありません。
  • レプリケーションコントローラー、レプリカセット、デプロイメント、またはジョブの一部ではない静的な Pod、ミラーリングされた Pod、またはスタンドアロンの Pod は、再作成されないためにエビクトされません。
  • デーモンセットに関連付けられた Pod はエビクトされることがありません。
  • ローカルストレージを持つ Pod はエビクトされることがありません。
  • Best effort Pod は、Burstable および Guaranteed Pod の前にエビクトされます。
  • descheduler.alpha.kubernetes.io/evict アノテーションを持つすべてのタイプの Pod はエビクトの対象になります。このアノテーションはエビクションを防ぐチェックを上書きするために使用され、ユーザーはエビクトする Pod を選択できます。ユーザーは、Pod を再作成する方法と、Pod が再作成されるかどうかを認識している必要があります。
  • Pod の Disruption Budget (PDB) が適用される Pod は、スケジュール解除が PDB に違反する場合にはエビクトされません。Pod は、エビクションサブリソースを使用して PDB を処理することでエビクトされます。

4.9.2. Descheduler プロファイル

以下の Descheduler ストラテジーを利用できます。

AffinityAndTaints

このプロファイルは、Pod 間の非アフィニティー、ノードアフィニティー、およびノードのテイントに違反する Pod をエビクトします。

これにより、以下のストラテジーが有効になります。

  • RemovePodsViolatingInterPodAntiAffinity: Pod 間の非アフィニティーに違反する Pod を削除します。
  • RemovePodsViolatingNodeAffinity: ノードのアフィニティー に違反する Pod を削除します。
  • RemovePodsViolatingNodeTaints: ノード上の NoSchedule テイントに違反する Pod を削除します。

    ノードのアフィニティータイプが requiredDuringSchedulingIgnoredDuringExecution の Pod は削除されます。

TopologyAndDuplicates

このプロファイルは、ノード間で同様の Pod または同じトポロジードメインの Pod を均等に分散できるように Pod をエビクトします。

これにより、以下のストラテジーが有効になります。

  • RemovePodsViolatingTopologySpreadConstraint: 均等に分散されていないとポロジードメインを見つけ、DoNotSchedule 制約を違反している場合により大きなものから Pod のエビクトを試行します。
  • RemoveDuplicates: 1 つの Pod のみが同じノードで実行されているレプリカセット、 レプリケーションコントローラー、デプロイメントまたはジョブに関連付けられます。追加の Pod がある場合、それらの重複 Pod はクラスターに Pod を効果的に分散できるようにエビクトされます。
LifecycleAndUtilization

このプロファイルは長時間実行される Pod をエビクトし、ノード間のリソース使用状況のバランスを取ります。

これにより、以下のストラテジーが有効になります。

  • RemovePodsHavingTooManyRestarts : コンテナーが何度も再起動された Pod を削除します。

    すべてのコンテナー (Init コンテナーを含む) での再起動の合計が 100 を超える Pod。

  • LowNodeUtilization: 使用率の低いノードを検出し、可能な場合は過剰に使用されているノードから Pod をエビクトし、エビクトされた Pod の再作成がそれらの使用率の低いノードでスケジュールされるようにします。

    ノードは、使用率がすべてしきい値 (CPU、メモリー、Pod の数) について 20% 未満の場合に使用率が低いと見なされます。

    ノードは、使用率がすべてのしきい値 (CPU、メモリー、Pod の数) について 50% を超える場合に過剰に使用されていると見なされます。

  • PodLifeTime: 古くなり過ぎた Pod をエビクトします。

    デフォルトでは、24 時間以上経過した Pod は削除されます。Pod のライフタイム値をカスタマイズできます。

SoftTopologyAndDuplicates

このプロファイルは TopologyAndDuplicates と同じですが、 whenUnsatisfiable: ScheduleAnyway などのソフトトポロジー制約のある Pod も削除の対象と見なされる点が異なります。

注記

SoftTopologyAndDuplicatesTopologyAndDuplicates の両方を有効にしないでください。両方を有効にすると、競合が生じます。

EvictPodsWithLocalStorage
このプロファイルにより、ローカルストレージを備えた Pod が削除の対象になります。
EvictPodsWithPVC
このプロファイルを使用すると、永続的なボリュームクレームを持つ Pod をエビクションの対象にすることができます。Kubernetes NFS Subdir External Provisioner を使用している場合は、プロビジョナーがインストールされているnamespaceに除外されたnamespaceを追加する必要があります。

4.9.3. Descheduler のインストール

Descheduler はデフォルトで利用できません。Descheduler を有効にするには、Kube Descheduler Operator を OperatorHub からインストールし、1 つ以上の Descheduler プロファイルを有効にする必要があります。

デフォルトで、Descheduler は予測モードで実行されます。つまり、これは Pod エビクションのみをシミュレートします。Pod エビクションを実行するには、Descheduler のモードを automatic に変更する必要があります。

重要

クラスターでホストされたコントロールプレーンを有効にしている場合は、カスタム優先度のしきい値を設定して、ホストされたコントロールプレーンの namespace の Pod が削除される可能性を下げます。ホストされたコントロールプレーンの優先度クラスの中で優先度値が最も低い (100000000) ため、優先度しきい値クラス名を hypershift-control-plane に設定します。

前提条件

  • クラスター管理者の権限。
  • OpenShift Container Platform Web コンソールにアクセスできる。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Kube Descheduler Operator に必要な namespace を作成します。

    1. AdministrationNamespaces に移動し、Create Namespace をクリックします。
    2. Name フィールドに openshift-kube-descheduler-operator を入力し、Labels フィールドに openshift.io/cluster-monitoring=true を入力して Descheduler メトリックを有効にし、Create をクリックします。
  3. Kube Descheduler Operator をインストールします。

    1. OperatorsOperatorHub に移動します。
    2. Kube Descheduler Operator をフィルターボックスに入力します。
    3. Kube Descheduler Operator を選択し、Install をクリックします。
    4. Install Operator ページで、A specific namespace on the cluster を選択します。ドロップダウンメニューから openshift-kube-descheduler-operator を選択します。
    5. Update Channel および Approval Strategy の値を必要な値に調整します。
    6. Install をクリックします。
  4. Descheduler インスタンスを作成します。

    1. OperatorsInstalled Operators ページから、 Kube Descheduler Operator をクリックします。
    2. Kube Descheduler タブを選択し、Create KubeDescheduler をクリックします。
    3. 必要に応じて設定を編集します。

      1. エビクションをシミュレーションせずに Pod をエビクトするには、Mode フィールドを Automatic に変更します。
      2. Profiles セクションを展開し、1 つ以上のプロファイルを選択して有効にします。AffinityAndTaints プロファイルはデフォルトで有効になっています。Add Profile をクリックして、追加のプロファイルを選択します。

        注記

        TopologyAndDuplicatesSoftTopologyAndDuplicates の両方を有効にしないでください。両方を有効にすると、競合が生じます。

      3. オプション: Profile Customizations セクションを拡張して、Descheduler の任意の設定を行います。

        • LifecycleAndUtilization プロファイルのカスタム Pod ライフタイム値を設定します。podLifetime フィールドを使用して、数値と有効な単位 (sm、または h) を設定します。デフォルトの Pod の有効期間は 24 時間 (24 h) です。
        • カスタム優先度しきい値を設定して、Pod の優先度が指定された優先度レベルよりも低い場合にのみ、Pod を削除対象と見なします。thresholdPriority フィールドを使用して数値の優先度しきい値を設定するか、thresholdPriorityClassName フィールドを使用して特定の優先度クラス名を指定します。

          注記

          デスケジューラーに thresholdPrioritythresholdPriorityClassName の両方を指定しないでください。

        • デスケジューラー操作から除外または含める特定の namespace を設定します。namespaces フィールドを展開し、namespace を 除外 リストまたは 包含 リストに追加します。除外する namespace のリストまたは追加する namespace のリストのみを設定できます。保護されている namespace (openshift-*kube-systemhypershift) はデフォルトで除外されることに注意してください。

          重要

          LowNodeUtilization ストラテジーは、namespace の除外をサポートしていません。LowNodeUtilization ストラテジーを有効にする LifecycleAndUtilization プロファイルが設定されている場合、保護されている namespace であっても namespace は除外されません。LowNodeUtilization ストラテジーが有効になっているときに保護されている namespace からのエビクションを回避するには、優先度クラス名を system-cluster-critical または system-node-critical に設定します。

        • 実験的: LowNodeUtilization ストラテジーの使用率および過度化のしきい値を設定します。devLowNodeUtilizationThresholds フィールドを使用して、以下のいずれかの値を設定します。

          • Low: 10% が十分に活用されておらず、30% が過剰に活用されている
          • Medium: 20% が十分に活用されておらず、50% が過剰に活用されている
          • High: 40% が十分に活用されておらず、70% が過剰に活用されている
          注記

          この設定は実験段階にあり、実稼働環境では使用しないでください。

      4. オプション: Descheduling Interval Seconds フィールドを使用して、Descheduler の実行間の秒数を変更します。デフォルトは 3600 秒です。
    4. Create をクリックします。

また、後で OpenShift CLI (oc) を使用して、Descheduler のプロファイルおよび設定を設定することもできます。Web コンソールから Descheduler インスタンスを作成する際にプロファイルを調整しない場合、AffinityAndTaints プロファイルはデフォルトで有効にされます。

4.9.4. Descheduler プロファイルの設定

Descheduler が Pod のエビクトに使用するプロファイルを設定できます。

前提条件

  • クラスター管理者の権限

手順

  1. KubeDescheduler オブジェクトを編集します。

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. spec.profiles セクションに 1 つ以上のプロファイルを指定します。

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      logLevel: Normal
      managementState: Managed
      operatorLogLevel: Normal
      mode: Predictive                                     1
      profileCustomizations:
        namespaces:                                        2
          excluded:
          - my-namespace
        podLifetime: 48h                                   3
        thresholdPriorityClassName: my-priority-class-name 4
      profiles:                                            5
      - AffinityAndTaints
      - TopologyAndDuplicates                              6
      - LifecycleAndUtilization
      - EvictPodsWithLocalStorage
      - EvictPodsWithPVC
    1
    オプション: デフォルトでは、Descheduler は Pod をエビクトしません。Pod をエビクトするには、modeAutomatic に設定します。
    2
    オプション: Descheduler 操作に含めるか、除外するように、ユーザーが作成した namespace の一覧を設定します。excluded namespace のリストを設定するには exclude を使用するか、含める namespace のリストを設定するには included を使用します。保護されている namespace (openshift-*kube-systemhypershift) はデフォルトで除外されることに注意してください。
    重要

    LowNodeUtilization ストラテジーは、namespace の除外をサポートしていません。LowNodeUtilization ストラテジーを有効にする LifecycleAndUtilization プロファイルが設定されている場合、保護されている namespace であっても namespace は除外されません。LowNodeUtilization ストラテジーが有効になっているときに保護されている namespace からのエビクションを回避するには、優先度クラス名を system-cluster-critical または system-node-critical に設定します。

    3
    オプション: LifecycleAndUtilization プロファイルのカスタム Pod ライフタイム値を有効にします。有効な単位は sm、または h です。デフォルトの Pod の有効期間は 24 時間です。
    4
    オプション: 優先順位のしきい値を指定して、優先順位のしきい値を指定して、それらの優先順位が指定されたレベルよりも低い場合にのみ Pod をエビクションの対象とみなします。thresholdPriority フィールドを使用して数値の優先度しきい値 (たとえば、10000) を設定するか、thresholdPriorityClassName フィールドを使用して特定の優先度クラス名 (たとえば、my-priority-class-name) を指定します。優先順位クラス名を指定する場合、これはすでに存在している必要があり、Descheduler はエラーを出力します。thresholdPrioritythresholdPriorityClassName の両方を設定しないでください。
    5
    1 つ以上のプロファイルを追加して有効にします。使用可能なプロファイル: AffinityAndTaintsTopologyAndDuplicatesLifecycleAndUtilizationSoftTopologyAndDuplicatesEvictPodsWithLocalStorage 、および EvictPodsWithPVC
    6
    TopologyAndDuplicatesSoftTopologyAndDuplicates の両方を有効にしないでください。両方を有効にすると、競合が生じます。

    複数のプロファイルを有効にすることができますが、プロファイルを指定する順番は重要ではありません。

  3. 変更を適用するためにファイルを保存します。

4.9.5. Descheduler の間隔の設定

Descheduler の実行間隔を設定できます。デフォルトは 3600 秒 (1 時間) です。

前提条件

  • クラスター管理者の権限

手順

  1. KubeDescheduler オブジェクトを編集します。

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. deschedulingIntervalSeconds フィールドを必要な値に更新します。

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600 1
    ...
    1
    Descheduler の実行間隔を秒単位で設定します。このフィールドの値 0 は Descheduler を一度実行し、終了します。
  3. 変更を適用するためにファイルを保存します。

4.9.6. Descheduler のアンインストール

Descheduler インスタンスを削除し、Kube Descheduler Operator をアンインストールして Descheduler をクラスターから削除できます。この手順では、KubeDescheduler CRD および openshift-kube-descheduler-operator namespace もクリーンアップします。

前提条件

  • クラスター管理者の権限。
  • OpenShift Container Platform Web コンソールにアクセスできる。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Descheduler インスタンスを削除します。

    1. OperatorsInstalled Operators ページから、Kube Descheduler Operator をクリックします。
    2. Kube Descheduler タブを選択します。
    3. clusterエントリーの横にあるオプションメニュー kebab をクリックし、Delete KubeDeschedulerを選択します。
    4. 確認ダイアログで Delete をクリックします。
  3. Kube Descheduler Operator をアンインストールします。

    1. OperatorsInstalled Operators に移動します。
    2. Kube Descheduler Operatorエントリーの横にあるオプションメニュー kebab をクリックし、Uninstall Operatorを選択します。
    3. 確認ダイアログで、Uninstall をクリックします。
  4. openshift-kube-descheduler-operator namespace を削除します。

    1. AdministrationNamespaces に移動します。
    2. openshift-kube-descheduler-operator をフィルターボックスに入力します。
    3. openshift-kube-descheduler-operatorエントリーの横にあるオプションメニュー kebab をクリックし、Delete Namespace.を選択します。
    4. 確認ダイアログで openshift-kube-descheduler-operator を入力し、Delete をクリックします。
  5. KubeDescheduler CRD を削除します。

    1. AdministrationCustom Resource Definitions に移動します。
    2. KubeDescheduler をフィルターボックスに入力します。
    3. KubeDeschedulerエントリーの横にあるオプションメニュー kebab をクリックし、Delete CustomResourceDefinition を選択します。
    4. 確認ダイアログで Delete をクリックします。