4.9. descheduler
4.9.1. descheduler の概要 リンクのコピーリンクがクリップボードにコピーされました!
スケジューラー は、新しい Pod をホストするのに最適なノードを決定するために使用されます。一方 descheduler は、実行中の Pod を退避させて、Pod をより適切なノードに再スケジュールできるようにするために使用できます。
4.9.1.1. descheduler について リンクのコピーリンクがクリップボードにコピーされました!
descheduler を使用して Pod を特定のストラテジーに基づいて退避し、Pod がより適切なノードに再スケジュールされるようにできます。
以下のような状況では、実行中の Pod のスケジュールを解除することに利点があります。
- ノードの使用率が低くなっているか、使用率が高くなっている。
- taint またはラベルなどの、Pod およびノードアフィニティーの各種要件が変更され、当初のスケジュールの意思決定が特定のノードに適さなくなっている。
- ノードの障害により、Pod を移動する必要がある。
- 新規ノードがクラスターに追加されている。
- Pod が再起動された回数が多すぎる。
descheduler は退避された Pod の置き換えをスケジュールしません。スケジューラーは、退避された Pod に対してこのタスクを自動的に実行します。
descheduler がノードから Pod を退避することを決定する際には、以下の一般的なメカニズムを使用します。
-
openshift-*およびkube-systemnamespace の Pod は退避されることがありません。 -
priorityClassNameがsystem-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.1.2. descheduler プロファイル リンクのコピーリンクがクリップボードにコピーされました!
以下の descheduler ストラテジーを利用できます。
AffinityAndTaintsこのプロファイルは、Pod 間のアンチアフィニティー、ノードアフィニティー、およびノードの taint に違反する Pod を退避します。
これにより、以下のストラテジーが有効になります。
-
RemovePodsViolatingInterPodAntiAffinity: Pod 間のアンチアフィニティーに違反する Pod を削除します。 -
RemovePodsViolatingNodeAffinity: ノードのアフィニティーに違反する Pod を削除します。 RemovePodsViolatingNodeTaints: ノード上のNoScheduletaint に違反する 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 も退避の対象と見なされる点が異なります。警告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-
このプロファイルは、
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 をスケジュールヒントとして動的に適用または削除できるようにします。
設定例
KubeVirtRelieveAndMigrate プロファイルでは、すべてのワーカーノードで PSI メトリクスを有効にする必要があります。これを有効にするには、次の MachineConfig カスタムリソース (CR) を適用します。
MachineConfig CR の例
マシン設定は辞書順で処理されるため、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 プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。
4.9.2. Kube Descheduler Operator のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
Kube Descheduler Operator を使用すると、Pod を退避させて、より適切なノードで再スケジュールできるようになります。
これらのリリースノートは、Kube Descheduler Operator の開発を追跡しています。
詳細は、descheduler について を参照してください。
4.9.2.1. Kube Descheduler Operator 5.3.1 のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
発行日: 2025 年 12 月 4 日
Kube Descheduler Operator 5.3.1 に関しては、次のアドバイザリーが利用可能です。
4.9.2.1.1. 新機能および機能拡張 リンクのコピーリンクがクリップボードにコピーされました!
- このリリースでは、イメージのグレードを向上させるために Kube Descheduler Operator が再構築されます。
4.9.2.2. Kube Descheduler Operator 5.3.0 のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
発行日: 2025 年 10 月 29 日
Kube Descheduler Operator 5.3.0 に関しては、次のアドバイザリーが利用可能です。
4.9.2.2.1. 新機能および機能拡張 リンクのコピーリンクがクリップボードにコピーされました!
descheduler プロファイル
DevKubeVirtRelieveAndMigrateが、KubeVirtRelieveAndMigrateに名前変更され、一般提供になりました。更新されたプロファイルは、バックグラウンドでの退避を有効にし、振動的な挙動を減らことで、ライブマイグレーション中の仮想マシン退避の安定性を向上させます。このプロファイルは OpenShift Virtualization でのみ使用できます。詳細は、仮想マシンの descheduler 退避の設定 を参照してください。
- この Kube Descheduler Operator のリリースでは、Kubernetes バージョンが 1.33 に更新されています。
4.9.2.3. Kube Descheduler Operator 5.2.1 のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
発行日: 2025 年 12 月 4 日
Kube Descheduler Operator 5.2.1 に関しては、次のアドバイザリーが利用可能です。
4.9.2.3.1. 新機能および機能拡張 リンクのコピーリンクがクリップボードにコピーされました!
- このリリースでは、イメージのグレードを向上させるために Kube Descheduler Operator が再構築されます。
4.9.2.4. Kube Descheduler Operator 5.2.0 のリリースノート リンクのコピーリンクがクリップボードにコピーされました!
発行日: 2025 年 7 月 9 日
Kube Descheduler Operator 5.2.0 に関しては、次のアドバイザリーが利用可能です。
4.9.2.4.1. 新機能および機能拡張 リンクのコピーリンクがクリップボードにコピーされました!
- Kube Descheduler Operator のこのリリースでは、Kubernetes バージョンが 1.32 に更新されています。
4.9.2.4.2. バグ修正 リンクのコピーリンクがクリップボードにコピーされました!
- Kube Descheduler Operator のこのリリースでは、いくつかの Common Vulnerabilities and Exposures (CVE) に対処しています。
4.9.3. descheduler を使用した Pod の退避 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で descheduler を実行するには、Kube Descheduler Operator をインストールし、必要なプロファイルやその他のカスタマイズを設定します。
4.9.3.1. descheduler のインストール リンクのコピーリンクがクリップボードにコピーされました!
descheduler はデフォルトで利用できません。descheduler を有効にするには、ソフトウェアカタログから Kube Descheduler Operator をインストールし、1 つ以上の descheduler プロファイルを有効にする必要があります。
デフォルトで、descheduler は予測モードで実行されます。つまり、これは Pod 退避のみをシミュレートします。Pod 退避を実行するには、descheduler のモードを automatic に変更する必要があります。
クラスターで Hosted Control Plane を有効にしている場合は、カスタムの優先度しきい値を設定して、Hosted Control Plane の namespace 内の Pod が退避される可能性を低くしてください。優先度しきい値のクラス名を hypershift-control-plane に設定してください。このクラス名は、Hosted Control Plane の優先度クラスの中で、最も低い優先度値 (100000000) を持っているためです。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。 - OpenShift Container Platform Web コンソールにアクセスできる。
手順
- OpenShift Container Platform Web コンソールにログインします。
Kube Descheduler Operator に必要な namespace を作成します。
-
Administration
Namespaces に移動し、Create Namespace をクリックします。 -
Name フィールドに
openshift-kube-descheduler-operatorを入力し、Labels フィールドにopenshift.io/cluster-monitoring=trueを入力して descheduler メトリクスを有効にし、Create をクリックします。
-
Administration
Kube Descheduler Operator をインストールします。
-
Ecosystem
Software Catalog に移動します。 - Kube Descheduler Operator をフィルターボックスに入力します。
- Kube Descheduler Operator を選択し、Install をクリックします。
- Install Operator ページで、A specific namespace on the cluster を選択します。ドロップダウンメニューから openshift-kube-descheduler-operator を選択します。
- Update Channel および Approval Strategy の値を必要な値に調整します。
- Install をクリックします。
-
Ecosystem
descheduler インスタンスを作成します。
-
Ecosystem
Installed Operator ページから、Kube Descheduler Operator をクリックします。 - Kube Descheduler タブを選択し、Create KubeDescheduler をクリックします。
必要に応じて設定を編集します。
- 退避をシミュレーションせずに Pod を退避するには、Mode フィールドを Automatic に変更します。
-
Ecosystem
4.9.3.2. descheduler プロファイルの設定 リンクのコピーリンクがクリップボードにコピーされました!
descheduler が Pod の退避に使用するプロファイルを設定できます。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。
手順
KubeDeschedulerオブジェクトを編集します。oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow spec.profilesセクションに 1 つ以上のプロファイルを指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- オプション: デフォルトでは、descheduler は Pod を退避させません。Pod を退避するには、
modeをAutomaticに設定します。 - 2
- オプション: descheduler 操作に含めるか、除外するように、ユーザーが作成した namespace の一覧を設定します。
excludednamespace のリストを設定するには exclude を使用するか、含める namespace のリストを設定するにはincludedを使用します。保護されている namespace (openshift-*、kube-system、hypershift) はデフォルトで除外されることに注意してください。 - 3
- オプション:
LifecycleAndUtilizationプロファイルのカスタム Pod ライフタイム値を有効にします。有効な単位はs、m、またはhです。デフォルトの Pod の有効期間は 24 時間です。 - 4
- オプション: 優先順位のしきい値を指定して、優先順位のしきい値を指定して、それらの優先順位が指定されたレベルよりも低い場合にのみ Pod を退避の対象とみなします。
thresholdPriorityフィールドを使用して数値の優先度しきい値 (たとえば、10000) を設定するか、thresholdPriorityClassNameフィールドを使用して特定の優先度クラス名 (たとえば、my-priority-class-name) を指定します。優先順位クラス名を指定する場合、これはすでに存在している必要があり、descheduler はエラーを出力します。thresholdPriorityとthresholdPriorityClassNameの両方を設定しないでください。 - 5
- オプション: 各 descheduler 実行中に退避させる Pod の最大数を設定します。
- 6
- 1 つ以上のプロファイルを追加して有効にします。使用可能なプロファイルは、
AffinityAndTaints、TopologyAndDuplicates、LifecycleAndUtilization、SoftTopologyAndDuplicates、EvictPodsWithLocalStorage、EvictPodsWithPVC、CompactAndScale、およびLongLifecycleです。互いに競合するプロファイルを有効にしないでください。
複数のプロファイルを有効にすることができますが、プロファイルを指定する順番は重要ではありません。
- 変更を適用するためにファイルを保存します。
4.9.3.3. descheduler の間隔の設定 リンクのコピーリンクがクリップボードにコピーされました!
descheduler の実行間隔を設定できます。デフォルトは 3600 秒 (1 時間) です。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。
手順
KubeDeschedulerオブジェクトを編集します。oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow deschedulingIntervalSecondsフィールドを必要な値に更新します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- descheduler の実行間隔を秒単位で設定します。このフィールドの値
0は descheduler を一度実行し、終了します。
- 変更を適用するためにファイルを保存します。
4.9.4. Kube Descheduler Operator のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform から Kube Descheduler Operator を削除するには、Operator をアンインストールし、関連リソースを削除します。
4.9.4.1. descheduler のアンインストール リンクのコピーリンクがクリップボードにコピーされました!
descheduler インスタンスを削除し、Kube Descheduler Operator をアンインストールして descheduler をクラスターから削除できます。この手順では、KubeDescheduler CRD および openshift-kube-descheduler-operator namespace もクリーンアップします。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。 - OpenShift Container Platform Web コンソールにアクセスできる。
手順
- OpenShift Container Platform Web コンソールにログインします。
descheduler インスタンスを削除します。
-
Ecosystem
Installed Operator ページから、Kube Descheduler Operator をクリックします。 - Kube Descheduler タブを選択します。
-
cluster エントリーの横にある Options メニュー
をクリックし、Delete KubeDescheduler を選択します。
- 確認ダイアログで Delete をクリックします。
-
Ecosystem
Kube Descheduler Operator をアンインストールします。
-
Ecosystem
Installed Operators に移動します。 -
Kube Descheduler Operator エントリーの横にある Options メニュー
をクリックし、Uninstall Operator を選択します。
- 確認ダイアログで、Uninstall をクリックします。
-
Ecosystem
openshift-kube-descheduler-operatornamespace を削除します。-
Administration
Namespaces に移動します。 -
openshift-kube-descheduler-operatorをフィルターボックスに入力します。 -
openshift-kube-descheduler-operator エントリーの横にある Options メニュー
をクリックし、Delete Namespace を選択します。
-
確認ダイアログで
openshift-kube-descheduler-operatorを入力し、Delete をクリックします。
-
Administration
KubeDeschedulerCRD を削除します。-
Administration
Custom Resource Definitions に移動します。 -
KubeDeschedulerをフィルターボックスに入力します。 -
KubeDescheduler エントリーの横にある Options メニュー
をクリックし、Delete CustomResourceDefinition を選択します。
- 確認ダイアログで Delete をクリックします。
-
Administration