この記事は、Huawei Cloud Community「How kube-scheduler completes scheduling and Adjusts scheduling Weights」から共有されたものです、著者: You can make friends 。
I. 概要
Kube-scheduler は k8s クラスターのデフォルトのスケジューラーで、kube-apiserver を監視 (監視メカニズム) し、スケジュールされていないポッドをクエリし、スケジューリング ポリシーに従ってクラスター内の最適なノードにポッドをスケジュールします。
2. スケジューリングプロセス
まず、API または kubectl ツールを使用してポッドを作成します。Kube-apiserver はリクエスト情報を受信し、それを etcd に保存します。スケジューラは、監視メカニズムを通じて apiserver を監視し、まだスケジュールされていないポッドのリストを確認します。ループします。を実行し、各ポッドにノードを割り当てようとします。割り当てプロセスは次のとおりです。
-
kube-scheduler の Informer コンポーネント list-watch apiserver、spec.nodeName="" を使用して、まだスケジュールされていない Pod を除外します
-
事前選択 (述語): スケジューラは、述語アルゴリズムを通じて条件を満たさないノードを除外します。
-
優先度: 事前選択に合格したノードについては、スコアリング メカニズムを使用して、最も高いスコアを持つノードが除外されます。
-
スケジューラーがポッドに適切なノードを選択した後、ポッドをノードにバインドします (ノード名をポッドの spec.nodeName フィールドに割り当てます)。
注: Pod.spec.nodeName は、指定したノードにポッドをスケジュールする制約を強制するために使用されます。nodeName を指定すると、スケジューラを直接バイパスでき、何も実行されません。リソースのフィルタリングと検査
3. kuble-schedulerのスケジューリング原理
Kube-scheduler のスケジューリング フレームワークは、Kubernetes では Scheduler Framework と呼ばれます。スケジューリング プロセス中、Pod は次のステージを順番に実行する必要があります。各ステージには独自のスケジューリング アルゴリズムがあります。スケジューリング アルゴリズムはプラグインによって提供されます。指定されたステージで独自のプラグインを開発することもできます。各プラグインは、指定されたステージで特定のスケジューリング アルゴリズムを実装できます。たとえば、NodeAffinity プラグインは、フィルター ステージでポッドと互換性のないノードをフィルターで除外します。
-
PreFilter: ポッド関連の情報を前処理するか、クラスタまたはポッドが満たさなければならない特定の条件を確認します。 PreFilter プラグインがエラーを返した場合、スケジューリング サイクルは終了します。
-
フィルタ: ポッドを実行できないノードをフィルタで除外します。各ノードに対して、スケジューラはこれらのフィルター プラグインを構成された順序で呼び出します。いずれかのフィルター プラグインがノードを実行不可能としてマークすると、そのノードは直接除外され、そのノードに対して残りのフィルター プラグインは呼び出されません。
-
PostFilter: Filter ステージの後に呼び出されます。ただし、Pod に実行可能なノードがない場合にのみ呼び出されます。一般的なポストフィルタリングの実装はプリエンプションです。これは、他の Pod からリソースをプリエンプトすることによって、この Pod スケジューラーを作成しようとします。
-
PreScore: スコアリング タスクを実行して、スコアリング可能なプラグインの共有状態を生成します。PreScore プラグインがエラーを返した場合、スケジュール サイクルは終了します。
-
スコア: 各スコアリング プラグインを呼び出して、スケジュール可能なノードをスコアリングします
-
NormalizeScore: 各プラグインのスコアが [0, 100] の間に標準化されます
-
予約: バインディング サイクルの前に予約ノードを選択します
-
許可: ポッド スケジュール サイクルの結果を承認または拒否します
-
PreBind: ポッドがバインドされる前に必要な作業を実行するために使用されます。たとえば、事前バインドされたプラグインは、ポッドがノード上で実行できるようにする前に、ネットワーク ボリュームを提供し、それをターゲット ノードにマウントする必要がある場合があります。
-
Bind: ポッドをノードにバインドするために使用されます。 Bind プラグインは、すべての PreBind プラグインが完了するまで呼び出されません。
-
PostBind: これは情報拡張ポイントです。バインディング後のプラグインは、ポッドが正常にバインドされた後に呼び出されます。これでバインディング サイクルが終了し、関連リソースをクリーンアップするために使用できます
スケジューラの事前選択ステージは、主に Pod のスケジューリング条件を満たさないノードをフィルタリングするために使用されるフィルターに対応し、最適化ステージは、主に各ノードのスコアを付けるために使用されるスコアに対応します。ノード スコア = プラグインスコア * プラグインの重み; 最も高いスコアを持つノードが並べ替えられて選択されます。
スケジューリングフェーズ |
実装プラグイン名 |
プラグイン機能の紹介 |
フィルター |
ポッドトポロジースプレッド |
ノードがポッドのトポロジー分布を満たしているかどうかを確認し、満たしていない場合はノードをフィルタリングします。 |
InterPodAffinity |
ノードがポッドのアフィニティ設定を満たしているかどうかを確認し、満たしていない場合はノードをフィルタリングします。 |
|
ノードポート |
ノードがポッドのポート要求を満たしているかどうかを確認し、満たしていない場合はノードをフィルターします。 |
|
ノードアフィニティ |
ノードがポッドのノード アフィニティ設定を満たしているかどうかを確認し、満たしていない場合はノードをフィルタリングします。 |
|
ボリュームバインディング |
ノードが pv のノード アフィニティを満たすかどうかを判断し、pvc を動的に作成するための条件 (トポロジなど) を満たすノードを後続のステージで使用するために保存します。 |
|
汚染耐性 |
NoSchedule および NoExecute は、ポッド許容値とノードテイントに基づいてノードをフィルターします。 |
|
スコア |
ノードアフィニティ |
スコアはプラグインの重みに基づいて計算され、次にノード スコアは戦略の重み比率に基づいて計算されます。スコアの範囲は 0 ~ 100 で、重みのデフォルトは 2 です。 |
ノードリソースバランス割り当て |
スコアは、ノード容量と対応するリソースの重みに対するさまざまなリソース (CPU、メモリ、ボリューム) の割合に基づいて取得されます。スコアの範囲は 0 ~ 100 で、重みのデフォルトは 1 です。 |
|
画像地域性 |
スコアは、ポッド内のイメージのサイズとすべてのノード上のイメージの分布に基づいており、スコアの範囲は 0 ~ 100 で、重みのデフォルトは 1 です。 |
|
InterPodAffinity |
スコアはプラグインの重みに基づいて計算され、次にノード スコアは戦略の重み比率に基づいて計算されます。スコアの範囲は 0 ~ 100 で、重みのデフォルトは 2 です。 |
|
汚染耐性 |
PreferNoSchedule 戦略に従ってスコアを計算します。スコアの範囲は 0 ~ 100 で、重みのデフォルトは 3 です。 |
|
ノードリソースフィット |
3 つの戦略: LeastAllocated (割り当てが少ないほどスコアが高くなります)、MostAllocated (割り当てが多いほどスコアが高くなります)、RequestedToCapacityRatio (要求値と容量の比率) |
|
ポッドトポロジースプレッド |
トポロジー一致度および重みに基づいてスコアが取得されます。スコアの範囲は 0 ~ 100 で、重みのデフォルトは 2 です。 |
3.1 kubernetes 1.23 バージョンのスケジューラー フィルター ステージとスコア ステージのソース コード分析
3.2 スケジューラプラグインのデフォルトの重みを変更する例
3.2.1 環境の準備
環境: クラスターには k8s-0001 と k8s-0002 の 2 つのノードがあります。既存のワークロード nginx はノード k8s-0002 (ワークロード テスト) にスケジュールされており、yaml ファイルは次のとおりです。
apiVersion: apps/v1 種類: 導入 メタデータ: 名前: テスト 仕様: セレクター: matchLabels: アプリ: テスト テンプレート: メタデータ: ラベル: アプリ: テスト 仕様: コンテナ: - 名前: コンテナ-1 画像: nginx:最新 dnsPolicy: ClusterFirst アフィニティ: nodeAffinity: #利用点を利用してk8s-0001 preferredDuringSchedulingIgnoredDuringExecution: - 重量: 1 好み: matchExpressions: - キー: kubernetes.io/ホスト名 演算子: 内 値: - k8s-0001 podAffinity: #利用负ダウンロード亲和使用その调度至k8s-0002 preferredDuringSchedulingIgnoredDuringExecution: - 重量: 1 podAffinityTerm: labelSelector: matchExpressions: - キー: アプリ 演算子: 内 値: - nginx 名前空間: - デフォルト トポロジーキー: kubernetes.io/ホスト名
3.2.2 ワークロード テストがノード k8s-0002 にスケジュールされるように InterPodAffinity の重みを調整します。
apiバージョン: v1 種類: ConfigMap メタデータ: 名前: スケジューラー構成 名前空間: kube-system データ: スケジューラー構成.yaml: | apiVersion: kubescheduler.config.k8s.io/v1beta3 #1.23 以降のバージョン本集群可用 v1beta3 種類: KubeSchedulerConfiguration プロファイル: - スケジューラ名: デフォルトスケジューラ プラグイン: スコア: 無効: - 名前: InterPodAffinity - 名前: NodeAffinity 有効: - 名前: InterPodAffinity #提高负ダウンロード亲和权重 重量: 100 - 名前: NodeAffinity 重量: 1
kube-scheduler のスケジューリング ログを確認してください。k8s-002 スコアは、スコア 100 * 重み 100、合計 10,000 ポイントで、k8s-002 ノードにスケジュールされます。
3.2.3 ワークロード テストがノード k8s-0001 にスケジュールされるように NodeAffinity の重みを調整します。
apiバージョン: v1 種類: ConfigMap メタデータ: 名前: スケジューラー構成 名前空間: kube-system データ: スケジューラー構成.yaml: | apiバージョン: kubescheduler.config.k8s.io/v1beta3 種類: KubeSchedulerConfiguration プロファイル: - スケジューラ名: デフォルトスケジューラ プラグイン: スコア: 無効: - 名前: InterPodAffinity - 名前: NodeAffinity 有効: - 名前: InterPodAffinity 重量: 1 - 名前: NodeAffinity #提高节点亲和权重 重量: 100
SenseTime 創設者、Tang Xiaoou 氏が 55 歳で死去 2023 年、PHP は停滞 Wi-Fi 7 が完全に利用可能になる2024 年初頭にデビュー、Wi-Fi 6 の 5 倍高速 Hongmeng システムが独立しつつあり、多くの大学が「Hongmeng クラス」を設立 Zhihui Jun の新興企業が借り換え、金額は 6 億元を超え、事前評価額は 35 億元 Quark Browser PC 版が内部テストを開始 AI コード アシスタントは人気があり、プログラミング言語のランキングはすべてです できることは何もありません Mate 60 Pro の 5G モデムと無線周波数技術ははるかに先を行っています MariaDB が SkySQL を分割し、確立されました独立した企業として</span> Xiaomi、Yu Chengdong 氏の Huawei からの「キールピボット」盗作声明に対応