4.9. Descheduler を使用した Pod のエビクト
スケジューラー は、新しい Pod をホストするのに最適なノードを決定するために使用されますが、デスケジューラーは、実行中の Pod を削除して、Pod をより適切なノードに再スケジュールできるようにするために使用できます。
4.9.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.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 を効果的に分散できるようにエビクトされます。
-
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 も削除の対象と見なされる点が異なります。注記SoftTopologyAndDuplicates
とTopologyAndDuplicates
の両方を有効にしないでください。両方を有効にすると、競合が生じます。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
に設定します。
前提条件
-
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 に変更します。
Profiles セクションを展開し、1 つ以上のプロファイルを選択して有効にします。
AffinityAndTaints
プロファイルはデフォルトで有効になっています。Add Profile をクリックして、追加のプロファイルを選択します。注記TopologyAndDuplicates
とSoftTopologyAndDuplicates
の両方を有効にしないでください。両方を有効にすると、競合が生じます。オプション: Profile Customizations セクションを拡張して、Descheduler の任意の設定を行います。
-
LifecycleAndUtilization
プロファイルのカスタム Pod ライフタイム値を設定します。podLifetime フィールドを使用して、数値と有効な単位 (s
、m
、またはh
) を設定します。デフォルトの Pod の有効期間は 24 時間 (24 h
) です。 カスタム優先度しきい値を設定して、Pod の優先度が指定された優先度レベルよりも低い場合にのみ、Pod を削除対象と見なします。thresholdPriority フィールドを使用して数値の優先度しきい値を設定するか、thresholdPriorityClassName フィールドを使用して特定の優先度クラス名を指定します。
注記デスケジューラーに thresholdPriority と thresholdPriorityClassName の両方を指定しないでください。
-
デスケジューラー操作から除外または含める特定の namespace を設定します。namespaces フィールドを展開し、namespace を 除外 リストまたは 包含 リストに追加します。除外する namespace のリストまたは追加する namespace のリストのみを設定できます。保護されている namespace (
openshift-*
、kube-system
、hypershift
) はデフォルトで除外されることに注意してください。 実験的:
LowNodeUtilization
ストラテジーの使用率および過度化のしきい値を設定します。devLowNodeUtilizationThresholds フィールドを使用して、以下のいずれかの値を設定します。-
Low
: 10% が十分に活用されておらず、30% が過剰に活用されている -
Medium
: 20% が十分に活用されておらず、50% が過剰に活用されている -
High
: 40% が十分に活用されておらず、70% が過剰に活用されている
注記この設定は実験段階にあり、実稼働環境では使用しないでください。
-
-
-
オプション: Descheduling Interval Seconds フィールドを使用して、Descheduler の実行間の秒数を変更します。デフォルトは
3600
秒です。
- Create をクリックします。
-
Operators
また、後で OpenShift CLI (oc
) を使用して、Descheduler のプロファイルおよび設定を設定することもできます。Web コンソールから Descheduler インスタンスを作成する際にプロファイルを調整しない場合、AffinityAndTaints
プロファイルはデフォルトで有効にされます。
4.9.4. 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 profiles: 5 - AffinityAndTaints - TopologyAndDuplicates 6 - 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
- 1 つ以上のプロファイルを追加して有効にします。使用可能なプロファイル:
AffinityAndTaints
、TopologyAndDuplicates
、LifecycleAndUtilization
、SoftTopologyAndDuplicates
、EvictPodsWithLocalStorage
、およびEvictPodsWithPVC
。 - 6
TopologyAndDuplicates
とSoftTopologyAndDuplicates
の両方を有効にしないでください。両方を有効にすると、競合が生じます。
複数のプロファイルを有効にすることができますが、プロファイルを指定する順番は重要ではありません。
- 変更を適用するためにファイルを保存します。
4.9.5. 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.6. 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エントリーの横にあるオプションメニュー をクリックし、Delete KubeDeschedulerを選択します。
- 確認ダイアログで Delete をクリックします。
-
Operators
Kube Descheduler Operator をアンインストールします。
-
Operators
Installed Operators に移動します。 - Kube Descheduler Operatorエントリーの横にあるオプションメニュー をクリックし、Uninstall Operatorを選択します。
- 確認ダイアログで、Uninstall をクリックします。
-
Operators
openshift-kube-descheduler-operator
namespace を削除します。-
Administration
Namespaces に移動します。 -
openshift-kube-descheduler-operator
をフィルターボックスに入力します。 - openshift-kube-descheduler-operatorエントリーの横にあるオプションメニュー をクリックし、Delete Namespace.を選択します。
-
確認ダイアログで
openshift-kube-descheduler-operator
を入力し、Delete をクリックします。
-
Administration
KubeDescheduler
CRD を削除します。-
Administration
Custom Resource Definitions に移動します。 -
KubeDescheduler
をフィルターボックスに入力します。 - KubeDeschedulerエントリーの横にあるオプションメニュー をクリックし、Delete CustomResourceDefinition を選択します。
- 確認ダイアログで Delete をクリックします。
-
Administration