Kubernetes 1.28 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。
は筆者によるコメントです。
過去 3 リリースの変更内容:
- Kubernetes 1.27: SIG-Scheduling の変更内容
- Kubernetes 1.26: SIG-Scheduling の変更内容
- Kubernetes 1.25: SIG-Scheduling の変更内容
所感
今回のリリースは、Kubernetes スケジューラの内部に関する変更の割合が多くなっています。
スケジューリングキューへの pod の追加をより賢くおこなうための queueing hint 機能の開発が進んでいます。
Kubernetes 1.26 で導入された Pod Scheduling Readiness 機能 では、pod がゲートされている間、その pod のスケジューリングをおこなわないようにできます。
同じ考えで、pod のスケジューリングが(例えばクラスタ上の空きリソースの不足によって)失敗した場合、その理由が解決される(例えばノードの追加によって)まで、その pod の再スケジューリング(キューへの追加)をおこなわないという最適化が、queueing hint 機能です。
より詳しい説明が Urgent Upgrade Notes にあります。
@sanposhiho さんが開発をリードしており、トラッキングイシューは introduce QueueingHint for wise-enqueueing · Issue #114297 · kubernetes/kubernetes のようです。
また、スケジューラプラグインの呼び出しの最適化(PreScore
/PreFilter
拡張点が Skip
ステータスを返した場合、同じプラグインの Score
/Filter
拡張点をスキップする)が着々と進んでいます。
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
カスタムのスケジューラプラグインの開発者は、EnqueueExtension
インターフェイスに破壊的変更が入ったことに対応する必要があります。
EventsToRegister
メソッドが、ClusterEvent
ではなく ClusterEventWithHint
を返すようになりました。
ClusterEventWithHint
構造体は QueueingHintFn
コールバック関数をフィールドにもっており、これは不要なイベントを無視することで pod の無用な再スケジューリングを抑制することができます。
スケジューラは、クラスタのイベント(ノードの追加など)が起こった際、前回のスケジューリングサイクルでその pod を拒否したプラグインの QueueingHintFn
関数を呼びます。
その結果によって、pod を unschedulable pool から backoff queue / active queue に移すかどうかを決定します。
- 一つ以上の
QueueingHintFn
がQueueImmediately
を返した場合、その pod はすぐ active queue に移されます。 - すべての
QueueingHintFn
がQueueImmediately
を返さず、一つ以上がQueueAfterBackoff
を返した場合、その pod は backoff queue に移されます(すでにバックオフを過ぎていたら active queue)。 - すべての
QueueingHintFn
がQueueSkip
を返した場合、その pod は unschedulable pool に残ります。
適切な QueueingHintFn
を定義することで、無用な再スケジューリングを抑制し、スケジューラの性能向上に役立ちます。
移行方法
後方互換性のため、QueueingHintFn
フィールドが nil
の場合は、QueueAfterBackoff
を常に返すものとして扱われます。
そのため、現在の挙動を保ちたい場合は、QueueingHintFn
をもたない ClusterEventWithHint
を登録すればよいです。
しかし、適切な QueueingHintFn
を登録することが、当然ながらスケジューリングの性能にとってよりよいです。
Changes by Kind(種類別の変更)
Deprecation(非推奨)
- kube-scheduler の非推奨のフラグ
--lock-object-namespace
および--lock-object-name
が削除されました。これらのパラメータを設定するには、--leader-elect-resource-namespace
および--leader-elect-resource-name
またはComponentConfig
を使用してください。(#119130, @SataQiu)
API Change(API 変更)
- kube-scheduler のリーダーが更新されたときのメモリ効率とスケジューリング速度のトレードオフを選択できる新しい設定オプション
delayCacheUntilActive
がKubeSchedulerConfiguration
に追加されました。(#115754, @linxiulei)-
true
にすると、リーダー選出が有効の場合、kube-scheduler プロセスがリーダーに選ばれるまで informer のキャッシュを暖気しなくなります。すると、メモリ使用量は減りますが、新しいリーダーが立ち上がるまで時間がかかることになります。
-
-
NodeVolumeLimits
プラグインは、Pod が制限を持つボリュームを使用しない場合に Filter フェイズをスキップするためにPreFilter
拡張点を実装するようになりました。(#115398, @tangwz)-
PreFilter
拡張点でSkip
ステータスを返すことで、同じプラグインのFilter
拡張点をスキップします。
-
- ResourceClaimTemplate から生成される ResourceClaim の名前が自動生成されるようになりました。基本的な名前はこれまで同様
<pod>-<claim name>
ですが、ランダムな接尾辞が付くことで名前の衝突を回避します。(#117351, @pohly) -
component-base/logs
は、同じ構成を複数回適用しようとしたときにエラーを返すようになりました。これが必要なバイナリはオーバーライドできます。(#117108, @pohly) -
kube-scheduler
の設定 (KubeSchedulerConfiguration
) について、kubescheduler.config.k8s.io/v1beta2
は v1.28 で削除されました。kubescheduler.config.k8s.io/v1
に移行してください。(#117649, @SataQiu)- v1beta3 も Kubernetes 1.29 で削除されます。移行方法は このドキュメント が参考になります。
Feature(機能追加)
- 新しいフィーチャゲート
SchedulerQueueingHints
を追加しました(デフォルトで有効)。この新しいフィーチャゲートは、スケジューラプラグインに関連するイベントの詳細なフィルタリングのためのフレームワークを有効にします。このリリースでは、デフォルトのスケジューリングプラグインはヒントフレームワークを使用しないため、挙動の変更は期待できません。(#119328, @sanposhiho)- 前述の queueing hint 機能を有効にするフィーチャゲートです。
- ResourceClaims が関与する場合のスケジューリングが速くなりました。(#119078, @pohly)
-
スケジューラプラグインで
PreEnqueue
拡張点を実装し、ResourceClaim がまだ存在しない pod のスケジューリングをおこなわないようにしています。また、前述の queueing hint 機能を使い、pod の再スケジューリングをおこなう契機を、ResourceClaim に関するイベントなどに絞っています。
-
スケジューラプラグインで
-
scheduler_scheduler_goroutines
メトリックは削除されました。代わりにscheduler_goroutines
を使用してください。(#117727, @kerthcet) -
pkg/scheduler/framework/preemption
が contextual logging を使うよう移行しました。(#116835, @mengjiao-liu) -
noderesources
スケジューラプラグイン が contextual logging を使うよう移行しました。(#116748, @mengjiao-liu) -
podtopologyspread
スケジューラプラグインが contextual logging を使うよう移行しました。(#116797, @mengjiao-liu) - スケジューラは、スケジュールサイクルが開始する前にハンドラが同期を完了するのを待つようになりました。(#116729, @AxeZhan)
- Kubernetes apiserver は、
podAffinity
またはtopologySpreadConstraints
の中でnull
のラベルセレクタを持つ Pod に対して警告メッセージを発行するようになりました。null
のラベルセレクタは「どの pod ともマッチさせない」を意味します。これをpodAffinity
またはtopologySpreadConstraint
で使用すると、意図しない動作が発生する可能性があります。(#117025, @sanposhiho) - スケジューラは、Pod に対してすることがないときに、
InterPodAffinity
プラグインのScore
拡張点をスキップします。これはInterPodAffinity
プラグインのScore
拡張点に関するメトリクスの値に影響します。(#117794, @utam0k)-
PreScore
拡張点でSkip
ステータスを返すことで、同じプラグインのScore
拡張点をスキップします。
-
- スケジューラは、spread constraint が存在しない場合に
PodTopologySpread
プラグインのFilter
拡張点をスキップします。これは、PodTopologySpread
プラグインのFilter
プラグインに関するメトリクスの値に影響します。(#117683, @utam0k) - スケジューラは、Pod に対してすることがないときに、
PodTopologySpread
プラグインのScore
拡張点をスキップします。これはPodTopologySpread
プラグインのScore
拡張点に関するメトリクスの値に影響します。(#118608, @utam0k) - スケジューラのインターフェースとキャッシュに関するメソッドを contextual logging contextual logging を使うよう移行しました。(#116849, @mengjiao-liu)
-
plugin_evaluation_total
メトリックは、PreScore
/Score
拡張点をサポートするようになりました。このメトリックは、PreScore
/Score
プラグインがスケジューリング中の pod に対してすることがない場合は増加しません。(#118025, @AxeZhan)
Documentation(ドキュメント改善)
SIG-Scheduling に関するものはありません。
Failing Test(失敗しているテスト)
SIG-Scheduling に関するものはありません。
Bug or Regression(バグ修正)
- クリティカルなコードパスで頻繁にメトリックをルックアップすることによるスケジューラの性能低下が修正されました。(#117594, @tosi3k)
-
PreEnqueue
拡張点を実装する プラグインがbackoffQ
を介してactiveQ
に移動される Pod に対して実行されない既知の問題を修正しました。(#117194, @sanposhiho)-
1.27 にあったバグです。カスタムした
PreEnqueue
プラグインでは、backoff queue にある(つまり、いちどゲートを通った) pod がゲートされた状態に戻されることがありえますが、このケースを想定していませんでした。
-
1.27 にあったバグです。カスタムした
- リソース要求量がゼロの場合、kube-scheduler は pod のリソース要求量のチェックをスキップするようになりました。(#116408, @ChenLingPeng)
-
具体的には
NodeResourceFit
プラグインです。
-
具体的には
-
pod_scheduling_duration_seconds
メトリックは、pod がPreEnqueue
に失敗した場合(ゲートされた場合など)の時間を考慮しないようになりました。(#118049, @helayoty)- Pod がゲートされていたあいだの時間は含まれずに、active queue に追加された時点からの時間が計算されることになります。
Other (Cleanup or Flake)(その他)
- プリエンプションされた pod の詳細(プリエンプションされた pod とした pod を含む)を出力する、v2 レベルの info ログが追加されました。(#117214, @HirazawaUi)
-
pkg/scheduler/framework/runtime
が contextual logging を使うよう移行しました。(#116842, @mengjiao-liu) -
interpodaffinity
プラグインが contextual logging を使うよう移行しました。(#116635, @mengjiao-liu) -
volumezone
プラグインが contextual logging を使うよう移行しました。(#116829, @mengjiao-liu) - フィーチャゲート
CSIMigrationGCE
は GA に昇格し、v1.25 で無条件に有効化していた部分が削除されました。gcepd
パッケージもすべて削除されました。(#117055, @cyclinder) - フィーチャーゲート
DisableAcceleratorUsageMetrics
およびPodSecurity
は GA に昇格し、v1.28 で無条件に有効化されていた部分が削除されました。(#114068, @cyclinder) -
TestPerPodSchedulingMetrics
に対してテーブルドリブンテストを使用するようになりました。(#118842, @helayoty)