Kubernetes 1.36 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。
は筆者によるコメントです。
過去 3 リリースの変更内容:
- Kubernetes 1.35: SIG-Scheduling の変更内容
- Kubernetes 1.34: SIG-Scheduling の変更内容
- Kubernetes 1.33: SIG-Scheduling の変更内容
全体を通して
1.35 から入った workload-aware scheduling / gang scheduling (KEP-4671: Gang Scheduling using Workload Object) に関する変更・機能追加が盛りだくさんです。リリースノートに多数の項目があるのですが、ここでまとめて紹介します。
scheduling.k8s.io/v1alpha2 Workload API と PodGroup API
まず、scheduling.k8s.io/v1alpha1 の Workload API が削除され、v1alpha2 の Workload API と PodGroup API に置き換えられました (KEP-5832: Decouple PodGroup from Workload API)。Workload は「スケジューリングポリシーのテンプレート」、PodGroup は「実際にスケジューリングされる Pod グループを表現するランタイムオブジェクト」という役割分担になります。Pod からも Workload を参照する workloadRef ではなく、実行単位である PodGroup を spec.schedulingGroup で参照する形に変わりました。
Job、JobSet、LeaderWorkerSet などのワークロードコントローラは、Workload がまだ存在しなければ作成し、Workload の podGroupTemplates をもとにして PodGroup を作ります。さらに Pod を作って schedulingGroup 経由でスケジューリングポリシーを適用することで、gang scheduling を実現します。
Workload にスケジューリングやリソース割り当ての状態を持たせるのではなく、それをインスタンス化した実行単位である PodGroup に持たせることで、オブジェクトのサイズの肥大化や更新の競合を避けることがモチベーションの一つになっているようです。
apiVersion: scheduling.k8s.io/v1alpha2
kind: Workload
metadata:
namespace: example
name: example-workload
spec:
podGroupTemplates:
- name: workers
schedulingPolicy:
gang:
minCount: 4
apiVersion: scheduling.k8s.io/v1alpha2
kind: PodGroup
metadata:
namespace: example
name: example-workers-0
spec:
# もととなる Workload の参照。
podGroupTemplateRef:
workload:
workloadName: example-workload
podGroupTemplateName: workers
# Workload からコピーされたスケジューリングポリシー。
# 自己完結させるために参照ではなくコピーする。
schedulingPolicy:
gang:
minCount: 4
status:
conditions:
- type: PodGroupScheduled
status: "True"
apiVersion: v1
kind: Pod
metadata:
namespace: example
name: worker-0
spec:
# PodGroup を参照。
schedulingGroup:
podGroupName: example-workers-0
Topology-aware scheduling
機能面での強化の一つが、KEP-5732: Topology-aware workload scheduling で導入されている topology-aware scheduling (TAS) です。PodGroup に schedulingConstraints.topology が追加され、グループ内の Pod を同じトポロジドメインに載せる制約を表現できるようになりました。
spec:
schedulingConstraints:
topology:
- key: topology.kubernetes.io/zone
スケジューラの実装では、Pod グループが配置できるノードの集まりを表す placement という概念が導入され、関連する拡張点も追加されました。
-
PlacementGenerate: Placement の候補を生成する拡張点。ここでは Pod グループを配置するのに十分なリソースがあるかは考慮せず、トポロジドメインごとに候補を単純に列挙します。 -
PlacementScore: Pod グループが配置できる placement をスコアリングする拡張点。
PlacementGenerate で候補を列挙した後、通常の PodGroup スケジューリングをおこない、すべての Pod が配置できる placement を残します。それらに PlacementScore でスコアをつけて、最もよい placement を選ぶ流れになります。
これらの拡張点を実装する in-tree プラグインも追加され、既存の NodeResourcesFit プラグインでも PlacementScore が実装されました。アルファ段階ではありますが、標準の kube-scheduler で topology-aware scheduling を試せるようになっています。
Kubernetes ドキュメント:Topology-Aware Workload Scheduling | Kubernetes
Workload-aware preemption
もう一つの機能強化が、KEP-5710: Workload-aware preemption で導入されている workload-aware preemption です。Gang scheduling されるグループの Pod がプリエンプションされるとき、その Pod だけを削除してもグループ全体としては意味がなくリソースの無駄遣いになるため、グループ全体のプリエンプションを考える必要があります。
Workload API と PodGroup API に、以下のフィールドが追加されました。
spec:
disruptionMode: PodGroup # または Pod
priorityClassName: high
disruptionMode: PodGroup のとき、この Pod グループ全体がプリエンプションの単位として扱われます。スケジューラのプリエンプションロジックは、グループが preemptor になるケースにも、victim になりうるケースにも対応するように拡張されました。
PFN が公開している gang scheduling プラグイン には、workload-aware preemption 機能はありません。グループに属する Pod が一つでもプリエンプションにより削除されたとき、あるいは他の理由で終了したとき、そのイベントを契機に他の Pod も削除する実装になっており、グループ全体のライフサイクルを管理する形になっています。
Kubernetes ドキュメント:Pod Group Disruption and Priority | Kubernetes
Urgent Upgrade Notes
- Binding のレイテンシを改善するため、スケジューラフレームワークで PreBind プラグインを並列実行できるようになりました。ACTION REQUIRED: プラグインは
PreBindPreFlightメソッドからAllowParallel: trueを返すことで並列実行を opt-in できます。PreBind プラグインの実装は、PreBindPreFlightメソッドからPreBindPreFlightResultを返すように更新する必要があります。nil を返す場合は、従来どおり逐次実行の挙動が維持されます。(#135393, @tosi3k) [SIG Node, Scheduling, Storage and Testing]
Dependency
SIG-Scheduling に関するものはありません。
API Change
- ACTION REQUIRED:
DRAResourceClaimGranularStatusAuthorizationフィーチャゲートが有効な場合(v1.36でベータ)、DRA ドライバとコントローラは ResourceClaim status を更新するために、より細かい RBAC 権限が必要になりました。スケジューラとコントローラにはresourceclaims/bindingに対するupdate/patchを付与する必要があります。DRA ドライバには、各ドライバのresourceNamesに制限された形で、resourceclaims/driverに対するassociated-node:updateまたはarbitrary-node:update(あるいは対応する patch 権限)を付与する必要があります。(#134947, @aojea) [SIG API Machinery, Apps, Auth, Instrumentation, Node, Scheduling and Testing] -
TopologyAwareWorkloadSchedulingフィーチャゲート配下で、PodGroup スケジューリング向けの topology-aware scheduling (TAS) 制約を表現するSchedulingConstraintsフィールドを追加しました。また、PodGroup スケジューリング時にこれらの制約を考慮する PlacementGenerate 拡張点を実装する TopologyPlacement プラグインを追加しました。(#137271, @brejman) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling and Testing] -
WorkloadAwarePreemptionフィーチャゲートが有効な場合に workload-aware preemption をサポートするため、Workload API と PodGroup API にDisruptionMode、PriorityClassName、Priorityフィールドを追加しました。(#136589, @tosi3k) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling and Testing] - PodGroup オブジェクト向けの削除保護メカニズムを追加しました。(#137641, @helayoty) [SIG API Machinery, Apps, Auth, Scheduling and Storage]
-
PodGroup はそれを参照する Pod のスケジューリング単位なので、終端状態でない Pod が残っている間に消えると不整合がおこります。これを防ぐため、PodGroup 作成時に finalizer をつけ、コントローラですべての Pod が終端状態になったのを見てから finalizer を外すことで、PodGroup を保護する仕組みが作られました。
-
- PodGroup リソースが既存の Workload を参照しており、宣言された PodGroupTemplate spec と一致することを検証する admission plugin を追加しました。(#137464, @helayoty) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling and Testing]
- CSI volume 向けに opt-in のスケジューリング挙動を追加しました。(#137343, @gnufied) [SIG API Machinery, Scheduling and Storage]
- スケジューラに placement-based PodGroup スケジューリングアルゴリズムを追加しました。この機能の使用は
TopologyAwareWorkloadSchedulingフィーチャゲートで隔離されています。(#136944, @brejman) [SIG Scheduling and Testing] - スケジューラに PlacementGenerate 拡張点を追加しました。これは placement-based PodGroup スケジューリングの placement を生成するために使用されます。この機能の使用は
TopologyAwareWorkloadSchedulingフィーチャゲートで隔離されています。(#137083, @brejman) [SIG Scheduling] -
TopologyAwareWorkloadSchedulingフィーチャゲートで保護された placement-based PodGroup スケジューリングにおいて placement をスコアリングするため、スケジューラに PlacementScore 拡張点を追加しました。MinNodeScoreとMaxNodeScoreは deprecated となり、代わりにMinScoreとMaxScoreを使用します。(#137201, @brejman) [SIG Scheduling] - グループ内の Pod 数が多い placement を優先することで workload-aware scheduling をサポートする
PodGroupPodsCountscheduler plugin を追加しました。(#137488, @vshkrabkov) [SIG Scheduling and Testing] -
TopologyAwareWorkloadSchedulingフィーチャゲート配下で、PodGroup scheduling cycle に topology-aware scheduling (TAS) ロジックを追加しました。これにより、一致する topology domain を持つノードへの PodGroup のスケジューリングをサポートします。(#137489, @brejman) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling and Testing] -
scheduling.k8s.io/v1alpha1のPodGroupPolicystruct に対する OpenAPI schema union validation を修正しました。(#136424, @JoelSpeed) [SIG API Machinery and Scheduling] - DRA: ResourceClaim と ResourceClaimTemplate を参照するため、PodGroup リソースに
spec.resourceClaimsフィールドを追加しました。PodGroup によって作成された claim は、個々の Pod ではなく PodGroup 全体のために予約されます。これにより、256 個を超える Pod が単一の ResourceClaim を共有できるようになります。PodGroup の claim から参照される ResourceClaimTemplate は、その PodGroup 専用の ResourceClaim に複製され、グループ内のすべての Pod で共有されます。(#136989, @nojnhuh) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling and Testing] - DRA: Device Binding Conditions (KEP #5007) をベータに昇格し、
v1.36でデフォルト有効にしました。(#137795, @ttsuuubasa) [SIG API Machinery, Node, Scheduling and Testing] - DRA: Device taint と toleration (KEP #5055) をベータに昇格しました。ResourceSlice における DeviceTaint のサポートはデフォルトで有効です。
DeviceTaintRulesのサポートには、resource.k8s.io/v1beta2とDeviceTaintRulesフィーチャゲートを有効化する必要があります。(#137170, @pohly) [SIG API Machinery, Apps, Auth, Cluster Lifecycle, Etcd, Node, Scheduling and Testing] - PlacementScore 拡張点を実装するように
NodeResourcesFitを拡張しました。PlacementScore 拡張点の使用はTopologyAwareWorkloadSchedulingフィーチャゲートで隔離されています。(#136652, @brejman) [SIG Scheduling] -
RequestedToCapacityRatioscoring strategy を使用している場合に、スケジューラのNodeResourcesFitArgsvalidation で nil ポインタ参照外しが起こる可能性があった問題を修正しました。(#132120, @flpanbin) [SIG Scheduling] - リサイズ要求がノードの allocatable capacity を超える場合、またはノードがリサイズをサポートしない OS を実行している場合、そのノードに対する Pod resize リクエストは、後から Pod status で Infeasible とマークされるのではなく、admission で失敗するようになりました。(#136043, @natasha41575) [SIG API Machinery, Node, Release, Scheduling, Storage and Testing]
-
InPlacePodLevelResourcesVerticalScalingフィーチャゲートを beta に昇格し、デフォルト有効にしました。Pod-level リソースが設定された Pod では、Pod-level の CPU とメモリを in-place でリサイズできるようになりました。(#137684, @ndixita) [SIG API Machinery, Apps, Autoscaling, Node, Release, Scheduling and Testing] - Gang scheduling をサポートするため、Workload API と PodGroup API を Job コントローラと統合しました。(#137032, @helayoty) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Instrumentation, Node, Scheduling and Testing]
-
KEP-5547 で提案されている機能です。WorkloadWithJobフィーチャゲートが有効とき、indexed Job について Job コントローラ Workload と PodGroup を作り(schedulingPolicy: gang、並列度と同じ値のminCountに設定)、生成する Pod にもschedulingGroupを定義します。これにより、Job の Pod 群が kube-scheduler によって gang scheduling されるようになります。
-
- Workload-level のスケジューリング要件を表現し、kube-scheduler がそれに基づいて動作できるようにするため、
scheduling.k8s.io/v1alpha2Workload API と PodGroup API を導入しました。scheduling.k8s.io/v1alpha1Workload API は削除されました。(#136976, @tosi3k) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Etcd, Node, Scheduling, Storage and Testing] - いくつかのスケジューラのメトリクス(
scheduler_goroutines、scheduler_permit_wait_duration_seconds、scheduler_plugin_evaluation_total、scheduler_plugin_execution_duration_seconds、scheduler_scheduling_algorithm_duration_seconds、scheduler_unschedulable_pods)を alpha から beta stability に昇格しました。これにより、メトリクスの利用者に対して API と label stability のより強い保証を提供します。(#136155, @bhope) [SIG Instrumentation and Scheduling] - kube-scheduler は、グループが正常にスケジュールされたか、unschedulable であるかを表す
PodGroupScheduledcondition で PodGroup status を更新するようになりました。(#137611, @helayoty) [SIG API Machinery, Apps, Scheduling and Testing]
Feature
-
unschedulablePodsキューからの timeout flush 後に正常にスケジュールされた Pod を追跡するため、カウンタメトリックscheduler_pod_scheduled_after_flush_totalをアルファで追加しました。(#135126, @mrvarmazyar) [SIG Scheduling] - kube-scheduler のメイン scheduling loop に
PodGroupscheduling cycle を追加し、PodGroup内のすべての Pod を 1 cycle でスケジュールできるようにしました。(#136618, @macsko) [SIG Scheduling and Testing] - 実行中の non-sidecar init container に対する in-place Pod resize のサポートを追加しました。(#137352, @natasha41575) [SIG API Machinery, Apps, Autoscaling, Node, Scheduling, Storage and Testing]
- Device Binding Conditions 向けにスケジューラに2つのメトリクスを追加しました。これらは status と driver label 付きで、割り当ての試行と PreBind にかかった時間をカバーします。(#137284, @ttsuuubasa) [SIG Node and Scheduling]
- 非同期プリエンプションモードと同期プリエンプションモードの間で
scheduler_preemption_victimsメトリックの定義を揃えました。このメトリックは、どちらのモードでも victim として選択された Pod の数を一貫して報告するようになりました。(#135955, @utam0k) [SIG Scheduling] - フィーチャゲートが有効な場合、kube-scheduler で Prometheus ネイティブヒストグラムのサポートを有効にしました。ヒストグラムは指数的なバケット構成 (factor=1.1, max buckets=160) を使用し、classic format と native format の両方で公開されます。(#137466, @richabanker) [SIG API Machinery, Architecture, Instrumentation, Scheduling and Testing]
-
WorkloadAwarePreemptionフィーチャゲートが有効な場合、PodGroup 向けの workload-aware preemption を有効にしました。PodGroup スケジューリングが PodGroup の配置を見つけられなかった場合、個々の Pod ごとにデフォルトのプリエンプションを実行するのではなく、グループ全体に対して workload-aware preemption を実行します。(#137606, @Argh4k) [SIG Apps, Node, Scheduling, Storage and Testing] -
PreBindフェイズ中にプリエンプションされた Pod は、API server 経由で削除されるのではなく backoff キューに再投入されるようにプリエンプションの挙動を改善しました。これにより、binding 中のプリエンプションをより穏当に処理できるようになります。(#135502, @Argh4k) [SIG Scheduling and Testing] - Pod スケジューリングでノードをスコアリングする際に
ImageVolumeイメージを考慮するよう、ImageLocalityスケジューラプラグインを更新しました。(#130231, @Barakmor1) [SIG Scheduling]
Bug or Regression
-
WaitOnPermitフェイズにある Pod をプリエンプションする場合のデフォルトのプリエンプションプラグインの挙動を変更しました。対象 Pod は unschedulable とマークされるのではなく、backoff キューに移動されるようになりました。(#135719, @Argh4k) [SIG Scheduling and Testing] - DRA BindingConditions:
DRABindingConditionsフィーチャゲートが有効な場合に、割り当て解除が並列に行われている最中に同じ claim が異なる Pod 間で再利用されるとスケジューラで panic が発生する問題を修正しました。(#137371, @pohly) [SIG Node, Scheduling and Testing] - API client throttling によるパフォーマンス問題のため、
SchedulerAsyncAPICallsフィーチャゲートを無効化しました。(#135903, @macsko) [SIG Scheduling]-
SchedulerAsyncAPICallsについては 1.35 の記事 で詳しく紹介しています。
-
- Deferred call 内で
SinceInSeconds(startTime)が早期評価されていたことにより、event_handling_duration_seconds、preemption_goroutines_duration_seconds、run_podsandbox_duration_seconds、store_schedule_results_duration_secondsメトリクスが実際の時間ではなくほぼゼロのレイテンシ値を誤って記録していた問題を修正しました。(#135749, @novahe) [SIG Architecture, Instrumentation, Node and Scheduling] - ResourceClaim を共有する Pod が gang scheduling でスケジュールされないバグを修正しました。(#137647, @nojnhuh) [SIG Node, Scheduling and Testing]
- Pod が更新により Unschedulable から Gated に遷移した場合、Gated pods metric が更新されないバグを修正しました。(#135368, @vshkrabkov) [SIG Scheduling]
- 以前に unschedulable とマークされた Pod が
PreEnqueueプラグインで失敗した場合に、scheduler_unschedulable_podsメトリックが不自然に増加する(リークする)可能性があったバグを修正しました。(#135981, @vshkrabkov) [SIG Scheduling] - クラスタ管理者が設定した DRA extended resource のクォータをユーザが回避できてしまう抜け道を修正しました。(#135434, @yliaog) [SIG API Machinery, Apps, Node, Scheduling and Testing]
-
DRA extended resource は DRA デバイス (ResourceClaim) を従来の拡張リソースのインターフェイス(例:nvidia.com/gpu)で使えるようにする機能です。Pod の resource request と ResourceClaim の両面を見てクォータを計算することが必要になりますが、過小評価する経路が存在していました。クォータを意図的に回避しようとしないと起こらないケースだと思いますが、正しく計算されるように修正されました。
-
- Nominated node を持つ Pod の変更に対する、特定プラグインの queueing hint を修正しました。(#135392, @brejman) [SIG Scheduling]
-
spec.nominatedNodeName != ""な Pod は「スケジュール済み」と見なすべきですが、一部のプラグインではspec.nodeNameしか見ておらず未スケジュールと誤って判断されていたケースがありました。
-
- 削除された Pod の anti affinity が pending Pod に一致する場合の inter-pod anti affinity の queueing hint を修正しました。この問題により、スケジューリングが遅延する可能性がありました。(#135325, @brejman) [SIG Scheduling and Testing]
- Pod のラベルが変更された場合の
interpodaffinityプラグインの queueing hint を修正しました。(#135394, @brejman) [SIG Scheduling] - ResourceSlice エントリを
sharedとonNodeのカテゴリに分割することで DRA スケジューリングの性能を改善し、大規模クラスタにおける Filter 処理のレイテンシを約 50% 削減しました。(#136588, @abel-von) [SIG API Machinery, Apps, Auth, Node and Scheduling]-
従来は各 Filter ですべての ResourceSlice を走査してプールを構成しており、大規模なクラスタではこのループが支配的になっていました。ResourceSlice をノード固有の onNodeとクラスタで共有のsharedに分け、ノード固有分は map から引くことで、不要な全件走査を避ける最適化がおこなわれました。
-
- 以前は、あるノードに対して DRA によるデバイス割り当てを試みてタイムアウトした場合でも、必要なリソースを持つ別のノードがあればスケジューリングが続行されていました。これにより、そのノードが無視されたことが隠れてしまう可能性がありました。さらに悪いことに、スケジューリング全体が遅い場合、Pod が誤って unschedulable に移動され、periodic sweep 後にしかリトライされないことがありました。タイムアウトは常に Pod のスケジューリング失敗として見えるエラーになり、Pod ごとの指数バックオフでリトライされるようになりました。(#137607, @0xMH) [SIG Node, Scheduling and Testing]
- ドキュメントと整合するように
NodeResourcesBalancedAllocationスコアリングアルゴリズムを更新しました。Score は、要求された Pod を含めた場合と含めない場合の両方のバランスを考慮するようになりました。以前のアルゴリズムは、要求された Pod を含めたバランスのみを考慮していました。この変更により、一部のケースでスケジューリング結果が変わる可能性があります。(#135573, @brejman) [SIG Scheduling]-
ドキュメント上は「Pod を置くことでバランスが改善するノードを優先する」挙動ですが、実装は配置後のバランスだけで判断していました。
-