Kubernetes 1.32: SIG-Apps の変更内容

## はじめに

このページではKubernetes v1.32 における SIG-Apps に関連する変更内容をまとめています。

- <https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md>

SIG-AppsはKubernetesのワークロードの扱いなどの変更を主に扱っているため、他のSIGと関係する変更が多くなっております。

- 直近での過去の変更内容は以下になります。
  - [Kubernetes 1.31: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/9f420f351ba99c2d5203)
  - [Kubernetes 1.30: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/b575a20cbbb6ebf1609f)
  - [Kubernetes 1.29: SIG-Apps の変更内容](https://qiita.com/yosshi_/items/d7cb8add71ba719e48b5)

<details><summary>SIG / SIG-Apps とは？</summary><div>

- SIGとは？
  - Special Interest Groups の略称
  - 各 SIG には Subproject が与えられていて、 Subproject に対して独立して開発できるようになっています。
  - Kubernetes は巨大なプロジェクトなので、各SIG 毎に担当(Subproject)が割り当てられていて、各SIG は独立して開発をしています。
  - SIG 間を跨って話し合いをする必要が生じた場合は Working Groups が一時的に作られ、その枠組みの中で話し合うことになります。

- SIG-Appsとは？
  - Apps Special Interest Group の略称
  - Kubernetes に対して、application を deploy したりすることに関することが対象。具体的には Pod, ReplicaSet, Deployments, DaemonSet, StatefulSet, Jobs, CronJob が対象。
![Kubernetes基礎_-_Google_Slides.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309176/78f42f49-da9f-c268-9034-e8d73556334a.png)
  - 詳細について知りたい方は[こちら](https://github.com/kubernetes/community/tree/master/sig-apps)をご参照ください。

</div></details>

SIG-Apps 以外の SIG に関する変更は以下にまとめてありますので、合わせてご参照下さい。


- [Kubernetes 1.32: 変更点まとめリンク集](https://qiita.com/uesyn/items/f3b67d2d3a7591e9e502)


## 注目の変更

Feature Gatesの中で今回Stageに変更のあった[Sig-Appsに関連する機能](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps)は以下になります。

- Pod
  - `PodIndexLabel`：`GA` https://github.com/kubernetes/enhancements/issues/4017
- StatefulSet
  - `StatefulSetAutoDeletePVC`：`GA` https://github.com/kubernetes/enhancements/issues/1847
- Job
  - `JobManagedBy`：`Beta` https://github.com/kubernetes/enhancements/issues/4368
- CronJob
  - `CronJobsScheduledAnnotation`：`GA` https://github.com/kubernetes/enhancements/issues/4026

1.32 では sig-apps に関する新機能はありませんでした。

## v1.32 Release Notes

v1.32 Release Notes の中で SIG-Apps に関するものについて以下に和訳したものを記載します。

> :pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

### :wastebasket: Deprecation(非推奨)

- ServiceAccount の metadata.annotations[kubernetes.io/enforce-mountable-secrets] が v1.32 から非推奨になります。削除に期限はありません。マウントされたシークレットへのアクセスを分離したい場合は namespace を分けることをお勧めします。 ([#128396](https://github.com/kubernetes/kubernetes/pull/128396), [@ritazh](https://github.com/ritazh))
  - :pencil: `kubernetes.io/enforce-mountable-secrets` について詳細を知りたい方は[こちら](https://qiita.com/ryysud/items/d89aefa567b0e35484bd)を参照ください。

### :earth_asia: API Changes（変更）

- pod resource をリサイズするために新しく /resize のサブリソースが追加されました。Pod のリサイズを実施する場合は k8s client で /resize サブリソースを使用するように更新してください。([#128266](https://github.com/kubernetes/kubernetes/pull/128266), [@AnishShah](https://github.com/AnishShah)) 
  - :pencil: InPlacePodVerticalScaling に関する変更になります。詳細は[こちらのKEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1287-in-place-update-pod-resources)を参照ください。
  - :pencil: [issue](https://github.com/kubernetes/enhancements/issues/1287) を見る限り、現時点の計画では v1.33 でのベータを目指しているようです。
  - :pencil: 個人的には、Java のアプリケーションで起動直後だけ CPU の割り当てを一時的に増やしたいみたいなケースが一番需要が高いのではないかと思っています。

- `PodLogOptions` に `Stream` フィールドが追加されました。これによりクライアントがコンテナの特定の log stream (stdout or stderr) を要求できるようになります。
([#127360](https://github.com/kubernetes/kubernetes/pull/127360), [@knight42](https://github.com/knight42))
  - :pencil: `kubectl logs --stream=stderr -c container pod` のように stdout か stderr を指定して取得できるように機能が追加されていくようです。

- Pod でサーチするドメインに単一のドット `.` とアンダースコア `_` を許可するようにしました。([#127167](https://github.com/kubernetes/kubernetes/pull/127167), [@adrianmoisey](https://github.com/adrianmoisey))
  - :pencil:RelaxedDNSSearchValidation の機能は 1.32 でアルファになります。詳細については[こちらのKEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/4427-relaxed-dns-search-validation)を参照ください

- CronJob でスケジュールされた Job に `batch.kubernetes.io/cronjob-scheduled-timestamp` のアノテーションが追加される機能が stable になりました。 ([#128336](https://github.com/kubernetes/kubernetes/pull/128336), [@soltysh](https://github.com/soltysh))

- Pod API に対して pod-level で `spec` の `resources` がサポートされるようになりました。 ([#128407](https://github.com/kubernetes/kubernetes/pull/128407), [@ndixita](https://github.com/ndixita)) 
  - :pencil: 今まではコンテナ単位で、resources ようになっていましたが、Pod レベルで設定できるような変更がアルファとして入りました。詳細については[こちらのKEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2837-pod-level-resource-spec)を参照ください。

- Job の `ManagedBy` フィールドが beta になりました。 ([#127402](https://github.com/kubernetes/kubernetes/pull/127402), [@mimowo](https://github.com/mimowo))

- Pod-level で `securityContext` を制御できる `seLinuxChangePolicy` フィールドが新しアルファとして追加されました。これは SELinuxChangePolicy feature gate に関する変更になります。これは SELinuxMount 機能が有効になっている場合に SELinux label 付きの Pod がボリュームをマウントするときに適応されれます。 (この機能はアルファであり、SELinuxMount はデフォルトでは無効化されています。).
SELinux の挙動の変更に関して利用者に警告する場合はこちらの[KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/1710-selinux-relabeling#story-3-cluster-upgrade) 参照してください。このフィールドは SELinux が有効化されているクラスタで、`seLinuxChangePolicy`フィールドを利用する場合にのみ影響があります。SELinux を使用していないクラスタでは対応の必要はありません。 ([#127981](https://github.com/kubernetes/kubernetes/pull/127981), [@jsafrane](https://github.com/jsafrane))

- `StatefulSetAutoDeletePVC` が stable になりました。 ([#128247](https://github.com/kubernetes/kubernetes/pull/128247), [@mattcary](https://github.com/mattcary))

- GA になっている `HPAContainerMetrics` feature gate を削除しました。([#126862](https://github.com/kubernetes/kubernetes/pull/126862), [@carlory](https://github.com/carlory)) 

- node-monitor-grace-period のデフォルト値が 50s に増加されました。 (以前は 40s です) (Ref - https://github.com/kubernetes/kubernetes/issues/121793) ([#126287](https://github.com/kubernetes/kubernetes/pull/126287), [@devppratik](https://github.com/devppratik))
  - :pencil: HTTP2_PING_TIMEOUT_SECONDS がデフォルト 30s で HTTP2_READ_IDLE_TIMEOUT_SECONDS がデフォルト 15s なので、その合計値である 45s 以上がデフォルト値になるように修正したようです。

- persistentVolumeClaimRetentionPolicy の誤った説明を修正しました。 ([#126545](https://github.com/kubernetes/kubernetes/pull/126545), [@yangjunmyfm192085](https://github.com/yangjunmyfm192085)) 


### :sparkle: Feature（機能追加）

- PreStop の sleep action に 0 の値が入れれるようになりました。 ([#127094](https://github.com/kubernetes/kubernetes/pull/127094), [@sreeram-venkitesh](https://github.com/sreeram-venkitesh)) 
  - :pencil: 0以外の負の値も入れられるようになっていて、負の値を入れると 0s として機能していたようです。0s にしたいときに負の値を入れるみたいなハックをせずに、シンプルに 0 を設定できるようになったようです。まだアルファなのでデフォルトでは有効化されていません。

- kube-controller-manager が `--concurrent-job-syncs` フラグを有効化して動作している場合に、孤立した Pod(orphan pod) の処理をサポートしました。 ([#126567](https://github.com/kubernetes/kubernetes/pull/126567), [@fusida](https://github.com/fusida)) [SIG Apps] [sig/apps]
  - :pencil: orphan pod の処理する worker を追加することで、finalizer `batch.kubernetes.io/job-tracking` を持つ pod が処理待ちになってスタックしにくくなるように改善した。

- ジョブ削除イベントを処理する際のジョブ コントローラーのパフォーマンスが向上しました。([#127378](https://github.com/kubernetes/kubernetes/pull/127378), [@hakuna-matatah](https://github.com/hakuna-matatah))
  - :pencil:これも orphan pod に関する改善

- ジョブ更新イベントを処理する際のジョブ コントローラーのパフォーマンスが向上しました。 ([#127228](https://github.com/kubernetes/kubernetes/pull/127228), [@hakuna-matatah](https://github.com/hakuna-matatah))
  - :pencil:これも orphan pod に関する改善

- StatefulSets の Pod に `apps.kubernetes.io/pod-index` ラベルを追加する機能が stable になりました。 `batch.kubernetes.io/job-completion-index` added to Pods from Indexed Jobs is promoted to stable ([#128387](https://github.com/kubernetes/kubernetes/pull/128387), [@alaypatel07](https://github.com/alaypatel07)) 


- `ScalingReplicaSet` イベントの出力形式が以下のように変更になりました。([#125118](https://github.com/kubernetes/kubernetes/pull/125118), [@jsoref](https://github.com/jsoref)) 

    ```
    変更前: Scaled <up|down> replica set <replica-set-name> to <new-value> from <old-value>
    変更後: Scaled <up|down> replica set <replica-set-name> from <old-value> to <new-value>
    ```


- InPlacePodVerticalScaling の beta 昇格に備えて、version skew に関する Pod validation を用意しました。 ([#128186](https://github.com/kubernetes/kubernetes/pull/128186), [@sreeram-venkitesh](https://github.com/sreeram-venkitesh)) 

- The Job controller が pod 削除するときに sidecar コンテナのリスタート回数も考慮するようになりました。 ([#124952](https://github.com/kubernetes/kubernetes/pull/124952), [@AxeZhan](https://github.com/AxeZhan))
  - :pencil: `compareMaxContainerRestarts()` とういう各所で使われている関数があって、この中で Pod のリスタート回数だけではなく、Sidecar コンテナのリスタート回数も含めて比較するようになったという変更になります。


### :bug: Bug or Regression(バグ修正)

- Dynamic Resource Allocation でノードセレクタのラベルが検証されるようになりました。無効なラベルは、以前にも実行時エラーの原因となっていましたが、実際にはほとんど発生しません。 ([#128932](https://github.com/kubernetes/kubernetes/pull/128932), [@pohly](https://github.com/pohly))

- 古い pod spec で image volume source が使用されている場合は、ImageVolume feature-gate が無効になっていても、リソースを更新するときに許可する必要があります。 ([#126733](https://github.com/kubernetes/kubernetes/pull/126733), [@carlory](https://github.com/carlory)) 

- lazy live pod list を使用して名前空間ごとにPVCをバッチ処理することにより、 PVC Protection Controller のスケーラビリティが向上しました。([#125372](https://github.com/kubernetes/kubernetes/pull/125372), ([#126745](https://github.com/kubernetes/kubernetes/pull/126745) [@hungnguyen243](https://github.com/hungnguyen243))
  - :pencil: バグ修正のカテゴリに記載されていますが、性能改善に関する話になります。

-  pod status の qosClass フィールドの validation を強化します。このフィールドは変更できませんが、status　サブソースを介してこのフィールドを更新するときに新しいステータスで設定が解除されている場合は、kube-apiserverによって古いステータスが設定されます。([#127744](https://github.com/kubernetes/kubernetes/pull/127744), [@carlory](https://github.com/carlory)) 
  - :pencil: 変更するときは REST API か `kubectl edit pod --subresource='status'` を使うようにとのことです。

### :microscope: Other (その他の修正)

- `InPlacePodVerticalScaling` 機能の Windows のサポートは廃止になりました。 ([#128623](https://github.com/kubernetes/kubernetes/pull/128623), [@AnishShah](https://github.com/AnishShah))
- `AllowServiceLBStatusOnNonLB` 機能は非推奨のままであり、互換性バージョンのサポートのために false のままロックされます。 ([#128139](https://github.com/kubernetes/kubernetes/pull/128139), [@Jefftree](https://github.com/Jefftree)) 

- "AllowServiceLBStatusOnNonLB" Feature gate 削除されました。この機能は安定しており、一年以上更新されていません。 ([#126786](https://github.com/kubernetes/kubernetes/pull/126786), [@thockin](https://github.com/thockin)) 
  - :pencil: `AllowServiceLBStatusOnNonLB` は結局どうなっているかというと、廃止予定になっていますがコードをいきなり消すと他に影響がある可能性があるので、3バージョンの間 false で固定してそのあとで削除するという対応になりました。

- GA になっている `NodeOutOfServiceVolumeDetach` feature gate が削除されました。([#127019](https://github.com/kubernetes/kubernetes/pull/127019), [@carlory](https://github.com/carlory))

- pod の resize 中の requests/limits の削除のサポートがなくなりました。([#128683](https://github.com/kubernetes/kubernetes/pull/128683), [@AnishShah](https://github.com/AnishShah)) 
  - :pencil: InPlacePodVerticalScaling に関する修正になります。

- "PodHostIPs" の feature-gate が削除されました。 この機能は GA となり Kubernetes v1.30 からずっと値がロックされていました。 ([#128634](https://github.com/kubernetes/kubernetes/pull/128634), [@thockin](https://github.com/thockin)) 

## 所感

Sig Apps については今回は新機能はなく、InPlacePodVerticalScaling を GA にするためにいくつか PR が出ていましたが、それくらいなのでだいぶ落ち着いたリリースになりました。
最近の動向としては以下の KEP が進行中のようで 1.32 でアルファリリースを目指していたようですが、まだ KEP のマージも終わってないので新しい機能の導入にはもう少しかかりそうです。

- [KEP-3973: Consider deployment completion in DeploymentPodReplacementPolicy](https://github.com/kubernetes/enhancements/pull/4976)
- [KEP-4212: Declarative Node Maintenance](https://github.com/kubernetes/enhancements/pull/4213)
- [KEP-4563: Evacuation API](https://github.com/kubernetes/enhancements/pull/4565)