Kubernetes 1.33 の CHANGELOG から、SIG-Scheduling に関するところを抜粋して紹介します。 は筆者によるコメントです。
過去 3 リリースの変更内容:
- Kubernetes 1.32: SIG-Scheduling の変更内容
- Kubernetes 1.31: SIG-Scheduling の変更内容
- Kubernetes 1.30: SIG-Scheduling の変更内容
所感
SIG-Scheduling 含め複数の SIG にまたがる大きな機能の開発が進んでいます。
ついに InPlacePodVerticalScaling
(KEP-1287) がベータに昇格しました。
デフォルトで有効ですが、Pod の /resize
サブリソースを介してリソース量を変更する API なので、ユーザが使えるかどうかは RBAC で制御できます。
なお、Deployment や StatefulSet の Pod template を変更したときについては、KEP では予定されているものの 1.33 時点では未実装です。
仕様もスケッチ段階で、RBAC との整合性などがどうなるか気になるところです。
Dynamic Resource Allocation (DRA) のコア機能は 1.32 でベータに昇格していましたが、関連機能がいくつも開発されています。
個人的に注目しているのは device taints/tolerations (KEP-5055) です。
ノード単位ではなくデバイス単位で taint を設定できるようになるため、より細粒度にデバイスのメンテナンスができるようになります。
スケジューラに限った機能だと、SchedulerPopFromBackoffQ
(KEP-5142) と SchedulerAsyncPreemption
(KEP-4832) という二つの機能がベータ段階に昇格しました。
とくに後者は、計算リソースが有限であるなどの、プリエンプションが多い環境でスケジューリングスループットを向上させることが期待でき、注目しています。
Urgent Upgrade Notes
SIG-Scheduling に関するものはありません。
Changes by Kind
Deprecation
- 利用可能なストレージ容量によってノードをスコアリングするための
StorageCapacityScoring
フィーチャゲートが追加されました。これはアルファ段階であり、デフォルトでは無効です。VolumeCapacityPriority
アルファ機能はこれに置き換えられ、デフォルトの動作が変更されました。VolumeCapacityPriority
は割り当て可能な容量が最も少ないノードを優先しましたが、StorageCapacityScoring
は割り当て可能な容量が最も多いノードを優先します。詳細は KEP-4049 を参照してください。(#128184, @cupnes) [SIG Scheduling, Storage and Testing]-
デフォルトでは空き容量が多いノードを優先しますが、
VolumeBinding
スケジューラプラグインの設定で、空き容量が少ないノードを優先することもできます。
-
- Pod の
status.resize
フィールドは非推奨となり、今後は設定されません。Pod のリサイズ状況は、代わりにPodResizeInProgress
とPodResizePending
という二つの新しい conditions に公開されるようになります。(#130733, @natasha41575) [SIG API Machinery, Apps, CLI, Node, Scheduling and Testing]
API Change
- フィーチャゲート
DRAPartitionableDevices
を追加しました。有効にすると、Dynamic Resource Allocation (DRA) が分割可能なデバイスの割り当てをサポートします。(#130764, @cici37) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Scheduling, Storage and Testing] - DRA で ResourceClaim 内にデバイス要求の基準を「いずれか一つ」の優先順位付けされたリストで記述できるようになりました。(#128586, @mortent) [SIG API Machinery, Apps, Etcd, Node, Scheduling and Testing]
-
KEP-4816 で提案された機能で、例えば「大きい GPU 一つ、それが割り当てられない場合は小さい GPU 二つ」というような要求が書けるようになりました。
-
- サイドカーコンテナ(
initContainers
内で定義され、restartPolicy
がAlways
に設定されているコンテナ)の in-place vertical scaling がサポートされました。(#128367, @vivzbansal) [SIG API Machinery, Apps, CLI, Node, Scheduling and Testing] - Pod レベルのリソースのため、Pod API が
spec
レベルでhugepages
リソースをサポートするように変更されました。(#130577, @KevinTMtz) [SIG Apps, CLI, Node, Scheduling, Storage and Testing] - DRA: デバイス taint により、DRA ドライバまたは管理者はデバイスを使用不可としてマークでき、これによりデバイスの割り当てが防止されます。デバイスが使用不可になった場合、taint の重大性および claim がその taint を許容するかにおうじて、Pod が実行時に退避させられることもあります。(#130447, @pohly) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Instrumentation, Node, Scheduling and Testing]
-
KEP-5055 で提案された機能で、ノード単位ではなくデバイス単位で taint を設定できます。
-
- PodAffinity / PodAntiAffinity の
MatchLabelKeys
/ MismatchLabelKeys 機能を GA に昇格しました。(#130463, @sanposhiho) [SIG API Machinery, Apps, Node, Scheduling and Testing]-
ラベルのキーだけ指定し、同じ値をもつ Pod をアフィニティの計算対象に入れる機能です。1.31 からデフォルトで有効です。
-
- Pod 作成時に Kubernetes で
NodeSelectorRequirement
の値に対する検証を実装しました。(#128212, @AxeZhan) [SIG Apps and Scheduling]-
nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions.values
の検証が漏れており、不正な値であっても Pod が作成できてしまうが、スケジューラによるパースに失敗するのでスケジュールされないというバグが修正されました。
-
-
NodeInclusionPolicyInPodTopologySpread
をで Stable (安定版) に昇格しました。(#130920, @kerthcet) [SIG Apps, Node, Scheduling and Testing]-
Pod のトポロジ分散の歪みを計算する際に、taint をもつノードを除外できるようにする機能です。1.26 からデフォルトで有効です。
-
- フィーチャゲート
InPlacePodVerticalScalingAllocatedStatus
は非推奨となり、使用されなくなりました。ContainerStatus
のAllocatedResources
フィールドは、InPlacePodVerticalScaling
フィーチャゲートによってガードされるようになりました。(#130880, @tallclair) [SIG CLI, Node and Scheduling] -
PodObservedGenerationTracking
フィーチャゲートが有効な場合、kube-scheduler は Pod の conditions にobservedGeneration
フィールドを設定します。(#130649, @natasha41575) [SIG Node, Scheduling and Testing]-
In-place Update of Pod Resources により Pod spec が更新できるようになったため、どの Pod spec の世代 (
.metadata.generation
) を参照しているのかを明示する必要が生まれました。kube-scheduler の他に kube-controller-manager や kubelet もこのフィールドを設定します。
-
-
resource.k8s.io/v1beta1
API は非推奨となり、1.36 で削除される予定です。代わりにv1beta2
を使用してください。(#129970, @mortent) [SIG API Machinery, Apps, Auth, Etcd, Node, Scheduling and Testing]-
主に KEP-4816 による API の変更に伴うものです。
-
Feature
-
SchedulerPopFromBackoffQ
フィーチャゲートが追加されました。これはベータ段階であり、デフォルトで有効です。ActiveQ が空のときに backoffQ から Pod を取り出すことで、スケジューリングキューの動作が改善されました。スケジュール可能性のある Pod をできるだけ早く処理し、backoff キューのペナルティ効果を排除します。(#130772, @macsko) [SIG Scheduling and Testing]-
KEP-5142 で提案された機能です。スケジューラをアイドル状態にするのではなく、backoff ペナルティを受けている Pod のスケジュールを試します。
PreEnqueue
プラグインが呼ばれるタイミングが、Pod が activeQ に入る前から backoffQ に入る前に変更されたことに注意が必要です。
-
- kube-scheduler に
/flagz
HTTP エンドポイントが追加されました。(#128818, @yongruilin) [SIG Architecture, Instrumentation, Scheduling and Testing] - kube-scheduler 用に
/statusz
エンドポイントが追加されました。(#128987, @Henrywu573) [SIG Instrumentation, Scheduling and Testing] - スケジューラフレームワークで Pod を
NodeInfo
に追加する際に、計算された Pod リソースがキャッシュされるようになり、スケジュール不可能な Pod を処理する際のパフォーマンスが向上しました。(#129635, @macsko) [SIG Scheduling]-
プリエンプション処理のスループットが
scheduler_perf
のベンチマークで最大 30 % 向上したようです。
-
- 非同期プリエンプション機能がベータに昇格しました。現在、フィーチャーフラグ
SchedulerAsyncPreemption
はデフォルトで有効です。(#130550, @sanposhiho) [SIG Scheduling]-
KEP-4832 で提案された機能です。プリエンプションでは Pod を削除する API を呼び、その間スケジューリング処理を待たせてしまいます。これを非同期にし、並行して他の Pod のスケジューリングを進められるようにすることでスループットを向上させます。
-
- PreBind または Bind でスケジューリングが失敗した場合、スケジューラは失敗の理由に関わらず、バックオフ時間の直後に失敗した Pod を再試行します。この場合、再試行前に
EventsToRegister
(Queueing Hints) は考慮されません。(#130189, @ania-borowiec) [SIG Scheduling]-
PreBind プラグインを呼ぶ前に Pod を「スケジューリング処理中の Pod リスト」から取り除くことで、スケジューラのメモリ使用量を削減します。
-
- 必須のトポロジ分散をもつ Pod をスケジューリングする際のパフォーマンスが改善されました。(#129119, @macsko) [SIG Scheduling]
-
同じキーをもつトポロジ分散制約が複数あるときの計算が間違っているバグがありました。この修正と同時に、パフォーマンスも改善しました。
-
- スケジューリングフレームワークが
NodeInfo
を Score プラグインに公開するようになりました。(#130537, @saintube) [SIG Scheduling, Storage and Testing]-
Score
メソッドのシグネチャが変更されているので、カスタムスケジューラを実装している場合は注意してください。
-
-
SidecarContainers
機能が GA に昇格しました。SidecarContainers
フィーチャゲートはデフォルト値に固定され、v1.36 で削除される予定です。このフィーチャゲートを明示的に設定していた場合は、削除してください。(#129731, @gjkim42) [SIG Apps, Node, Scheduling and Testing] - 利用可能なストレージ容量によってノードをスコアリングするための
StorageCapacityScoring
フィーチャゲートが追加されました。これはアルファ段階であり、デフォルトでは無効です。VolumeCapacityPriority
アルファ機能はこれに置き換えられ、デフォルトの動作が変更されました。VolumeCapacityPriority
は割り当て可能な容量が最も少ないノードを優先しましたが、StorageCapacityScoring
は割り当て可能な容量が最も多いノードを優先します。詳細は KEP-4049 を参照してください。(#128184, @cupnes) [SIG Scheduling, Storage and Testing]
Documentation
SIG-Scheduling に関するものはありません。
Bug or Regression
- DRA: ResourceClaims を使用していない Pod が他の理由でスケジュール不可能だった場合に、その理由の説明に "no new claims to deallocate" という不要な情報が含まれていました。(#129823, @googs1025) [SIG Node and Scheduling]
- Nominated node の変更を正しく処理するようにスケジューリングの動作を修正しました。Nominated node 名が削除されたり、別のノードに変更されたりした場合に、必要に応じて Pod の再スケジューリングをトリガーします。(#129058, @dom4ha) [SIG Scheduling, Storage and Testing]
-
BalancedAllocation
プラグインは、すべてのベストエフォート(リソース要求をもたない)Pod をスキップするようになりました。(#130260, @Bowser1704)-
BalancedAllocation
プラグインは、(デフォルトでは)CPU とメモリのリソース使用率が均等に近くなるようにノードをスコアリングします。この計算に不備があり、ベストエフォート Pod が特定のノードに偏ってスケジュールされることがありました。
-
Other (Cleanup or Flake)
- Pod がラベルセレクタに一致しないボリュームをアタッチしようとしたときに表示されるエラーメッセージを、"x node(s) had volume node affinity conflict" から "x node(s) didn't match PersistentVolume's node affinity" に変更しました。(#129887, @rhrmo) [SIG Scheduling and Storage]
-
scheduler_cache_size
メトリクスを実装しました。また、scheduler_scheduler_cache_size
メトリクスは非推奨となりscheduler_cache_size
に置き換えられ、v1.34 で削除される予定です。(#128810, @googs1025) - 非推奨となっていた
pod_scheduling_duration_seconds
メトリクスを削除しました。ユーザーはpod_scheduling_sli_duration_seconds
に移行する必要があります。(#128906, @sanposhiho) [SIG Instrumentation and Scheduling]