2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes 1.34: SIG-Scheduling の変更内容

Posted at

Kubernetes 1.34 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。 :pencil: は筆者によるコメントです。

過去 3 リリースの変更内容:

:pencil: 所感

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]
    • :pencil: プラグイン内で 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]
    • :pencil: 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]
    • :pencil: 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 でサポートされる拡張リソース機能により、クラスタ管理者は DeviceClassextendedResourceName を指定可能になり、アプリケーション管理者は DeviceClass に一致する DRA デバイスをこれまで通り拡張リソースを pod のリソース要求で使えるようになりました。ただし、DRA でサポートされる拡張リソースに対しては、NodeResourcesFit プラグインのスコアリング機能は動作しません(#130653@yliaog)[SIG API Machinery、Apps、Auth、Node、Scheduling、Testing]
  • NodePorts スケジューリングプラグインを拡張し、再起動可能な init コンテナが使用する HostPort を考慮するようにしました(#132040@avrittrohwer)[SIG Scheduling、Testing]
  • 1.33 の kube-scheduler において、要求されるリソースをコンテナの specstatus 間で集計する際に nil panic が発生する不具合を修正しました(#132895@yue9944882)[SIG Node、Scheduling]
  • Downward API の resourceFieldRef フィールドのフォールバック動作を更新し、pod レベルのリソースを考慮するようにしました。具体的には、コンテナレベルの制限値が設定されていない場合、pod レベルの制限値を先に使用し、それも設定されていない場合にのみノードの割り当て可能リソースを参照するように変更しました(#132605@toVersus)[SIG Node、Scheduling、Testing]

Feature

  • スケジューラにおいて SchedulerAsyncAPICallsフィーチャゲートが有効化されている場合、非同期 API 呼び出しをモニタリングするための 3 つのメトリクスを追加しました:
    • scheduler_async_api_call_execution_total:呼び出しタイプ別および結果別(成功/エラー)の API 呼び出し実行数をトラック
    • scheduler_async_api_call_duration_seconds:呼び出しタイプと結果別の API コール実行時間のヒストグラム
    • scheduler_pending_async_api_calls:キュー内の未処理 API コールの現在数を示すゲージ値
      #133120@utam0k)[SIG Release、Scheduling]
  • PreBindPlugin インターフェースに新しいメソッド PreBindPreFlight を追加しました。すべての in-tree PreBind プラグインはこの PreBindPreFlight メソッドを実装するように更新されました(#132391@sanposhiho)[SIG Node、Scheduling、Storage、Testing]
    • :pencil: 後述の KEP-5278 に関する変更です。スケジューラは PreBind プラグインの実行時に pod の status.nominatedNodeName フィールドを設定するようになりますが、これは API 呼び出しを伴うため、必要なときだけ PreBind プラグインを呼び出すことが望ましいです。PreScore と Score プラグインの関係と同じように、PreBindPreFlight メソッドの返り値によって PreBind メソッドを呼ぶかどうかを決定します。
  • スケジューラのパフォーマンステストにメモリ追跡機能を追加し、scheduler_perf 実行中にメモリリークの検出とメモリ使用パターンの監視を可能にしました(#132910@utam0k)[SIG Scheduling、Testing]
  • KEP-5278 のフィーチャゲート ClearingNominatedNodeNameAfterBindingNominatedNodeNameForExpectation をベータ版からアルファ版に降格しました(#133293@utam0k)[SIG Scheduling、Testing]
    • :pencil: 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 プラグインはスケジューリングフレームワークの APIDispatcherAPICacher を利用して独自のコールをディスパッチします(#132886@macsko)[SIG Release、Scheduling、Testing]
    • :pencil: KEP-5229: Asynchronous API calls during scheduling で提案されている機能です。KEP-4832 ではプリエンプションのための API 呼び出しを非同期化しましたが、KEP-5229 ではスケジューリングに関連するすべての API 呼び出しを非同期化することでスケジューリングのスループットを向上させることを目指しています。
  • スケジューラの QueueingHint サポートを GA に昇格しました(#131973@sanposhiho)[SIG Scheduling、Testing]
  • PreBindPreFlightSkipを返した場合、スケジューラは PreBind フェーズでプラグインを実行しません。一方、PreBindPreFlight のいずれかが Success を返した場合、スケジューラは pod に NominatedNodeName を設定し、クラスタオートスケーラなどの外部コンポーネントが pod がノードにバインドされることを認識できるようにします(#133021@sanposhiho)[SIG Scheduling、Testing]
  • Kubernetes API サーバにおいて、matchLabelKeys から構築されたセレクタを topologySpreadConstraintslabelSelector に統合しました。これにより、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]
    • :pencil: 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]
    • :pencil: 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]
    • :pencil: V(4) は debug レベル、V(5) は trace レベルに使われています。ログレベルの規約は ここ で定められています。
  • 型定義:CodeStatuspkg/scheduler/framework から staging リポジトリに移動しました。これらの型を使用するユーザーは、インポートパスをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに変更する必要があります(#132087, @ania-borowiec)[SIG Node, Scheduling, Storage and Testing]
  • 型定義:CycleStateStateDataStateKeyErrNotFoundpkg/scheduler/framework から k8s.io/kube-scheduler/framework に移動しました。スケジューリングフレームワークで各プラグインに渡される CycleState 型は、新しいインターフェース CycleStatek8s.io/kube-scheduler/framework 内)に変更されました(#131887@ania-borowiec)[SIG Node、Scheduling、Storage、Testing]
  • 型定義:ClusterEventActionTypeEventResourceClusterEventWithHintQueueingHintQueueingHintFnpkg/scheduler/framework から k8s.io/kube-scheduler/framework に移動しました(#132190@ania-borowiec)[SIG Node、Scheduling、Storage、Testing]
  • 型定義:NodeInfoPodInfoQueuedPodInfoPodResourceAffinityTermWeightedAffinityTermResourceImageStateSummaryProtocolPortHostPortInfopkg/scheduler/framework から staging リポジトリに移動しました。これらの型を使用するユーザーは、インポートパスをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに変更する必要があります。また、必要に応じてフィールドの使用方法を getter/setter 関数に変更してください(#132457@ania-borowiec)[SIG Node、Scheduling、Storage、Testing]
    • :pencil: 以上の PR により、スケジューリングフレームワーク関連の型定義が k8s.io/kubernetes から k8s.io/kube-scheduler に移りました。前者は非常に大きなリポジトリですが、後者は外部から import されることを想定した分割されたリポジトリであり、スケジューラプラグインなどの開発時に後者のみを import すれば十分になりました。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?