Kubernetes 1.33: SIG-Scheduling の変更内容

Kubernetes 1.33 の [CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md) から、SIG-Scheduling に関するところを抜粋して紹介します。 :pencil: は筆者によるコメントです。

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

- [Kubernetes 1.32: SIG-Scheduling の変更内容](https://qiita.com/ordovicia/items/73066d568076d0ef03eb)
- [Kubernetes 1.31: SIG-Scheduling の変更内容](https://qiita.com/ordovicia/items/1a392826d7829f8a56bb)
- [Kubernetes 1.30: SIG-Scheduling の変更内容](https://qiita.com/ordovicia/items/fc0053e0d27d5b0bcca0)

## :pencil: 所感

SIG-Scheduling 含め複数の SIG にまたがる大きな機能の開発が進んでいます。
ついに `InPlacePodVerticalScaling` ([KEP-1287](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1287-in-place-update-pod-resources)) がベータに昇格しました。
デフォルトで有効ですが、Pod の `/resize` サブリソースを介してリソース量を変更する API なので、ユーザが使えるかどうかは RBAC で制御できます。
なお、Deployment や StatefulSet の Pod template を変更したときについては、KEP では予定されているものの 1.33 時点では未実装です。
仕様もスケッチ段階で、RBAC との整合性などがどうなるか気になるところです。

Dynamic Resource Allocation (DRA) のコア機能は 1.32 でベータに昇格していましたが、関連機能がいくつも開発されています。
個人的に注目しているのは device taints/tolerations ([KEP-5055](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5055-dra-device-taints-and-tolerations)) です。
ノード単位ではなくデバイス単位で taint を設定できるようになるため、より細粒度にデバイスのメンテナンスができるようになります。

スケジューラに限った機能だと、`SchedulerPopFromBackoffQ` ([KEP-5142](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5142-pop-backoffq-when-activeq-empty)) と `SchedulerAsyncPreemption` ([KEP-4832](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/4832-async-preemption)) という二つの機能がベータ段階に昇格しました。
とくに後者は、計算リソースが有限であるなどの、プリエンプションが多い環境でスケジューリングスループットを向上させることが期待でき、注目しています。

## Urgent Upgrade Notes

SIG-Scheduling に関するものはありません。

## Changes by Kind

### Deprecation

- 利用可能なストレージ容量によってノードをスコアリングするための `StorageCapacityScoring` フィーチャゲートが追加されました。これはアルファ段階であり、デフォルトでは無効です。`VolumeCapacityPriority` アルファ機能はこれに置き換えられ、デフォルトの動作が変更されました。`VolumeCapacityPriority` は割り当て可能な容量が最も少ないノードを優先しましたが、`StorageCapacityScoring` は割り当て可能な容量が最も多いノードを優先します。詳細は [KEP-4049](https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/4049-storage-capacity-scoring-of-nodes-for-dynamic-provisioning/README.md) を参照してください。([#128184](https://github.com/kubernetes/kubernetes/pull/128184), [@cupnes](https://github.com/cupnes)) [SIG Scheduling, Storage and Testing]
    - :pencil: デフォルトでは空き容量が多いノードを優先しますが、`VolumeBinding` スケジューラプラグインの設定で、空き容量が少ないノードを優先することもできます。
- Pod の `status.resize` フィールドは非推奨となり、今後は設定されません。Pod のリサイズ状況は、代わりに `PodResizeInProgress` と `PodResizePending` という二つの新しい conditions に公開されるようになります。([#130733](https://github.com/kubernetes/kubernetes/pull/130733), [@natasha41575](https://github.com/natasha41575)) [SIG API Machinery, Apps, CLI, Node, Scheduling and Testing]

### API Change

- フィーチャゲート `DRAPartitionableDevices` を追加しました。有効にすると、Dynamic Resource Allocation (DRA) が分割可能なデバイスの割り当てをサポートします。([#130764](https://github.com/kubernetes/kubernetes/pull/130764), [@cici37](https://github.com/cici37)) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Scheduling, Storage and Testing]
- DRA で ResourceClaim 内にデバイス要求の基準を「いずれか一つ」の優先順位付けされたリストで記述できるようになりました。([#128586](https://github.com/kubernetes/kubernetes/pull/128586), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Etcd, Node, Scheduling and Testing]
    - :pencil: [KEP-4816](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/4816-dra-prioritized-list) で提案された機能で、例えば「大きい GPU 一つ、それが割り当てられない場合は小さい GPU 二つ」というような要求が書けるようになりました。
- サイドカーコンテナ（`initContainers` 内で定義され、`restartPolicy` が `Always` に設定されているコンテナ）の in-place vertical scaling がサポートされました。([#128367](https://github.com/kubernetes/kubernetes/pull/128367), [@vivzbansal](https://github.com/vivzbansal)) [SIG API Machinery, Apps, CLI, Node, Scheduling and Testing]
- Pod レベルのリソースのため、Pod API が `spec` レベルで `hugepages` リソースをサポートするように変更されました。([#130577](https://github.com/kubernetes/kubernetes/pull/130577), [@KevinTMtz](https://github.com/KevinTMtz)) [SIG Apps, CLI, Node, Scheduling, Storage and Testing]
- DRA: デバイス taint により、DRA ドライバまたは管理者はデバイスを使用不可としてマークでき、これによりデバイスの割り当てが防止されます。デバイスが使用不可になった場合、taint の重大性および claim がその taint を許容するかにおうじて、Pod が実行時に退避させられることもあります。([#130447](https://github.com/kubernetes/kubernetes/pull/130447), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Architecture, Auth, Etcd, Instrumentation, Node, Scheduling and Testing]
    - :pencil: [KEP-5055](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5055-dra-device-taints-and-tolerations) で提案された機能で、ノード単位ではなくデバイス単位で taint を設定できます。
- PodAffinity / PodAntiAffinity の `MatchLabelKeys` / MismatchLabelKeys 機能を GA に昇格しました。([#130463](https://github.com/kubernetes/kubernetes/pull/130463), [@sanposhiho](https://github.com/sanposhiho)) [SIG API Machinery, Apps, Node, Scheduling and Testing]
    - :pencil: ラベルのキーだけ指定し、同じ値をもつ Pod をアフィニティの計算対象に入れる機能です。1.31 からデフォルトで有効です。
- Pod 作成時に Kubernetes で `NodeSelectorRequirement` の値に対する検証を実装しました。([#128212](https://github.com/kubernetes/kubernetes/pull/128212), [@AxeZhan](https://github.com/AxeZhan)) [SIG Apps and Scheduling]
    - :pencil: `nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions.values` の検証が漏れており、不正な値であっても Pod が作成できてしまうが、スケジューラによるパースに失敗するのでスケジュールされないというバグが修正されました。
- `NodeInclusionPolicyInPodTopologySpread` をで Stable (安定版) に昇格しました。([#130920](https://github.com/kubernetes/kubernetes/pull/130920), [@kerthcet](https://github.com/kerthcet)) [SIG Apps, Node, Scheduling and Testing]
    - :pencil: Pod のトポロジ分散の歪みを計算する際に、taint をもつノードを除外できるようにする機能です。1.26 からデフォルトで有効です。
- フィーチャゲート `InPlacePodVerticalScalingAllocatedStatus` は非推奨となり、使用されなくなりました。`ContainerStatus` の `AllocatedResources` フィールドは、`InPlacePodVerticalScaling` フィーチャゲートによってガードされるようになりました。([#130880](https://github.com/kubernetes/kubernetes/pull/130880), [@tallclair](https://github.com/tallclair)) [SIG CLI, Node and Scheduling]
- `PodObservedGenerationTracking` フィーチャゲートが有効な場合、kube-scheduler は Pod の conditions に `observedGeneration` フィールドを設定します。([#130649](https://github.com/kubernetes/kubernetes/pull/130649), [@natasha41575](https://github.com/natasha41575)) [SIG Node, Scheduling and Testing]
    - :pencil: 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](https://github.com/kubernetes/kubernetes/pull/129970), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, Etcd, Node, Scheduling and Testing]
    - :pencil: 主に KEP-4816 による API の変更に伴うものです。

### Feature

- `SchedulerPopFromBackoffQ` フィーチャゲートが追加されました。これはベータ段階であり、デフォルトで有効です。ActiveQ が空のときに backoffQ から Pod を取り出すことで、スケジューリングキューの動作が改善されました。スケジュール可能性のある Pod をできるだけ早く処理し、backoff キューのペナルティ効果を排除します。([#130772](https://github.com/kubernetes/kubernetes/pull/130772), [@macsko](https://github.com/macsko)) [SIG Scheduling and Testing]
    - :pencil: [KEP-5142](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5142-pop-backoffq-when-activeq-empty) で提案された機能です。スケジューラをアイドル状態にするのではなく、backoff ペナルティを受けている Pod のスケジュールを試します。`PreEnqueue` プラグインが呼ばれるタイミングが、Pod が activeQ に入る前から backoffQ に入る前に変更されたことに注意が必要です。
- kube-scheduler に `/flagz` HTTP エンドポイントが追加されました。([#128818](https://github.com/kubernetes/kubernetes/pull/128818), [@yongruilin](https://github.com/yongruilin)) [SIG Architecture, Instrumentation, Scheduling and Testing]
- kube-scheduler 用に `/statusz` エンドポイントが追加されました。([#128987](https://github.com/kubernetes/kubernetes/pull/128987), [@Henrywu573](https://github.com/Henrywu573)) [SIG Instrumentation, Scheduling and Testing]
- スケジューラフレームワークで Pod を `NodeInfo` に追加する際に、計算された Pod リソースがキャッシュされるようになり、スケジュール不可能な Pod を処理する際のパフォーマンスが向上しました。([#129635](https://github.com/kubernetes/kubernetes/pull/129635), [@macsko](https://github.com/macsko)) [SIG Scheduling]
    - :pencil: プリエンプション処理のスループットが `scheduler_perf` のベンチマークで最大 30 % 向上したようです。
- 非同期プリエンプション機能がベータに昇格しました。現在、フィーチャーフラグ `SchedulerAsyncPreemption` はデフォルトで有効です。([#130550](https://github.com/kubernetes/kubernetes/pull/130550), [@sanposhiho](https://github.com/sanposhiho)) [SIG Scheduling]
    - :pencil: [KEP-4832](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/4832-async-preemption) で提案された機能です。プリエンプションでは Pod を削除する API を呼び、その間スケジューリング処理を待たせてしまいます。これを非同期にし、並行して他の Pod のスケジューリングを進められるようにすることでスループットを向上させます。
- PreBind または Bind でスケジューリングが失敗した場合、スケジューラは失敗の理由に関わらず、バックオフ時間の直後に失敗した Pod を再試行します。この場合、再試行前に `EventsToRegister` (Queueing Hints) は考慮されません。([#130189](https://github.com/kubernetes/kubernetes/pull/130189), [@ania-borowiec](https://github.com/ania-borowiec)) [SIG Scheduling]
    - :pencil: PreBind プラグインを呼ぶ前に Pod を「スケジューリング処理中の Pod リスト」から取り除くことで、スケジューラのメモリ使用量を削減します。
- 必須のトポロジ分散をもつ Pod をスケジューリングする際のパフォーマンスが改善されました。([#129119](https://github.com/kubernetes/kubernetes/pull/129119), [@macsko](https://github.com/macsko)) [SIG Scheduling]
    - :pencil: 同じキーをもつトポロジ分散制約が複数あるときの計算が間違っているバグがありました。この修正と同時に、パフォーマンスも改善しました。
- スケジューリングフレームワークが `NodeInfo` を Score プラグインに公開するようになりました。([#130537](https://github.com/kubernetes/kubernetes/pull/130537), [@saintube](https://github.com/saintube)) [SIG Scheduling, Storage and Testing]
    - :pencil: `Score` メソッドのシグネチャが変更されているので、カスタムスケジューラを実装している場合は注意してください。
- `SidecarContainers` 機能が GA に昇格しました。`SidecarContainers` フィーチャゲートはデフォルト値に固定され、v1.36 で削除される予定です。このフィーチャゲートを明示的に設定していた場合は、削除してください。([#129731](https://github.com/kubernetes/kubernetes/pull/129731), [@gjkim42](https://github.com/gjkim42)) [SIG Apps, Node, Scheduling and Testing]
- 利用可能なストレージ容量によってノードをスコアリングするための `StorageCapacityScoring` フィーチャゲートが追加されました。これはアルファ段階であり、デフォルトでは無効です。`VolumeCapacityPriority` アルファ機能はこれに置き換えられ、デフォルトの動作が変更されました。`VolumeCapacityPriority` は割り当て可能な容量が最も少ないノードを優先しましたが、`StorageCapacityScoring` は割り当て可能な容量が最も多いノードを優先します。詳細は [KEP-4049](https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/4049-storage-capacity-scoring-of-nodes-for-dynamic-provisioning/README.md) を参照してください。([#128184](https://github.com/kubernetes/kubernetes/pull/128184), [@cupnes](https://github.com/cupnes)) [SIG Scheduling, Storage and Testing]

### Documentation

SIG-Scheduling に関するものはありません。

### Bug or Regression

- DRA: ResourceClaims を使用していない Pod が他の理由でスケジュール不可能だった場合に、その理由の説明に "no new claims to deallocate" という不要な情報が含まれていました。([#129823](https://github.com/kubernetes/kubernetes/pull/129823), [@googs1025](https://github.com/googs1025)) [SIG Node and Scheduling]
- Nominated node の変更を正しく処理するようにスケジューリングの動作を修正しました。Nominated node 名が削除されたり、別のノードに変更されたりした場合に、必要に応じて Pod の再スケジューリングをトリガーします。([#129058](https://github.com/kubernetes/kubernetes/pull/129058), [@dom4ha](https://github.com/dom4ha)) [SIG Scheduling, Storage and Testing]
- `BalancedAllocation` プラグインは、すべてのベストエフォート（リソース要求をもたない）Pod をスキップするようになりました。([#130260](https://github.com/kubernetes/kubernetes/pull/130260), [@Bowser1704](https://github.com/Bowser1704))
    - :pencil: `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](https://github.com/kubernetes/kubernetes/pull/129887), [@rhrmo](https://github.com/rhrmo)) [SIG Scheduling and Storage]
- `scheduler_cache_size` メトリクスを実装しました。また、`scheduler_scheduler_cache_size` メトリクスは非推奨となり `scheduler_cache_size` に置き換えられ、v1.34 で削除される予定です。([#128810](https://github.com/kubernetes/kubernetes/pull/128810), [@googs1025](https://github.com/googs1025))
- 非推奨となっていた `pod_scheduling_duration_seconds` メトリクスを削除しました。ユーザーは `pod_scheduling_sli_duration_seconds` に移行する必要があります。([#128906](https://github.com/kubernetes/kubernetes/pull/128906), [@sanposhiho](https://github.com/sanposhiho)) [SIG Instrumentation and Scheduling]