4.9. descheduler


4.9.1. descheduler の概要

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

4.9.1.1. descheduler について

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

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

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

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

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

  • openshift-* および kube-system namespace の Pod は退避されることがありません。
  • priorityClassNamesystem-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 コンテナーを含む) での再起動の合計が 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 も退避の対象と見なされる点が異なります。

警告

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

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 は、LifecycleAndUtilizationLongLifecycle、または TopologyAndDuplicates プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。

KubeVirtRelieveAndMigrate

このプロファイルは、LongLifeCycle プロファイルの拡張バージョンです。

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

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

このプロファイルは、アルファ機能である EvictionsInBackground を使用して LowNodeUtilization ストラテジーを有効にします。また、このプロファイルは次のカスタマイズフィールドを公開します。

  • devActualUtilizationProfile: 負荷を考慮した descheduler による再スケジュールを有効にします。
  • 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: PrometheusCPUCombined

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
トップに戻る