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-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.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 を効果的に分散できるようにエビクトされます。 
- 
										
 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
$ 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
 - 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
$ 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.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-operatornamespace を削除します。- 
									Administration 
Namespaces に移動します。  - 
									
openshift-kube-descheduler-operatorをフィルターボックスに入力します。 - 
									openshift-kube-descheduler-operatorエントリーの横にあるオプションメニュー 
									
									 をクリックし、Delete Namespace.を選択します。
								 - 
									確認ダイアログで 
openshift-kube-descheduler-operatorを入力し、Delete をクリックします。 
- 
									Administration 
 KubeDeschedulerCRD を削除します。- 
									Administration 
Custom Resource Definitions に移動します。  - 
									
KubeDeschedulerをフィルターボックスに入力します。 - 
									KubeDeschedulerエントリーの横にあるオプションメニュー 
									
									 をクリックし、Delete CustomResourceDefinition を選択します。
								 - 確認ダイアログで Delete をクリックします。
 
- 
									Administration