kube-scheduler の観点からは、一連のアルゴリズムを使用して、Pod を実行するのに最適なノードを計算します。スケジュールのために新しい Pod が表示されると、スケジューラはその時点の Kubernetes クラスターのリソース記述に基づいて最適なスケジュール決定を行います。ただし、Kubernetes クラスターは非常に動的です。ノードのメンテナンスなど、クラスター全体の変更により、最初にエビクション操作を実行します。このノード上のすべてのポッドは他のノードに追い出されますが、メンテナンスが完了すると、以前のポッドは自動的にノードに戻りません。これは、ポッドがノードにバインドされると、再スケジュールがトリガーされないためです。これらの変更により、Kubernetes クラスターは一定期間不均衡になる可能性があるため、クラスターのバランスを再調整するにはバランサーが必要です。 もちろん、一部のポッドを手動で削除して再スケジュールをトリガーするなど、一部のクラスターを手動でバランス調整することは可能ですが、これは明らかに面倒なプロセスであり、問題の解決策にはなりません。実際の運用でクラスター リソースが不足したり無駄になったりする問題を解決するために、descheduler コンポーネントを使用してクラスター Pod のスケジュールを最適化できます。 Descheduler は、いくつかのルールと構成ポリシーに従ってクラスターのステータスを再調整するのに役立ちます。その基本原則は、ポリシー構成に従って削除できるポッドを見つけて排除することです。削除されたポッド自体をスケジュールするのではなく、デフォルトのスケジューラに依存してこれを実現します。現在サポートされているポリシーは次のとおりです。
これらのポリシーは有効または無効にできます。ポリシーの一部として、ポリシー関連のパラメータも設定できます。デフォルトでは、すべてのポリシーが有効になっています。さらに、次のような一般的な構成がいくつかあります。
以下に示すように、DeschedulerPolicy を通じてこれを構成できます。 apiVersion : "descheduler/v1alpha2" インストールデスケジューラは、CronJob または Deployment として k8s クラスターで実行できます。 Helm Chart を使用して descheduler をインストールすることもできます。 ➜ Helm リポジトリ追加デスケジューラー https://kubernetes-sigs.github.io/descheduler/ Helm Chart を通じて、デスケジューラを CronJob または Deployment として実行するように構成できます。デフォルトでは、デスケジューラは、それ自体または kubelet によって削除されるのを避けるために、重要なポッドとして実行されます。クラスター内に system-cluster-critical Priorityclass が存在することを確認する必要があります。 ➜ kubectl でシステムクラスタのクリティカルな優先度クラスを取得します Helm Chart を使用してインストールすると、デフォルトではスケジュールの実行期間が「*/2 * * * *」の CronJob として実行されます。これは、デスケジューラ タスクが 2 分ごとに実行されることを意味します。デフォルトの構成戦略は次のとおりです。 APIバージョン: v1 DeschedulerPolicy の戦略を構成することで、descheduler の実行戦略を指定できます。これらの戦略は有効または無効にできます。以下で詳しく紹介させていただきます。ここではデフォルトの戦略を使用し、次のコマンドを使用して直接インストールできます。 ➜ helm upgrade --install descheduler descheduler/descheduler --set image.repository=cnych/descheduler -n kube-system デプロイメントが完了すると、クラスターのステータスのバランスをとるために CronJob リソース オブジェクトが作成されます。 ➜ kubectl get cronjob -n kube-system 通常の状況では、デスケジューラ タスクを実行するために対応するジョブが作成されます。ログを確認すると、どのようなバランス調整操作が実行されたかがわかります。 ➜ kubectlログ- f descheduler - 28032982 - vxn24 - nkube - system ログから、どのポリシーによってどの Pod が削除されたかを明確に知ることができます。 電子データデスケジューラは再スケジュールのためにポッドを削除するため、サービスのすべてのレプリカが削除されると、サービスが利用できなくなる可能性があります。サービス自体に単一障害点がある場合、削除によってサービスが利用できなくなることは間違いありません。この場合、単一障害点を回避するために、アンチアフィニティと複数のレプリカを使用することを強くお勧めします。ただし、サービス自体が複数のノードに分散しており、これらのポッドが削除された場合、サービスも利用できなくなります。この場合、すべてのレプリカが同時に削除されないように PDB (PodDisruptionBudget) オブジェクトを構成できます。たとえば、削除中にアプリケーションのレプリカを最大 1 つだけ使用できないように設定できます。次に、以下に示すようにリソース リストを作成します。 # pdb -デモ.yaml PDB の詳細については、公式ドキュメント (https://kubernetes.io/docs/tasks/run-application/configure-pdb/) を参照してください。 したがって、デスケジューラを使用してクラスターの状態を再調整する場合は、保護のためにアプリケーションに対応する PodDisruptionBudget オブジェクトを作成することを強くお勧めします。 戦略PodLifeTime: 指定された時間制限を超えたポッドを排除するこのポリシーは、maxPodLifeTimeSeconds より古い Pod を削除するために使用されます。 podStatusPhases を使用して、どの状態の Pod を削除するかを設定できます。アプリケーションの可用性を確保するために、アプリケーションごとに PDB を作成することをお勧めします。たとえば、7 日以上実行されている Pod を削除するには、次のポリシーを構成できます。 apiVersion: "descheduler/v1alpha1" 重複を削除この戦略により、ポッドに関連付けられた RS、デプロイメント、またはジョブ リソース オブジェクトが 1 つだけ同じノード上で実行されるようになります。より多くのポッドがある場合、これらの重複したポッドは削除され、ポッドがクラスター全体に分散されます。これは、何らかの理由で一部のノードがクラッシュし、これらのノード上の Pod が他のノードに移動し、RS に関連付けられた複数の Pod が同じノード上で実行される場合に発生する可能性があります。障害が発生したノードが再び準備できたら、このポリシーを有効にして重複したポッドを排除できます。 ポリシーを構成するときに、excludeOwnerKinds パラメータを指定してタイプを除外できます。次のタイプのポッドは削除されません: apiVersion : "descheduler/v1alpha1" 低ノード使用率この戦略は主に、十分に活用されていないノードを見つけて他のノードからポッドを排除し、kube-scheduler が十分に活用されていないノードにポッドを再スケジュールできるようにするために使用されます。この戦略のパラメータは、フィールド nodeResourceUtilizationThresholds を通じて構成できます。 ノードの使用率が低いかどうかは、CPU、メモリ、およびポッドの数のパーセンテージとして設定できるしきい値パラメータを設定することで判断できます。ノードの使用率がすべてのしきい値を下回る場合、そのノードは十分に使用されていないとみなされます。 さらに、Pod を排除する可能性のあるノードを計算するために使用される、構成可能なしきい値 targetThresholds があります。このパラメータは、CPU、メモリ、およびポッドの数のパーセンテージとして構成することもできます。次の例に示すように、thresholds と targetThresholds はクラスターのニーズに基づいて動的に調整できます。 apiVersion : "descheduler/v1alpha1" 以下の点に注意してください。
リソース タイプが指定されていない場合、ノードが十分に使用されていない状態から過剰に使用されていない状態に移行するのを防ぐために、デフォルトは 100% になります。 LowNodeUtilization 戦略に関連付けられているもう 1 つのパラメーターは numberOfNodes です。このパラメータは、使用率の低いノードの数がこの設定値より大きい場合にのみ戦略をアクティブにするように設定できます。このパラメータは、一部のノードが頻繁に使用されたり、短期間で十分に使用されなかったりする可能性がある大規模なクラスターに非常に役立ちます。デフォルトでは、numberOfNodes は 0 です。 ポッドの削除、ポッド間の反アフィニティ違反このポリシーにより、Pod のアンチアフィニティに違反する Pod がノードから削除されます。たとえば、ノードに PodA があり、同じノードで実行されている podB と podC に同じノードでの実行を禁止するアンチアフィニティ ルールがある場合、podA はノードから削除され、podB と podC は正常に実行できるようになります。この問題は、podB と podC がノード上ですでに実行された後にアンチアフィニティ ルールが作成された場合に発生します。 このポリシーを無効にするには、単に false に設定します。 apiVersion: "descheduler/v1alpha1" ポッド違反ノードテイントの削除このポリシーにより、NoSchedule 汚染に違反する Pod がノードから削除されます。たとえば、podA という名前の Pod は、許容度キー = 値:NoSchedule を構成することによって、汚染が構成されたノードにスケジュールできます。その後、ノードのテイントが更新または削除されると、テイントはポッドの許容範囲を満たさなくなり、削除されます。 apiVersion: "descheduler/v1alpha1" ノードアフィニティに違反しているポッドを削除しますこのポリシーにより、ノードアフィニティに違反するポッドがノードから削除されます。たとえば、podA という名前の Pod がノード nodeA にスケジュールされます。スケジュール中に、podA はノード アフィニティ ルール requiredDuringSchedulingIgnoredDuringExecution を満たします。しかし、時間が経つにつれて、ノード nodeA はルールを満たさなくなります。ノード アフィニティ ルールを満たす別のノード nodeB が利用可能な場合、podA はノード nodeA から削除されます。以下はポリシー構成の例です。 apiVersion: "descheduler/v1alpha1" トポロジー拡散制約に違反しているポッドを削除しますこの戦略により、トポロジ分散制約に違反するポッドがノードから確実に排除されます。具体的には、各制約の デフォルトでは、この戦略はハード制約のみを処理しますが、パラメーター apiVersion: "descheduler/v1alpha1" 再起動が多すぎるポッドを削除するこのポリシーにより、再起動回数が多すぎる Pod がノードから削除されます。パラメータには、Pod を削除するまでの再起動回数である podRestartThreshold と、計算で init コンテナの再起動を考慮するかどうかを決定する InitContainers が含まれます。ポリシー構成は次のとおりです。 apiVersion: "descheduler/v1alpha1" フィルターポッドPod を削除する場合、すべての Pod を削除する必要がない場合があります。 Descheduler には、名前空間フィルタリングと優先度フィルタリングという 2 つの主要なフィルタリング方法が用意されています。 名前空間フィルタリング特定の名前空間を含めるか除外するかをポリシーで設定できます。この戦略を使用できるのは次の場合です。
たとえば、特定の名前空間内の Pod のみを削除する場合は、次に示すように include パラメータを使用して設定できます。 apiVersion: "descheduler/v1alpha1" または、特定の名前空間内の Pod を除外する場合は、次のように exclude パラメータ設定を使用できます。 apiVersion: "descheduler/v1alpha1" 優先フィルタリングすべてのポリシーは優先度しきい値を使用して構成でき、このしきい値を下回るとポッドが削除されます。このしきい値は、thresholdPriorityClassName (しきい値を指定された優先クラスの値に設定する) または thresholdPriority (しきい値を直接設定する) を設定することによって指定できます。デフォルトでは、しきい値は system-cluster-critical PriorityClass の値に設定されています。 たとえば、thresholdPriority を使用する場合: apiVersion: "descheduler/v1alpha1" または、thresholdPriorityClassName を使用してフィルタリングします。 apiVersion: "descheduler/v1alpha1" ただし、thresholdPriority と thresholdPriorityClassName を同時に設定することはできないことに注意してください。指定された優先クラスが存在しない場合、デスケジューラはそれを作成せず、エラーが発生します。 予防descheduler を使用して Pod を削除する場合は、次の点に注意してください。
|
<<: クラウドネイティブアプリケーションの完全なライフサイクル管理
>>: 世界のクラウド支出はIaaSの牽引により21.7%増加すると予想されている
検索エンジンでキーワードの順位が変わるのはよくあることで、ウェブマスターなら誰でもよく目にするもので...
オープンソース ソリューションのリーディング プロバイダーである Red Hat, Inc. (NY...
今日は、Mushroom Host [moguhost.com] の韓国 VPS をテストします。H...
みなさんこんにちは。私はハン・イージョウです。今日は、ロングテールキーワードをウェブサイトに取り込む...
lcayun/Leica Cloudは今月、超特別プロモーションを実施しています。2Gメモリ、2コア...
数日前、私は「Baidu 入札の単位原価計算」と「Baidu 入札の図解分析: 期間分析」という 2...
新しいウェブサイトの診断と分析には、一般的に 2 つの状況があります。1 つは新しいウェブサイトの運...
昨日の夕方、「ダブル11」が近づく中、北京市発展改革委員会が北京の電子商取引企業に販促指導通知を発行...
Alibaba Cloud には以前からパートナー制度があり、従来のモデルでは公式サイトに登録した顧...
リトアニアのホスティング プロバイダーである Bacloud.com には、独自のデータ センターが...
7月13日、2022 Alibaba Cloud パートナーカンファレンスにおいて、20社以上のパー...
みなさんこんにちは。私はみんなに愛され、どこに行っても花を咲かせる Yan Fengshou です。...
中国インターネットネットワークインフォメーションセンター(CNNIC)は今年1月に第33回「中国イン...
[[398367]]この記事はWeChatの公開アカウント「プログラマーjinjunzhu」から転載...
アップルからシャオミの携帯電話まで、「飢餓マーケティング」は常に消費者を待ち続けることで道に迷わせて...