Kubernetes 1.37 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。
は筆者によるコメントです。
過去 3 リリースの変更内容:
- Kubernetes 1.36: SIG-Scheduling の変更内容
- Kubernetes 1.35: SIG-Scheduling の変更内容
- Kubernetes 1.34: SIG-Scheduling の変更内容
全体を通して
Kubernetes 1.36 までで導入された Workload / PodGroup API によって workload-aware scheduling (WAS) の概念が導入され、Pod グループの gang scheduling やトポロジ制約 (Node label co-location)、プリエンプション戦略を表現できるようになりました。
- KEP-4671: Gang Scheduling
- KEP-5710: Workload-aware preemption
- KEP-5732: Topology-aware workload scheduling
1.37 では WAS がさらに進化し、複数の機能追加、パフォーマンス改善、ベータ版への昇格がありました。ここでは、新しい API である CompositePodGroup をハイライトして紹介します。
なお、他の更新も含めて Kubernetes 公式ブログ Kubernetes v1.37: Advancing Workload-Aware Scheduling も詳しくまとまっているので、あわせて参照してください。
CompositePodGroup
1.36 の PodGroup は、複数の Pod を直接束ねるフラットな構成でした。これで十分カバーできるワークロードもありましたが、より複雑で階層的な構造をもつワークロードの要件はうまく表現できませんでした。Kubernetes 1.37 で導入(アルファ版)された CompositePodGroup (KEP-6012: CompositePodGroup API) は複数の PodGroup、あるいは別の CompositePodGroup を子にもつ階層的な構造のワークロードを表現できます。
ユースケースとして、LLM の推論サービスをデプロイすることを考えます。Prefill と decode を分離する構成を取りたいとき、それぞれを独立した Pod グループとして定義しながらも、両グループをまとめて一つのワークロードとして運用したくなります。CompositePodGroup を使うことで、この階層構造を以下のように表現できます。
apiVersion: scheduling.k8s.io/v1beta1
kind: Workload
metadata:
name: pd-serving
spec:
compositePodGroupTemplates: # Workload を構成する CompositePodGroup のテンプレート
- name: serving
schedulingPolicy:
gang:
minGroupCount: 2
podGroupTemplates:
- name: prefill
schedulingPolicy:
gang:
minCount: 4
- name: decode
schedulingPolicy:
gang:
minCount: 8
# podGroupTemplates: # 一階層で十分な場合はこれまでどおり PodGroup のテンプレートを使う
# - ...
---
apiVersion: scheduling.k8s.io/v1alpha3
kind: CompositePodGroup
metadata:
name: pd-serving-root
spec:
workloadRef: # もととなる Workload を参照
workloadName: pd-serving
templateName: serving
schedulingPolicy:
gang:
minGroupCount: 2 # CompositePodGroup をスケジュールさせるために同時に必要な最小の子グループ数
---
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: pd-serving-prefill
spec:
parentCompositePodGroupName: pd-serving-root # 親の CompositePodGroup を参照
workloadRef: # もととなる Workload を参照
workloadName: pd-serving
templateName: prefill
schedulingPolicy:
gang:
minCount: 4 # この Pod グループをスケジュールさせるために同時に必要な最小の Pod 数
---
apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: pd-serving-decode
spec:
parentCompositePodGroupName: pd-serving-root
workloadRef:
workloadName: pd-serving
templateName: decode
schedulingPolicy:
gang:
minCount: 8
Workload に対する topology-aware scheduling も進化し、多層的なトポロジ制約を表現しスケジューリング時に考慮されるようになりました。以下のように Workload の階層ごとにトポロジ制約を設定でき、すべての制約が満たされるように配置先を探索します。
apiVersion: scheduling.k8s.io/v1beta1
kind: Workload
metadata: # ...
spec:
compositePodGroupTemplates:
- name: serving
schedulingPolicy: # ...
schedulingConstraints: # ワークロード全体を同一の zone に収める
topology:
- key: topology.kubernetes.io/zone
podGroupTemplates:
- name: prefill
schedulingPolicy: # ...
schedulingConstraints: # この Pod グループを同一の rack に収める
topology:
- key: topology.kubernetes.io/rack
- name: decode
schedulingPolicy: # ...
schedulingConstraints: # この Pod グループを同一の rack に収める
topology:
- key: topology.kubernetes.io/rack
Urgent Upgrade Notes
- 対応必須: 将来の拡張に備え、
DisruptionModeの enum フィールドを struct に変更しました。scheduling.k8s.ioAPI グループをv1alpha2からv1alpha3に昇格させ、v1alpha2を完全に削除しました。クラスタをアップデートする前に、kube-apiserver からすべてのv1alpha2オブジェクトを削除してください。(#138572, @dom4ha) [SIG API Machinery, Apps, CLI, Etcd, Node, Scheduling and Testing]-
以下のような構造になりました。現時点では singleもallも、その中にフィールドをもっていません。disruptionMode: # いずれか一つのみを指定する single: {} # 子要素がそれぞれ独立に disrupt されてよい all: {} # 子要素をすべてまとめて disrupt する
-
API Changes
-
DRADeviceCompatibilityGroupsフィーチャゲート(デフォルトで無効)のもとで、DRA デバイスの互換性グループをアルファ段階でサポートしました。DRA ドライバは ResourceSlice の各device.consumesCounters[]エントリに不透明なcompatibilityGroupsを宣言できます。スケジューラは、同じ counter set を消費するデバイスの互換性グループが共通部分をもつ場合にのみ、これらを同時に割り当てます。これにより、互換性のない同時割り当てが、準備時の失敗ではなくスケジューリング時の拒否として検出されるようになります。(#139795, @omeryahud) [SIG API Machinery, Node, Scheduling and Testing] - Building block API と
workloadbuilderライブラリで CompositePodGroup をサポートしました。(#140717, @helayoty) [SIG API Machinery, Apps, Auth, Scheduling and Testing] - Job コントローラを
workloadbuilderライブラリおよび Workload building block API と統合することで、workload-aware scheduling(WAS)をサポートしました。(#140188, @helayoty) [SIG API Machinery, Apps, Auth, Network, Node, Scheduling, Storage and Testing] - PodGroup に
PreemptionPolicyフィールドを追加し、workload-aware preemption の際 kube-scheduler が PodGroup に属する Pod をどうプリエンプトするか制御できるようになりました。(#139240, @ania-borowiec) [SIG Scheduling]-
おそらく changelog の意味が逆になっています。PodGroup が「どうプリエンプトされるか」ではなく、PodGroup が他のワークロードを「どうプリエンプトできるか」を制御できるようになったということだと思われます。Pod と同様に PreemptLowerPriorityとNeverの選択肢があり、優先度が高い PodGroup でも他のワークロードをプリエンプトしないようできます。
-
-
InPlacePodVerticalScalingSchedulerPreemptionフィーチャゲート(アルファ)が有効な場合に、優先度の高い Pod のDeferred状態の in-place Pod resize に必要な空きを作るため、スケジューラが優先度の低い Pod をプリエンプトできるようにしました。(#140000, @natasha41575) [SIG API Machinery, Apps, Node, Scheduling, Storage and Testing] -
scheduling.k8s.io/v1alpha3に CompositePodGroup API を追加しました。(#139596, @jdzikowski) [SIG API Machinery, Apps, Auth, Etcd, Node, Scheduling and Testing] - CompositePodGroup の workload-aware preemption に対応するため、Workload API と CompositePodGroup API に
DisruptionModeフィールドとPreemptionPolicyフィールドを追加しました。(#140634, @tosi3k) [SIG API Machinery, Auth, Etcd, Node, Scheduling and Testing] - スケジューリングフレームワークに
PodGroupPostFilter拡張点を追加し、WorkloadAwarePreemption用の内部的なハードコーディングを、PodGroup 向けのカスタマイズ可能な拡張点に置き換えました。(#139674, @GFilipek) [SIG Scheduling and Testing]-
PodGroup 向けの拡張点です。Pod 単体のプリエンプション処理をおこなう PostFilterと似ていますが、PodGroupPostFilterは Pod グループ全体の配置ができなかったときの処理をプラグインでカスタマイズできます。
-
- Workload-aware preemption のポリシーを定義できるよう、PodGroupTemplate に
PreemptionPolicyフィールドを追加しました。(#140312, @ania-borowiec) [SIG API Machinery, Apps, Scheduling and Testing] -
SchedulerPreQueueingHintsフィーチャゲート(アルファ段階、デフォルトで無効)を追加しました。有効にすると、スケジューラプラグインがPreQueueingHintFnを提供し、クラスタイベントの発生時に評価する Pod を絞り込めるため、スケジューリングのスループットが向上します。DRA プラグインはこれを ResourceClaimTemplate を使うワークロードの最適化に利用します。(#138916, @geetasg) [SIG API Machinery, Apps, Architecture, Auth, CLI, Cloud Provider, Instrumentation, Network, Node, Scheduling, Storage, Testing and Windows]-
Queueing hint 機能は、クラスタで特定のイベントが起こったときに、以前スケジュール不能と評価されていた Pod を再試行できます。QueueingHintFnは与えられた Pod を再試行するかどうかを判定する関数ですが、PreQueueingHintFnはそもそもどの Pod を判定にかけるかを判定するという、二段階の絞り込みになっています。この変更では、DRA 関連で性能改善のためより綿密な絞り込みをするためにPreQueueingHintFn拡張点を導入しました。
-
- DRA Device Taints and Tolerations 機能が GA に昇格し、
resource.k8s.io/v1API で利用できるようになりました。(#138676, @pohly) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Node, Scheduling, Storage and Testing] - Workload-aware scheduling(WAS)の中核となる Workload API と PodGroup API を
scheduling.k8s.io/v1beta1に昇格させました。kube-apiserver を v1.36 から v1.37 へアップグレードする前に、すべてのv1alpha2オブジェクトを削除してください。(#140184, @tosi3k) [SIG API Machinery, Apps, Auth, Etcd, Node, Scheduling and Testing] -
GangSchedulingとWorkloadAwarePreemptionフィーチャゲートが削除されました。中核となる workload-aware scheduling 機能を有効にするには、GenericWorkloadフィーチャゲートを使います。(#139520, @macsko) [SIG API Machinery, Node, Scheduling and Testing]-
Workload / PodGroup API, gang scheduling, workload-aware preemption は互いに依存しており、個別に有効にしても実用的ではありません。そのため、これらの機能を一つのフィーチャゲートにまとめました。
-
- PodGroup の condition 名が
PodGroupScheduledからPodGroupInitiallyScheduledに変更されました。この condition は PodGroup が最初に正常にスケジューリングされたときにのみ設定され、現在のスケジューリング状態を表すとは限らないことが明確になりました。(#139743, @antekjb) [SIG API Machinery, Scheduling and Testing]-
この condition は PodGroup が最初に必要数の Pod を配置できた時点で Trueになり、その後グループの Pod が消えたり作られたりしてもFalseに更新されることはありません。なお、単体の Pod はノードに割り当てられてから割り当てられない状態になることはない(それはその Pod が消されたことを意味するため)ので、PodScheduledcondition に "Initially" は付いていません。
-
- PodGroup と PodGroupTemplate について、作成後に
minCountが変更できるようになりました。PodGroupTemplate の変更は、既存の PodGroup には影響しません。(#139279, @antekjb) [SIG API Machinery, Scheduling and Testing] - PodGroup API の
PodGroupTemplateRefフィールドを、PodGroup が属する Workload をより簡潔かつ直接的に参照できるWorkloadRefに置き換えました。(#140080, @dom4ha) [SIG API Machinery, Apps, Etcd, Node, Scheduling and Testing]-
CompositePodGroup のフィールドと同じ名前に揃える意味もあります。
-
Feature
-
PodGroupManagerとSharedListerに PodGroup のメソッドを追加し、スケジューラプラグインが一貫した PodGroup の状態を取得できるようにしました。(#140077, @macsko) [SIG Node, Scheduling and Testing] -
TopologyAwareWorkloadSchedulingフィーチャゲートが有効な場合に利用できる、topology-aware scheduling (TAS) の配置フェーズを観測するメトリクスscheduler_generated_placements_total,scheduler_placement_evaluations_total,scheduler_placement_evaluation_duration_secondsを追加しました。(#139604, @alimaazamat) [SIG Instrumentation, Scheduling and Testing] - 単体(PodGroup に属さない)Pod と、disruption mode が
singleまたはallの PodGroup について、プリエンプションの動作を比較するためのスケジューラパフォーマンスのベンチマークスイートを追加しました。また、デフォルトのプリエンプション性能テストを専用ディレクトリに整理しました。(#140651, @vshkrabkov) [SIG Scheduling and Testing] - Composite Pod Group 機能を有効にする
CompositePodGroupフィーチャゲートを追加しました。(#139407, @jdzikowski) [SIG Scheduling] - スケジューリングサイクル全体でプラグインが一貫した状態を取得できるよう、kube-scheduler の
PodGroupInfoオブジェクトにPodGroupフィールドを追加しました。(#140075, @macsko) [SIG Scheduling] - kube-scheduler に client-go informer のメトリクス
informer_store_resource_version,informer_queued_items,informer_processing_latency_secondsを追加しました。ラベルはname="kube-scheduler"です。(#140511, @Jefftree) [SIG Scheduling and Testing] - PodGroup オブジェクトが kube-scheduler に認識されるのを待つ Pod を保存するため、スケジューリングキューに
incompletePodGroupPodsデータ構造を追加しました。(#139952, @macsko) [SIG Node, Scheduling and Testing] -
DRAWorkloadResourceClaimsフィーチャゲートのもとで、dynamic_resource_allocation_resourceclaim_creates_totalメトリックにowner_api_groupとowner_api_kindラベルを追加しました。Pod 用と PodGroup 用に作成された ResourceClaim を区別できるようになります。(#140422, @nojnhuh) [SIG API Machinery, Apps, Instrumentation, Node, Scheduling and Testing] - スケジューラのメトリクス
queued_entitiesとqueue_incoming_entities_totalを追加しました。queued_entitiesはスケジューラのキュー内に現在あるスケジューリング対象(Pod または PodGroup)の数を、queue_incoming_entities_totalはキューに追加された対象の累計数を示します。(#139840, @iomarsayed) [SIG Instrumentation, Network and Scheduling] - PodGroup のスケジューリングサイクルを早期に終了できるよう、スケジューリングフレームワークに
PlacementFeasible拡張点を追加しました。GangScheduling プラグインはこれを、minCountを満たせなくなった時点で Pod の評価を止めるために利用します。(#138643, @brejman) [SIG Scheduling and Testing]-
例えば minCount: 8の PodGroup で、配置できた Pod が1つ、未評価の Pod が6つしか残っていなければ、残りをすべて配置しても条件を満たせません。従来はそれでも残りの Pod の配置を試していたため、大きな PodGroup ほど無駄な評価が増えました。PlacementFeasibleはスケジューリングサイクルを早期リターンするために使えます。なお、この拡張点は内部向けインターフェイスであり、外部から設定できるものではありません。
-
-
PodGroupPreemptionPolicyフィーチャゲートが有効な場合に、PodGroup に属するすべての Pod のプリエンプションポリシーが一致することを確認する検証を PodGroup のスケジューリングに追加しました。(#140359, @ania-borowiec) [SIG Scheduling and Testing] - 評価対象の Pod の優先度が PodGroup の優先度と一致することを確認する検証を、PodGroup のスケジューリングに追加しました。(#139920, @brejman) [SIG Scheduling and Testing]
-
WorkloadAwarePreemptionフィーチャゲートのもとで、ワークロードのプリエンプションに関するメトリクスをアルファ段階で追加しました。(#139373, @brejman) [SIG Instrumentation and Scheduling] - スケジューリング制約を持つ PodGroup では、PodGroup のスケジューリング試行が失敗した後にプリエンプションを実行するよう変更しました。(#140683, @Argh4k) [SIG API Machinery, Scheduling and Testing]
- スケジューリングフレームワークの
PatchPodStatusAPI が、単一の Pod condition (*v1.PodCondition) ではなく、Pod condition のスライス ([]*v1.PodCondition) を受け取るよう変更されました。これにより、プラグインは1回の API 呼び出しで複数の Pod condition を更新でき、並行して condition を更新する際に後続の呼び出しが先行する更新を上書きすることを防ぎます。(#135160, @KunWuLuan) [SIG Scheduling] - リリース直前に問題が見つかったため、
SchedulerPreQueueingHintsフィーチャゲートをベータからアルファ(デフォルトで無効)に戻しました。(#140959, @sanposhiho) [SIG Scheduling] - Pod 単位のプリエンプションを拡張し、PodGroup もプリエンプション対象にできるようにしました。(#137981, @vshkrabkov) [SIG Scheduling and Testing]
-
Kubernetes 1.36 時点では、PodGroup が preemptor になることはできましたが、PodGroup が victim となるときはそれに属する Pod が独立に処理されていました。この変更により、disruption mode に応じて PodGroup 全体が一つの victim として扱えるようになりました。
-
- PodGroup のプリエンプションエラーの先頭に、
pod group preemption:というメッセージが付くようになりました。(#139218, @Argh4k) [SIG Scheduling] -
scheduler_plugin_execution_duration_secondsとscheduler_scheduling_algorithm_duration_secondsのメトリクスをアルファからベータに昇格させました。(#138176, @abhay1999) [SIG Instrumentation, Scheduling and Testing]-
前者は各拡張点でプラグインが費やした時間、後者は配置先ノードを選ぶアルゴリズムの所要時間を計測するメトリクスです。
-
-
InterPodAffinityHostnameFastPathフィーチャゲートのもとで、topologyKey: kubernetes.io/hostnameを指定した必須の Pod アフィニティとアンチアフィニティのスケジューリング性能を改善しました。(#138198, @tetianakh) [SIG Apps, Node, Scheduling and Testing] - PersistentVolumeClaim をマウントする Pod について、スケジューリングサイクル間の差分数だけを処理することで kube-scheduler の性能を最適化しました。(#139238, @yue9944882) [SIG Scheduling and Testing]
- PodGroup のプリエンプションが成功した後、その Pod に
nominatedNodeNameフィールドを設定するようにしました。単一 Pod のプリエンプションと同じ動作です。(#138967, @antekjb) [SIG Scheduling and Testing] - PodGroup のスケジューリング時、nominated node に終了処理中のプリエンプション対象 Pod がすでにいる場合は、スケジューラが不要なプリエンプションの再試行を避けるようにしました。(#138710, @mm4tt) [SIG Scheduling]
- Pod リソースのクラスタイベントに、
AssignedPod,UnscheduledPod,TargetPodの3つのサブタイプを追加しました。性能向上のため、プラグインは対象を絞った Pod イベントに登録でき、また期待されます。(#135905, @iomarsayed) [SIG Node, Scheduling, Storage and Testing] - PodGroup のスケジューリング成功後、未スケジューリングの残りの Pod を backoff queue ではなく active queue へ直接戻すようにしました。元のタイムスタンプが保たれるため、より優先度の高いスケジューリング対象が追加されない限り、スケジューリングの順番が維持されます。(#139613, @iomarsayed) [SIG Scheduling and Testing]
-
Gang の minCountを満たして PodGroup のスケジューリングが成立すると、その個数の Pod は binding に進みますが、グループの Pod がそれより多ければ未配置の Pod が残ります。それらを active queue に戻して次のスケジューリングサイクルですぐ処理することで、グループ内で連続したスケジューリングができるようになります。
-
- PodGroup のスケジューリングサイクルで、Pod について PostFilter プラグインを実行しないようにしました。代わりに、PodGroup 全体がスケジューリング不能になった場合にのみ
PodGroupPostFilterを実行します。(#140412, @Argh4k) [SIG Scheduling and Testing] - Workload-aware preemption で配置先が見つかったとき、PodGroup のステータスに
pod group preemption found a placement for podgroup, preempting <victim_count> victimsというメッセージを含めるようにしました。(#140311, @Argh4k) [SIG Scheduling and Testing] - Pod の配置候補となるノードが見つかったとき、デフォルトプリエンプションが
FailedSchedulingイベントとPodScheduledcondition にpreemption: found a potential placement for pod on node <node_name>, preempting <victim_count> victimsというメッセージを含めるようにしました。(#140180, @Argh4k) [SIG Scheduling] - Workload-aware preemption で、プリエンプション対象となり得る Pod をすべて取り除いた状態で、スケジューリングを1回だけ試行するようにしました。スケジューリング性能は大きく向上しますが、プリエンプション対象の選択が最適ではなくなる場合があります。(#139980, @Argh4k) [SIG Scheduling and Testing]
- Workload-aware preemption で、preemptor Pod をできるだけ多くスケジューリングできるよう victim を選ぶようにしました。(#138757, @jdzikowski) [SIG Scheduling and Testing]
- kube-scheduler:
TopologyAwareWorkloadSchedulingフィーチャゲート(アルファ段階)のもとで、配置ごとの状態をPlacementScoreプラグインへ渡すPlacementCycleStateをスケジューリングフレームワークに追加しました。(#138274, @wtravO) [SIG Scheduling] - kube-scheduler: スケジューリングキューで PodGroup をサポートしました。Active, backoff, unschedulable queue を抽象化し、個別の Pod と PodGroup の両方を扱う
QueuedEntityInfoを格納するようにしました。(#138567, @macsko) [SIG Instrumentation, Scheduling and Testing]
Failing Test
- Scheduling gate が設定された Pod の nominated node 上の領域に、優先度の低い Pod がスケジューリングされてしまうバグを修正しました。(#139057, @macsko) [SIG Scheduling]
Bug or Regression
- DRA: ResourceClaim の informer 更新がまれに見落とされた場合、unschedulable queue がフラッシュされるまで Pod が Pending のままになるバグを修正しました。(#140831, @pohly) [SIG Node and Scheduling]
- DRA consumable capacity に関するスケジューリングのバグを修正しました。共有カウンタを消費するデバイスに、消費する容量がない共有割り当てがすでに保存されていると、そのカウンタが二重計上されることがありました。その結果、同じデバイスに対する後続のクレームが誤って拒否され、Pod が Pending のままになっていました。(#140437, @thc1006) [SIG Node and Scheduling]
- ImageLocality のスコアリングで、image volume が同等の通常のコンテナイメージより高いスコアを得ることがあるバグを修正しました。(#138951, @sujoshua) [SIG Scheduling]
- ResourceClaim を共有する PodGroup 内の Pod が、スケジューリング途中で止まるバグを修正しました。(#140269, @nojnhuh) [SIG Node, Scheduling and Testing]
-
GenericWorkloadフィーチャゲートが有効な場合に起こる、同じ ResourceClaim を共有する同一 PodGroup 内の Pod が正常にスケジューリングされないことがあるバグを修正しました。(#139418, @nojnhuh) [SIG Node and Scheduling] - ResourceClaim を共有する PodGroup 内の Pod が、その ResourceClaim を利用できないノードへスケジューリングされるバグを修正しました。(#140089, @nojnhuh) [SIG Node, Scheduling and Testing]
- 複数ノードにまたがる ResourceClaim とノードごとの ResourceClaim を併用する Pod が、Pending のままになることがあるバグを修正しました。(#139017, @johnbelamaric) [SIG Node and Scheduling]
- スケジューリングに成功した Pod に
PodScheduled=Falsecondition が残ることがあるバグを修正しました。(#139602, @nojnhuh) [SIG Node and Scheduling] - PodGroup のスケジューリングサイクルが失敗した際、その中で評価に成功した Pod の
nominatedNodeNameに、PodGroup のプリエンプションではなく、その評価で得られた値が設定される問題を修正しました。(#140590, @Argh4k) [SIG Scheduling] - スケジューリング失敗を処理する
handleSchedulingFailureで、マップの読み書きが並行して発生するデータ競合を修正しました。(#140623, @SparshGarg999) [SIG Scheduling] - スケジューラの
PriorityQueueで発生するメトリクスのリークを修正しました。Pod が active queue または backoff queue から削除された際にUnschedulableReasonメトリクスを減らし、スケジューリング不能の原因となったプラグインを正確に報告します。(#138482, @vshkrabkov) [SIG Scheduling] - Preemptor Pod がスケジューリング不能な状態のままになることがある競合状態を修正しました。(#139162, @brejman) [SIG Scheduling and Testing]
-
NominatedNodeNameをクリアすると、スケジューラの nominator が空のノードキーの下で Pod を追跡したままになることがあるバグを修正しました。(#139904, @pacoxu) [SIG Scheduling] - Deletion timestamp を受け取った後、assume 済みの Pod が
PodGroupStateから正しく削除されないスケジューラキャッシュのバグを修正しました。(#138445, @iomarsayed) [SIG Scheduling] - PodGroup のプリエンプションで進行中のプリエンプションを検出すると、その PodGroup の Pod から
nominatedNodeNameが消される問題を修正しました。(#140641, @Argh4k) [SIG Scheduling and Testing] - PodGroup のスケジューリングサイクル中に kube-scheduler がおこなう Pod 間アフィニティ、アンチアフィニティ、ボリューム制約の評価を修正しました。スケジューラのスナップショットの
AssumePodとForgetPodが、アフィニティノードのリストと PVC の使用状況を正しく維持します。(#139054, @net0pyr) [SIG Scheduling and Testing] - Pod 間アンチアフィニティに複数の条件がある場合の queueing hint を修正しました。スケジューリングの遅延につながることがありました。(#139161, @brejman) [SIG Scheduling]
-
PodGroupPostFilterからのエラーメッセージに、正しい拡張点名が含まれるよう修正しました。(#140747, @Argh4k) [SIG Scheduling] - Opportunistic batching と PodGroup の不整合により、PodGroup のスケジューリングサイクル中にバッチングヒントが常に実行不可能と判定される問題を修正しました。(#138754, @macsko) [SIG Scheduling]
-
KEP-5598: Opportunistic batching は、Pod スケジューリング時にノードのスコアリング結果をキャッシュし、この Pod と同一のスケジューリング要件 (scheduling signature) をもつ Pod で再利用することで、スケジューリング処理の効率化を図る機能です。PodGroup のスケジューリングサイクルでは所属する Pod が同じサイクルを共有するため、従来はヒントが常に実行不可能と判定されていました。同一 PodGroup の Pod 間でバッチ結果を再利用できるようにし、opportunistic batching がグループにもはたらくようにしました。
-
- 大規模な PodGroup の処理を改善し、所属する Pod のノードへのバインドが一時的に失敗した際にスケジューリングが停滞する可能性を下げました。多くの Pod が同じ ResourceClaim を共有する場合などが該当します。(#140478, @nojnhuh) [SIG Scheduling]
- PodGroup が既存の Workload を参照し、定義された PodGroupTemplate と一致することを検証していたアドミッションプラグイン(アルファ)を削除しました。(#139008, @wojtek-t) [SIG API Machinery, Etcd, Scheduling and Testing]
- グループ内の Pod 間で
.spec.schedulerNameが一致せずスケジューリングが拒否された場合、失敗理由が PodGroup のstatus.conditionsフィールドに反映されるようにしました。(#140183, @Argh4k) [SIG Scheduling] -
pods/bindingサブリソースのエンドポイントで、指定されたノード名を一貫して検証するようにしました。(#136776, @yakir-shriker) [SIG Apps and Scheduling]-
カスタムスケジューラで pods/bindingAPI を呼ぶとき、これまでは大文字を含むような不正なノード名でもバインドが受理されspec.nodeNameに記録されていました。この Pod が finalizer をもつとき、削除するために finalizer を消す更新操作をしようとすると今度はspec.nodeNameの形式が検証されて失敗するため、Pod を削除できなくなる事例がありました。対策として、バインド時点でも一貫してノード名の形式を検証します。
-
Other (Cleanup or Flake)
- スケジューラの opportunistic batching で、直前に選んだノードがまだ配置可能なら、次のヒントに対して再度スコアリングするようにしました。キャッシュされた候補と比較できるようになり、常にスキップされることがなくなります。(#140289, @romanbaron) [SIG API Machinery, Etcd, Instrumentation, Scheduling and Testing]
-
Opportunistic batching はこれまで、すでに選んだノードにまだ空きがあってもバッチの候補から除いていたため、複数の Pod を同じノードに置けるワークロードで最適化がはたらきにくくなっていました。今回の変更ではそのノードを現在の Pod に対して再度スコアリングし、キャッシュされた他の候補ノードと比較します。
-
- PodGroup、CompositePodGroup、PodCertificateRequest のフィールド所有権を追跡する際、Server-Side Apply がステータスの変更を正しく除外するよう修正しました。(#140654, @jpbetz) [SIG API Machinery, Auth, Scheduling and Testing]
- PodGroup に属する Pod が参照する ResourceClaimTemplate から、ResourceClaim コントローラが ResourceClaim を作成するのは、
DRAWorkloadResourceClaimsフィーチャゲートが有効な場合だけにしました。PodGroup 向けに作られるべき ResourceClaim が、個別の Pod 向けに作られることを防ぎます。(#138363, @nojnhuh) [SIG API Machinery, Apps, Node, Scheduling and Testing] - kube-controller-manager と kube-scheduler の両方が、作成した ResourceClaim の数を示す
dynamic_resource_allocation_resourceclaim_creates_totalメトリクスを公開し、それぞれで異なっていたメトリクス名を置き換えました。kube-controller-manager のresource_claimsメトリックも同じdynamic_resource_allocationサブシステムへ移動しました。(#138542, @pohly) [SIG Apps, Instrumentation, Node, Release, Scheduling and Testing]