Kubernetes 1.34 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。
は筆者によるコメントです。
過去 3 リリースの変更内容:
- Kubernetes 1.33: SIG-Scheduling の変更内容
- Kubernetes 1.32: SIG-Scheduling の変更内容
- Kubernetes 1.31: SIG-Scheduling の変更内容
所感
DRA のコア機能が GA に昇格しましたが、DRA デバイスを扱うスケジューラプラグインのパフォーマンスに関する変更がいくつかあります。
従来の拡張リソースは単純な個数だけでノードの容量と pod による要求が表現されていましたが、DRA ではデバイスごとに属性があったり、優先度付きのリストで要求を表現できたりするため、スケジューリング処理の計算量が大きくなることは必至です。
スケジューリング処理の最適化に加えて、デバイス属性の付け方や DeviceClass によるその選択、タイムアウト値のチューニングなど、クラスタ管理者による運用面での工夫も必要になりそうです。
個人的にうれしい機能は DRAExtendedResource (KEP-5004: DRA: Handle extended resource requests via DRA Driver) という、拡張リソースと同じ形で DRA デバイスの要求を記述できる機能です。
ユーザへの影響を抑えながら DRA を導入しやすくなることを期待しています。
おそらく MutatingAdmissionPolicy や admission webhook を使い自分で mutation することもできると思いますが、Kubernetes 組み込みの機能として提供されたほうが安心です。
もう一つうれしい変更は、スケジューリングフレームワーク関連の型定義が k8s.io/kubernetes から k8s.io/kube-scheduler に移ったことです。
スケジューラプラグインの開発時に必要な部分だけを import できるようになったことで、依存の管理が簡単になると期待しています。
Urgent Upgrade Notes
- スケジューリングフレームワークにおいて、
NodeInfoが PreFilter プラグインに公開されました。PreFilter プラグインは引数として渡されるNodeInfoリストを受け付けるようになりました(#130720、@vivzbansal)[SIG Node、Scheduling、Storage、Testing]-
プラグイン内で NodeInfoをオンデマンドに取得することもできますが、スケジューリングサイクルの開始時にフレームワークが取得したNodeInfoを使うことで、一貫したデータを使えるようになります。
-
Changes by Kind
Deprecation
SIG-Scheduling に関するものはありません。
API Change
- Pod の in-place vertical scaling 完了時の詳細なイベントを追加し、クラスタ管理とデバッグしやすさを向上しました(#130387、@shiya0705)[SIG API Machinery、Apps、Autoscaling、Node、Scheduling、Testing]
-
kubelet が ResizeCompletedという reason の Event を生成するようになりました。
-
- Eviction Manager: ヘルパー関数の内部ロジックを変更しました(#132277、@KevinTMtz)[SIG Node、Scheduling、Testing]
- DRA:スケジューラプラグインは、異常なフィルタ処理を防止するために、10秒のタイムアウトを導入しました。この値はプラグインの
FilterTimeoutで変更可能で、値を 0 に設定するとタイムアウトが無効化され、Kubernetes <= 1.33の動作に戻ります(#132033、@pohly)[SIG Node、Scheduling、Testing]-
DRA のスケジューラプラグインは Filter 拡張点で pod が要求するデバイスを割り当てられるノードを絞り込みますが、デバイス要求と割り当ての組合わせを探索するため、非常に長い時間がかかる場合があります。この機能は DRASchedulerFilterTimeoutフィーチャゲート(ベータ段階、デフォルトで有効)で有効になります。
-
- DRA:優先順位付けされたリスト機能を使用したデバイス要求において、割り当てられたデバイス数が claim あたりに許可された数を超えた場合、スケジューラは早期にデバイス割り当て処理を中止するようになりました。従来は多くの組み合わせを試していたため、処理時間が長時間に及ぶケースがありました(#130593、@mortent)[SIG Apps、Node、Scheduling、Testing]
- DRA:コア機能を GA に昇格しました。この新たに安定化した機能は、DRAの構造化パラメータ形式を採用しています(#132706、@pohly)[SIG API Machinery、Apps、Auth、Autoscaling、Etcd、Node、Scheduling、Testing]
- DRA でサポートされる拡張リソース機能により、クラスタ管理者は
DeviceClassにextendedResourceNameを指定可能になり、アプリケーション管理者は DeviceClass に一致する DRA デバイスをこれまで通り拡張リソースを pod のリソース要求で使えるようになりました。ただし、DRA でサポートされる拡張リソースに対しては、NodeResourcesFit プラグインのスコアリング機能は動作しません(#130653、@yliaog)[SIG API Machinery、Apps、Auth、Node、Scheduling、Testing]-
KEP-5004: DRA: Handle extended resource requests via DRA Driver で提案されている機能です。nvidia.com/gpu: 2のように従来の拡張リソース名を使って、DRA ドライバが管理するデバイスを要求できるようになります。現在アルファ段階です。
-
- NodePorts スケジューリングプラグインを拡張し、再起動可能な init コンテナが使用する HostPort を考慮するようにしました(#132040、@avrittrohwer)[SIG Scheduling、Testing]
- 1.33 の kube-scheduler において、要求されるリソースをコンテナの
specとstatus間で集計する際に nil panic が発生する不具合を修正しました(#132895、@yue9944882)[SIG Node、Scheduling] - Downward API の
resourceFieldRefフィールドのフォールバック動作を更新し、pod レベルのリソースを考慮するようにしました。具体的には、コンテナレベルの制限値が設定されていない場合、pod レベルの制限値を先に使用し、それも設定されていない場合にのみノードの割り当て可能リソースを参照するように変更しました(#132605、@toVersus)[SIG Node、Scheduling、Testing]
Feature
- スケジューラにおいて
SchedulerAsyncAPICallsフィーチャゲートが有効化されている場合、非同期 API 呼び出しをモニタリングするための 3 つのメトリクスを追加しました: -
PreBindPluginインターフェースに新しいメソッドPreBindPreFlightを追加しました。すべての in-tree PreBind プラグインはこのPreBindPreFlightメソッドを実装するように更新されました(#132391、@sanposhiho)[SIG Node、Scheduling、Storage、Testing]-
後述の KEP-5278 に関する変更です。スケジューラは PreBind プラグインの実行時に pod の status.nominatedNodeNameフィールドを設定するようになりますが、これは API 呼び出しを伴うため、必要なときだけ PreBind プラグインを呼び出すことが望ましいです。PreScore と Score プラグインの関係と同じように、PreBindPreFlightメソッドの返り値によってPreBindメソッドを呼ぶかどうかを決定します。
-
- スケジューラのパフォーマンステストにメモリ追跡機能を追加し、
scheduler_perf実行中にメモリリークの検出とメモリ使用パターンの監視を可能にしました(#132910、@utam0k)[SIG Scheduling、Testing] - KEP-5278 のフィーチャゲート
ClearingNominatedNodeNameAfterBindingとNominatedNodeNameForExpectationをベータ版からアルファ版に降格しました(#133293、@utam0k)[SIG Scheduling、Testing]-
KEP-5278: Nominated node name for an expected pod placement で導入されるフィーチャゲートです。この KEP では、kube-scheduler や外部コンポーネント(Cluster Autoscaler など)が、pod の status.nominatedNodeNameフィールドを通して pod が配置される先のノードを記録・認識することで、互いに連携できるようになります。
-
- スケジューリングに関連しないエラー(ネットワークエラーなど)が発生しても、pod のバックオフ時間が延長されないようにしました(#128748、@sanposhiho)[SIG Scheduling、Testing]
- Pod スケジューリング時にディスパッチされる API 呼び出しは、
SchedulerAsyncAPICallsフィーチャゲートが有効な場合、非同期で実行されます。Out-of-tree プラグインはスケジューリングフレームワークのAPIDispatcherとAPICacherを利用して独自のコールをディスパッチします(#132886、@macsko)[SIG Release、Scheduling、Testing]-
KEP-5229: Asynchronous API calls during scheduling で提案されている機能です。KEP-4832 ではプリエンプションのための API 呼び出しを非同期化しましたが、KEP-5229 ではスケジューリングに関連するすべての API 呼び出しを非同期化することでスケジューリングのスループットを向上させることを目指しています。
-
- スケジューラの
QueueingHintサポートを GA に昇格しました(#131973、@sanposhiho)[SIG Scheduling、Testing] -
PreBindPreFlightがSkipを返した場合、スケジューラはPreBindフェーズでプラグインを実行しません。一方、PreBindPreFlightのいずれかがSuccessを返した場合、スケジューラは pod にNominatedNodeNameを設定し、クラスタオートスケーラなどの外部コンポーネントが pod がノードにバインドされることを認識できるようにします(#133021、@sanposhiho)[SIG Scheduling、Testing] - Kubernetes API サーバにおいて、
matchLabelKeysから構築されたセレクタをtopologySpreadConstraintsのlabelSelectorに統合しました。これにより、pod をトポロジ的に分散させる挙動が inter-pod affinity と整合するようになりました。既存の pod がmatchLabelKeysを使用している場合の互換性を確保するため、このスケジューラの挙動は v1.34 まで変わらず維持されました。v1.32 から v1.34 へのアップグレードは段階的に行う必要があります(v1.32 → v1.33 → v1.34)。また、v1.32 でmatchLabelKeysを使用して作成された pod は v1.34 への更新より前にスケジューリングされるようにしてください。matchLabelKeysに依存していたコントローラは、直接これを処理する必要がなくなり、代わりにlabelSelectorを使用できます。この新機能はデフォルトで有効化されているMatchLabelKeysInPodTopologySpreadSelectorMergeフィーチャゲートで制御されます(#129874、@mochizuki875)[SIG Apps、Node、Scheduling、Testing]-
Pod affinity については、kube-apiserver が matchLabelKeysからラベルセレクタを生成してlabelSelectorにマージし、pod の spec を書き換えていますが、pod topology spread ではスケジューラプラグインがこの操作をしており、pod の spec は書き換えられていませんでした。この変更により、スケジューラプラグインは kube-apiserver が pod spec を書き換えることを前提とするようになるので、Kubernetes のバージョン更新には注意が必要です。
-
- スケジューラは pod の
nominatedNodeNameフィールドをクリアしないようになりました。Cluster Autoscaler や Karpenter などの外部コンポーネントが、必要に応じてこのフィールドを管理する責任を負うようになりました(#133276、@macsko)[SIG Scheduling、Testing] - Pod がノードに正常にバインドされたとき、kube-apiserver が podの
nominatedNodeNameフィールドをクリアするようにしました。これにより、古い情報が外部のスケジューリングコンポーネントに影響を与えることを防止します(#132443、@utam0k)[SIG Apps、Node、Scheduling、Testing] -
DRAPrioritizedListフィーチャゲートをデフォルトで有効化し、ResourceClaim 内で優先順位付けされたリスト形式のサブリクエストを指定できるようにしました(#132767、@mortent)[SIG Node、Scheduling、Testing]
Failing Test
SIG-Scheduling に関するものはありません。
Bug or Regression
- 非同期プリエンプション機能において、preemptor pod が不必要にキューに保持され続ける不具合を修正しました(#133167、@sanposhiho)[SIG Scheduling]
-
Victim pod がすでに削除されていた (deletionTimestamp != nil) 場合に preemptor pod の再スケジューリングが発火されないケースがあったようです。
-
-
PodMaxBackoffDurationkube-scheduler オプションが 0 に設定されている場合、かつSchedulerPopFromBackoffQフィーチャゲートが有効化されている場合、pod のバックオフ処理を完全にスキップするようにしました(#131965、@macsko)
Other (Cleanup or Flake)
- kube-scheduler:廃止予定の
scheduler_scheduler_cache_sizeメトリクスを削除し、scheduler_cache_sizeに置き換えました(#131425、@carlory)[SIG Scheduling] - Volume Binding スケジューラプラグインの過剰なログ出力を削減するため、高頻度なメッセージのログレベルを
V(4)からV(5)に下げました(#132840、@ppmechlinski)[SIG Autoscaling、Scheduling、Storage]-
V(4)は debug レベル、V(5)は trace レベルに使われています。ログレベルの規約は ここ で定められています。
-
- 型定義:
CodeとStatusをpkg/scheduler/frameworkからstagingリポジトリに移動しました。これらの型を使用するユーザーは、インポートパスをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに変更する必要があります(#132087, @ania-borowiec)[SIG Node, Scheduling, Storage and Testing] - 型定義:
CycleState、StateData、StateKey、ErrNotFoundをpkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに移動しました。スケジューリングフレームワークで各プラグインに渡されるCycleState型は、新しいインターフェースCycleState(k8s.io/kube-scheduler/framework内)に変更されました(#131887、@ania-borowiec)[SIG Node、Scheduling、Storage、Testing] - 型定義:
ClusterEvent、ActionType、EventResource、ClusterEventWithHint、QueueingHint、QueueingHintFnをpkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに移動しました(#132190、@ania-borowiec)[SIG Node、Scheduling、Storage、Testing] - 型定義:
NodeInfo、PodInfo、QueuedPodInfo、PodResource、AffinityTerm、WeightedAffinityTerm、Resource、ImageStateSummary、ProtocolPort、HostPortInfoをpkg/scheduler/frameworkからstagingリポジトリに移動しました。これらの型を使用するユーザーは、インポートパスをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに変更する必要があります。また、必要に応じてフィールドの使用方法を getter/setter 関数に変更してください(#132457、@ania-borowiec)[SIG Node、Scheduling、Storage、Testing]-
以上の PR により、スケジューリングフレームワーク関連の型定義が k8s.io/kubernetesからk8s.io/kube-schedulerに移りました。前者は非常に大きなリポジトリですが、後者は外部から import されることを想定した分割されたリポジトリであり、スケジューラプラグインなどの開発時に後者のみを import すれば十分になりました。
-