4.9. Descheduler
4.9.1. デスケジューラーの概要
スケジューラー は、新しい Pod をホストするのに最適なノードを決定するために使用されますが、デスケジューラーは、実行中の Pod を削除して、Pod をより適切なノードに再スケジュールできるようにするために使用できます。
4.9.1.1. Descheduler について
Descheduler を使用して 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 は、再作成されないためにエビクトされません。
- デーモンセットに関連付けられた 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
: ノード上の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 も削除の対象と見なされる点が異なります。警告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
プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。
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 の開発を追跡しています。
詳細は、デスケジューラーについて を参照してください。
4.9.2.1. Kube Descheduler Operator 5.1.1 のリリースノート
発行日:2024 年 12 月 2 日
Kube Descheduler Operator 5.1.1 については、以下のアドバイザリーを利用できます。
4.9.2.1.1. 新機能および機能拡張
- Kube Descheduler Operator のこのリリースでは、Kubernetes のバージョンを 1.31 に更新しています。
4.9.2.1.2. バグ修正
- Kube Descheduler Operator のこのリリースでは、いくつかの Common Vulnerabilities and Exposures (CVE) に対処しています。
4.9.2.2. Kube Descheduler Operator 5.1.0 のリリースノート
発行日: 2024 年 10 月 23 日
Kube Descheduler Operator 5.1.0 については、次のアドバイザリーが利用可能です。
4.9.2.2.1. 新機能および機能拡張
2 つの新しいデスケジューラープロファイルが利用可能になりました。
-
CompactAndScale
: このプロファイルは、使用率が低いノードから Pod を削除して、ワークロードをより少数のノードセットで実行できるようにします。 -
LongLifecycle
: このプロファイルは、ノード間でリソース使用量のバランスを取り、RemovePodsHavingTooManyRestarts
およびLowNodeUtilization
ストラテジーを有効にします。
-
-
CompactAndScale
プロファイルの場合、テクノロジープレビューのフィールドdevHighNodeUtilizationThresholds
を使用して、使用率を低いと見なすしきい値を調整できます。
4.9.2.2.2. バグ修正
- Kube Descheduler Operator のこのリリースでは、いくつかの Common Vulnerabilities and Exposures (CVE) に対処しています。
4.9.3. Descheduler を使用した Pod のエビクト
OpenShift Container Platform でデスケジューラーを実行するには、Kube Descheduler Operator をインストールし、必要なプロファイルやその他のカスタマイズを設定します。
4.9.3.1. Descheduler のインストール
Descheduler はデフォルトで利用できません。Descheduler を有効にするには、Kube Descheduler Operator を OperatorHub からインストールし、1 つ以上の Descheduler プロファイルを有効にする必要があります。
デフォルトで、Descheduler は予測モードで実行されます。つまり、これは Pod エビクションのみをシミュレートします。Pod エビクションを実行するには、Descheduler のモードを automatic に変更する必要があります。
クラスターでホストされたコントロールプレーンを有効にしている場合は、カスタム優先度のしきい値を設定して、ホストされたコントロールプレーンの namespace の Pod が削除される可能性を下げます。ホストされたコントロールプレーンの優先度クラスの中で優先度値が最も低い (100000000
) ため、優先度しきい値クラス名を hypershift-control-plane
に設定します。
前提条件
-
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 をインストールします。
-
Operators
OperatorHub に移動します。 - Kube Descheduler Operator をフィルターボックスに入力します。
- Kube Descheduler Operator を選択し、Install をクリックします。
- Install Operator ページで、A specific namespace on the cluster を選択します。ドロップダウンメニューから openshift-kube-descheduler-operator を選択します。
- Update Channel および Approval Strategy の値を必要な値に調整します。
- Install をクリックします。
-
Operators
Descheduler インスタンスを作成します。
-
Operators
Installed Operators ページから、Kube Descheduler Operator をクリックします。 - Kube Descheduler タブを選択し、Create KubeDescheduler をクリックします。
必要に応じて設定を編集します。
- エビクションをシミュレーションせずに Pod をエビクトするには、Mode フィールドを Automatic に変更します。
-
Operators
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
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 evictionLimits: total: 20 5 profiles: 6 - AffinityAndTaints - TopologyAndDuplicates - LifecycleAndUtilization - EvictPodsWithLocalStorage - EvictPodsWithPVC
- 1
- オプション: デフォルトでは、Descheduler は Pod をエビクトしません。Pod をエビクトするには、
mode
をAutomatic
に設定します。 - 2
- オプション: Descheduler 操作に含めるか、除外するように、ユーザーが作成した namespace の一覧を設定します。
excluded
namespace のリストを設定するには 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
- オプション: 各デスケジューラー実行中に削除する 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
deschedulingIntervalSeconds
フィールドを必要な値に更新します。apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 1 ...
- 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 インスタンスを削除します。
-
Operators
Installed Operators ページから、Kube Descheduler Operator をクリックします。 - Kube Descheduler タブを選択します。
- cluster エントリーの横にある Options メニュー をクリックし、Delete KubeDescheduler を選択します。
- 確認ダイアログで Delete をクリックします。
-
Operators
Kube Descheduler Operator をアンインストールします。
-
Operators
Installed Operators に移動します。 - Kube Descheduler Operator エントリーの横にある Options メニュー をクリックし、Uninstall Operator を選択します。
- 確認ダイアログで、Uninstall をクリックします。
-
Operators
openshift-kube-descheduler-operator
namespace を削除します。-
Administration
Namespaces に移動します。 -
openshift-kube-descheduler-operator
をフィルターボックスに入力します。 - openshift-kube-descheduler-operator エントリーの横にある Options メニュー をクリックし、Delete Namespace を選択します。
-
確認ダイアログで
openshift-kube-descheduler-operator
を入力し、Delete をクリックします。
-
Administration
KubeDescheduler
CRD を削除します。-
Administration
Custom Resource Definitions に移動します。 -
KubeDescheduler
をフィルターボックスに入力します。 - KubeDescheduler エントリーの横にある Options メニュー をクリックし、Delete CustomResourceDefinition を選択します。
- 確認ダイアログで Delete をクリックします。
-
Administration