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 の再スケジューリングが発火されないケースがあったようです。
-
-
PodMaxBackoffDuration
kube-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 すれば十分になりました。
-