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-systemnamespace の Pod は退避されることがありません。 -
priorityClassNameがsystem-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: ノード上の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 をスケジュールヒントとして動的に適用または削除できるようにします。
設定例
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: PrometheusCPUCombinedKubeVirtRelieveAndMigrateプロファイルでは、すべてのワーカーノードで PSI メトリクスを有効にする必要があります。これを有効にするには、次のMachineConfigカスタムリソース (CR) を適用します。MachineConfigCR の例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プロファイルと同時に有効にしないでください。これらのプロファイルを同時に有効にすると競合が発生します。-