4.9. descheduler


4.9.1. descheduler の概要

デスケジューラーは、デフォルトのスケジューラーが Pod をより適切なノードへ配置し直せるように、実行中の Pod をエビクトさせます。

4.9.1.1. Pod のスケジュールを変更してクラスターのバランスを維持する

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

次のような状況では、実行中の Pod を再スケジュールするとメリットがあります。

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

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

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

  • openshift-* および kube-system namespace の Pod は退避されることがありません。
  • priorityClassName が system-cluster-critical または system-node-critical に設定されている Critical 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.1.2. descheduler プロファイル

デスケジューラープロファイルを使用すると、Pod のライフサイクルやノードの使用率などの基準に基づいてクラスターのバランスを再調整する、特定のエビクションストラテジーを有効化できます。

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

AffinityAndTaints

このプロファイルは、Pod 間のアンチアフィニティー、ノードアフィニティー、およびノードの taint に違反する Pod を退避します。

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

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

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

TopologyAndDuplicates

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

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

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

TopologyAndDuplicates は、SoftTopologyAndDuplicates または CompactAndScale プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。

LifecycleAndUtilization

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

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

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

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

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

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

    必要に応じて、テクノロジープレビューのフィールド devLowNodeUtilizationThresholds の値を、Low (10%/30%)、Medium (20%/50%)、High (40%/70%) に設定することで、使用率を低いまたは高いと見なすしきい値のパーセンテージを調整できます。デフォルト値は Medium です。

  • PodLifeTime: 古くなり過ぎた Pod を退避します。

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

警告

LifecycleAndUtilization は、LongLifecycle または CompactAndScale プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。

SoftTopologyAndDuplicates

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

警告

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

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

このプロファイルは、使用率が低いノードから Pod を退避させて、ワークロードをより少数のノードセットで実行できるようにする HighNodeUtilization ストラテジーを有効にします。ノードは、使用率がすべてのしきい値 (CPU、メモリー、Pod の数) で 20% 未満の場合に使用率が低いと見なされます。

必要に応じて、テクノロジープレビューのフィールド devHighNodeUtilizationThresholds を、Minimal (10%)、Modest (20%)、Moderate (30%) に設定することで、使用率を低いと見なすしきい値のパーセンテージを調整できます。デフォルト値は Modest です。

警告

CompactAndScale は、LifecycleAndUtilization、LongLifecycle、または TopologyAndDuplicates プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。

KubeVirtRelieveAndMigrate

KubeVirtRelieveAndMigrate プロファイルは、高コストのノードから Pod を退避させて、全体的なリソースのコストを削減し、ワークロードの移行を可能にします。また、定期的にワークロードのバランスを再調整して、ノード全体で同様の予備容量を維持し、ワークロードの急増をより適切に処理できるようにします。ノードには次のようなコストが発生する可能性があります。

  • リソース使用量: リソースが逼迫すると、アプリケーション実行のオーバーヘッドが増加します。
  • ノードのメンテナンス: ノード上のコンテナーの数が増えると、リソースの消費量とメンテナンスコストが増加します。

このプロファイルは、アルファレベルの機能である EvictionsInBackground を使用して LowNodeUtilization ストラテジーを有効にします。デフォルトでは、このプロファイルは PrometheusCPUMemoryCombinedProfile 使用率メトリクスを使用します。このメトリクスは、CPU とメモリーの使用率に加え、両方の次元の Pressure Stall Information (PSI) を組み合わせて、包括的なノード負荷分散を実現します。

また、このプロファイルは次のカスタマイズフィールドを公開します。

  • devActualUtilizationProfile: 負荷を考慮した descheduler による再スケジュールを有効にします。以下の使用率プロファイルを設定できます。

    • PrometheusCPUMemoryCombinedProfile (デフォルト): CPU 使用率、CPU PSI 圧力、メモリー使用率、およびメモリー PSI 圧力に基づいてノードのバランスを調整します。このプロファイルは、負荷を分散し、リソースの競合を防ぐことができるため、メモリーオーバーコミットが有効になっている環境に最適です。
    • PrometheusCPUCombined: CPU 使用率と CPU PSI 圧力のみに基づいて、ノードのバランスを調整します。このプロファイルは、メモリーのオーバーコミットを行わない環境で使用します。このような環境では、メモリー割り当てが厳密に保証されており、ワークロード分散の主な要因は CPU 圧力となります。
  • devLowNodeUtilizationThresholds: LowNodeUtilization ストラテジーの実験的なしきい値を設定します。このフィールドを devDeviationThresholds と一緒に使用しないでください。
  • devDeviationThresholds: リソース使用率が平均以下のノードを、使用率が低いノードとして扱い、過剰に使用されているノードからワークロードを再分配します。このフィールドを devLowNodeUtilizationThresholds と一緒に使用しないでください。サポートされている値は、Low (10%:10%)、Medium (20%:20%)、High (30%:30%)、AsymmetricLow (0%:10%)、AsymmetricMedium (0%:20%)、AsymmetricHigh (0%:30%) です。
  • devEnableSoftTainter: ソフト taint 適用コンポーネントがソフト taint をスケジュールヒントとして動的に適用または削除できるようにします。

設定例:

apiVersion: operator.openshift.io/v1
kind: KubeDescheduler
metadata:
  name: cluster
  namespace: openshift-kube-descheduler-operator
spec:
  managementState: Managed
  deschedulingIntervalSeconds: 30
  mode: "Automatic"
  profiles:
    - KubeVirtRelieveAndMigrate
  profileCustomizations:
    devEnableSoftTainter: true
    devDeviationThresholds: AsymmetricLow
    devActualUtilizationProfile: PrometheusCPUMemoryCombinedProfile

KubeVirtRelieveAndMigrate プロファイルでは、すべてのワーカーノードで PSI メトリクスを有効にする必要があります。これを有効にするには、次の MachineConfig カスタムリソース (CR) を適用します。

MachineConfig CR の例:

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: 99-openshift-machineconfig-worker-psi-karg
spec:
  kernelArguments:
    - psi=1
注記

マシン設定は辞書順で処理されるため、MachineConfig オブジェクトの名前は重要です。デフォルトでは、98- で始まる設定は PSI を無効にします。PSI が有効になっていることを確認するには、99-openshift-machineconfig-worker-psi-karg のように、上位の接頭辞を使用して設定に名前を付けます。

このプロファイルを SoftTopologyAndDuplicates プロファイルとともに使用して、ソフトトポロジー制約に基づいて Pod のバランスを再調整することもできます。これは、Hosted Control Plane 環境で役立ちます。

LongLifecycle

このプロファイルは、ノード間のリソース使用率のバランスを取り、以下のストラテジーを有効にします。

  • RemovePodsHavingTooManyRestarts: コンテナーが何度も再起動された Pod、およびすべてのコンテナー (Init コンテナーを含む) の再起動の合計が 100 を超える Pod を削除します。仮想マシンのゲストオペレーティングシステムを再起動しても、この数は増えません。
  • LowNodeUtilization: 使用率の低いノードがある場合に、使用率の高いノードから Pod をエビクトします。エビクトされた Pod の宛先ノードはスケジューラーによって決定されます。

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

LongLifecycle は、LifecycleAndUtilization または CompactAndScale プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る