Kubernetes 1.25: 変更点まとめ(What's new!)とアップグレード時の注意事項

# はじめに

このエントリは、Kubernetes 1.25 の [CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md) からWhat's new!とアップグレード時の注意事項、各変更点についてまとめたページへのリンクです。
詳細については各まとめページを参照してください。

# 変更点の詳細へのリンク

- [Metrics Changes と SIG Instrumentation](https://qiita.com/watawuwu/items/d4632f750437081265cb) @watawuwu 
- [SIG Apps](https://qiita.com/yosshi_/items/9689032b75fd70ecc881) @yosshi_ 
- [SIG API Machinery](https://qiita.com/Ladicle/items/52ab4ecee5c8b1672fb5) @Ladicle
- [SIG Auth](https://qiita.com/hiyosi/items/104a113fbf1772ebf1e1) @hiyosi 
- [SIG CLI](https://qiita.com/superbrothers/items/cb8a0644dad95ebcc6f7) @superbrothers
- [SIG Cluster Lifecycle](https://qiita.com/yuanying/items/ab3af2177353b5d44c6a) @yuanying 
- [SIG Storage](https://qiita.com/ysakashita/items/e033b59b77faafd302d7) @ysakashita 
- [SIG Network](https://qiita.com/tkusumi/items/a41ed4ffd67dd7b3ed23) @tkusumi
- [SIG Scheduling](https://qiita.com/everpeace/items/b2bb8a0b02a8b30c9299) @everpeace 
- [SIG Node](https://qiita.com/y1r96/items/b75750f06b08398c753f) @y1r96

## What's New (Major Themes)

### PodSecurityPolicy is Removed, Pod Security Admission graduates to Stable

<!--
### PodSecurityPolicy is Removed, Pod Security Admission graduates to Stable

PodSecurityPolicy was initially [deprecated in v1.21](/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/), and with the release of v1.25, it has been removed. The updates required to improve its usability would have introduced breaking changes, so it became necessary to remove it in favor of a more friendly replacement. That replacement is [Pod Security Admission](/docs/concepts/security/pod-security-admission/), which graduates to Stable with this release. If you are currently relying on PodSecurityPolicy, please follow the instructions for [migration to Pod Security Admission](/docs/tasks/configure-pod-container/migrate-from-psp/).
-->

PodSecurityPolicyは[v1.21で非推奨](https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/)とされ、v1.25で削除されました。その更新は使い勝手を良くするために必要な更新は破壊的変更をもたらし、それはより使いやすい代替機能でそれを置き換えるために必要です。その置き換えはPod Security Admissionで、このリリースでStableへ昇格しました。もしPodSecurityPolicyへ依存している場合は、[PodSecurity Admissionへ移行するための導入](https://kubernetes.io/docs/tasks/configure-pod-container/migrate-from-psp/)をご参照ください。
- :pencil: ついにPSPが削除されました。後継のPodSecurity Admissionは[PodSecurityPolicyの廃止に備えて、一足先にPodSecurity Admissionを試してみよう! - Qiita](https://qiita.com/uesyn/items/cf47e12fba5e5c5ea25f)でも紹介しているので合わせてご参照ください。

### Ephemeral Containers Graduate to Stable

<!--
[Ephemeral Containers](/docs/concepts/workloads/pods/ephemeral-containers/) are containers that exist for only a limited time within an existing pod. This is particularly useful for troubleshooting when you need to examine another container but cannot use `kubectl exec` because that container has crashed or its image lacks debugging utilities. Ephemeral containers graduated to Beta in Kubernetes v1.23, and with this release, the feature graduates to Stable.
-->

[Ephemeral Container](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/)は既存のPodの中で限られた時間の間存在するコンテナです。これは特に他のコンテナを調査したいが、そのコンテナがクラッシュしていたり、イメージにデバッグユーティリティがないことで、`kubectl exec`を使用できない場合のトラブルシューティングに便利です。エフェメラルコンテナはKubernetes v1.23でBetaに昇格し、今回のリリースでStableに昇格しました。

### Support for cgroups v2 Graduates to Stable

<!--
It has been more than two years since the Linux kernel cgroups v2 API was declared stable. With some distributions now defaulting to this API, Kubernetes must support it to continue operating on those distributions. cgroups v2 offers several improvements over cgroups v1, for more information see the [cgroups v2](https://kubernetes.io/docs/concepts/architecture/cgroups/) documentation. While cgroups v1 will continue to be supported, this enhancement puts Kubernetes to be ready for eventual deprecation and replacement in favor of v2.
-->

Linuxカーネルのcgroup v2 APIが安定したと宣言されてから、2年以上が経過しました。このAPIはいくつかのディストリビューションで現在デフォルトであり、Kubernetesはそれらのディストリビューションで動作し続けるために、このAPIをサポートする必要があります。cgroups v2はcgroup v1に対していくつかの改善を提供しています。詳細については[cgroups v2](https://kubernetes.io/docs/concepts/architecture/cgroups/)のドキュメントをご参照ください。cgroup v1はサポートされ続けますが、このエンハンスメントはKubrnetesはやがてくる非推奨とv2への置き換えに備えることができます。

### Windows support improved

<!--
- [Performance dashboards](http://perf-dash.k8s.io/#/?jobname=soak-tests-capz-windows-2019) added support for Windows
- [Unit tests](https://github.com/kubernetes/kubernetes/issues/51540) added support for Windows
- [Conformance tests](https://github.com/kubernetes/kubernetes/pull/108592) added support for Windows
- New repository created for [Windows Operational Readiness](https://github.com/kubernetes-sigs/windows-operational-readiness)
-->

- [Performance dashboards](http://perf-dash.k8s.io/#/?jobname=soak-tests-capz-windows-2019)がWindowsのために追加されました。
- [Unit tests](https://github.com/kubernetes/kubernetes/issues/51540)はWindowsのためのサポートが追加されました。
- [Conformance tests](https://github.com/kubernetes/kubernetes/pull/108592)はWindowsのためのサポートが追加されました。
- [Windows Operational Readiness](https://github.com/kubernetes-sigs/windows-operational-readiness)のための新しいリポジトリが追加されました。

### Moved container registry service from k8s.gcr.io to registry.k8s.io

<!--
[Moving container registry from k8s.gcr.io to registry.k8s.io](https://github.com/kubernetes/kubernetes/pull/109938) got merged. For more details, see the [wiki page](https://github.com/kubernetes/k8s.io/wiki/New-Registry-url-for-Kubernetes-\(registry.k8s.io\)), [announcement](https://groups.google.com/a/kubernetes.io/g/dev/c/DYZYNQ_A6_c/m/oD9_Q8Q9AAAJ) was sent to the kubernetes development mailing list.
-->

[k8s.gcr.ioからregistry.k8s.ioへのコンテナレジストリの移行](https://github.com/kubernetes/kubernetes/pull/109938)がマージされました。詳細は[wiki page](https://github.com/kubernetes/k8s.io/wiki/New-Registry-url-for-Kubernetes-\(registry.k8s.io\))とkubernetes development mailing listへ送信された[アナウンス](https://groups.google.com/a/kubernetes.io/g/dev/c/DYZYNQ_A6_c/m/oD9_Q8Q9AAAJ)をご参照ください。

### Promoted SeccompDefault to Beta

<!--
SeccompDefault promoted to beta, see the tutorial [Restrict a Container's Syscalls with seccomp](https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads) for more details.
-->

SeccompDefaultはbetaへ昇格しました。詳細は[Restrict a Container's Syscalls with seccomp](https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads)をご参照ください。 

- :pencil: SeccompDefaultに関しては[KubernetesのSeccompDefaultを試した - Qiita](https://qiita.com/uesyn/items/3fc1b25eafa0939aebb8)でも調査記事を公開しているのでこちらもご参照いただければ幸いです。


### Promoted endPort in Network Policy to Stable

<!--
Promoted `endPort` in [Network Policy](https://kubernetes.io/docs/concepts/services-networking/network-policies/#targeting-a-range-of-ports) to GA. Network Policy providers that support `endPort` field now can use it to specify a range of ports to apply a Network Policy. Previously, each Network Policy could only target a single port.

Please be aware that `endPort` field **MUST BE SUPPORTED** by the Network Policy provider. If your provider does not support `endPort`, and this field is specified in a Network Policy, the Network Policy will be created covering only the port field (single port).
-->

[Network Policy](https://kubernetes.io/docs/concepts/services-networking/network-policies/#targeting-a-range-of-ports)の`endPort`はGAへ昇格しました。`endPort`フィールドをサポートしているNetwork PolicyプロバイダーはNetwork Policyを適用するためにポートの範囲を指定するためにそれを利用できます。以前は、それぞれのNetwork Policyは単一のPortのみをターゲットすることができました。

`endPort`フィールドはNetwork Policy providerによって必ずサポートされなければならないフィールドであることにご注意ください。もしあなたのプロバイダーが`endPort`をサポーしておらずこのフィールドはNetwork Policyで指定している場合、Network Policyはportフィールドのみをカバーするように作られます(単一のポート)。

### Promoted Local Ephemeral Storage Capacity Isolation to Stable

<!--
The [Local Ephemeral Storage Capacity Isolation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/361-local-ephemeral-storage-isolation) feature moved to GA. This was introduced as alpha in 1.8, moved to beta in 1.10, and it is now a stable feature. It provides support for capacity isolation of local ephemeral storage between pods, such as `EmptyDir`,  so that a pod can be hard limited in its consumption of shared resources by evicting Pods if its consumption of local ephemeral storage exceeds that limit.so that a pod can be hard limited in its consumption of shared resources by evicting Pods if its consumption of local ephemeral storage exceeds that limit.
-->

[Local Ephemeral Storage Capacity Isolation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/361-local-ephemeral-storage-isolation)機能がGAへとなりました。これは、1.8でalphaとして導入され、1.10でbetaとなり、そして現在stable機能となりました。それは`EmptyDir`のようなPod間のローカルエフェメラルストレージの分離をサポートを提供し、ローカルエフェメラルストレージの消費量がその上限を超えるとPodを退避させることでPodが共有リソースの消費を厳しく制限できるようにします。

- :pencil: この記事のGAに関するブログは[こちら](https://kubernetes.io/blog/2022/09/19/local-storage-capacity-isolation-ga/)

### Promoted core CSI Migration to Stable

<!--
[CSI Migration](https://kubernetes.io/blog/2021/12/10/storage-in-tree-to-csi-migration-status-update/#quick-recap-what-is-csi-migration-and-why-migrate) is an ongoing effort that SIG Storage has been working on for a few releases. The goal is to move in-tree volume plugins to out-of-tree CSI drivers and eventually remove the in-tree volume plugins. The [core CSI Migration](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/625-csi-migration) feature moved to GA. CSI Migration for GCE PD and AWS EBS also moved to GA. CSI Migration for vSphere remains in beta (but is on by default). CSI Migration for Portworx moved to Beta (but is off-by-default).
-->

[CSI Migration](https://kubernetes.io/blog/2021/12/10/storage-in-tree-to-csi-migration-status-update/#quick-recap-what-is-csi-migration-and-why-migrate)はSIG Storageがいくつかのリリースで実施してきている進行中の取り組みです。[core CSI Migration](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/625-csi-migration)機能はGAとなりました。GCE PDとAWS EBSのためのCSI MigrationはGAとなりました。vSphereのためのCSI Migrationはbetaのままです(しかしデフォルトでオンです)。PortworxのためのCSI MigrationはBetaへ移行しました(しかしデフォルトでオフです)。 

### Promoted CSI Ephemeral Volume to Stable

<!--
The [CSI Ephemeral Volume](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/596-csi-inline-volumes) feature allows CSI volumes to be specified directly in the pod specification for ephemeral use cases. They can be used to inject arbitrary states, such as configuration, secrets, identity, variables or similar information, directly inside pods using a mounted volume. This was initially introduced in 1.15 as an alpha feature, and it moved to GA. This feature is used by some CSI drivers such as the [secret-store CSI driver](https://github.com/kubernetes-sigs/secrets-store-csi-driver).
-->
[CSI Ephemeral Volume](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/596-csi-inline-volumes)機能はCSI volumeがPodのスペックで一次的な利用のために直接指定されることを許容する機能です。これらはPodへマウントされるボリュームへ直接、設定、シークレット、アイデンティティー、変数または同様の情報など、任意の状態をポッド内部に注入するために使用することができます。これは当初1.15でアルファ版機能として導入され、GAに移行しました。この機能はsecret-store CSIドライバのようないくつかのCSIドライバで使用されています。

### Promoted CRD Validation Expression Language to Beta

<!--
[CRD Validation Expression Language](https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2876-crd-validation-expression-language/README.mdv) is promoted to beta, which makes it possible to declare how custom resources are validated using the [Common Expression Language (CEL)](https://github.com/google/cel-spec). Please see the [validation rules](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation-rules) guide.
-->

[CRD Validation Expression Language](https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2876-crd-validation-expression-language/README.mdv)はbetaへ移行しました。それはどのようにカスタムリソースが検証されるかを[Common Expression Language (CEL)](https://github.com/google/cel-spec)で定義するための機能です。詳細は[validation rules](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation-rules)ガイドを見てください。


### Promoted Server Side Unknown Field Validation to Beta

<!--
Promoted the `ServerSideFieldValidation` feature gate to beta (on by default). This allows optionally triggering schema validation on the API server that errors when unknown fields are detected. This allows the removal of client-side validation from kubectl while maintaining the same core functionality of erroring out on requests that contain unknown or invalid fields.
-->

`ServerSideFieldValidation` feature gateはbetaへ昇格しました(デフォルトでオン)。これにより、未知のフィールド検知されたとき、エラーとなるAPIサーバー上のスキーマ検証をオプションでトリガーすることができます。これは未知のフィールドや無効なフィールドを含むリクエストをエラーにするという同様のコア機能を維持しながら、kubectlからクライアントサイドの検証を取り除くことができます。

###  Introduced KMS v2

<!--
Introduce KMS v2alpha1 API to add performance, rotation, and observability improvements. Encrypt data at rest (ie Kubernetes `Secrets`) with DEK using AES-GCM instead of AES-CBC for kms data encryption. No user action is required. Reads with AES-GCM and AES-CBC will continue to be allowed. See the guide [Using a KMS provider for data encryption](https://kubernetes.io/docs/tasks/administer-cluster/kms-provider/) for more information.
-->

パフォーマンスやローテーション、可観測性の改善を追加するためにKMS v2alpha1APIが導入されました。kmsのデータの暗号化のためにAES-CBCの代わりにAES-GCMを利用したDEKを用いてKubernetesのSecretなどのデータを暗号化します。AES-GCMとAES-CBCによる読み込み引き続き可能です。詳細は[Using a KMS provider for data encryption](https://kubernetes.io/docs/tasks/administer-cluster/kms-provider/)をご参照ください。 


### Kube-proxy images are now based on distroless images

<!--
In previous releases, kube-proxy container images were built using Debian as the base image. Starting with this release, the images are now built using [distroless](https://github.com/GoogleContainerTools/distroless). This change reduced image size by almost 50% and decreased the number of installed packages and files to only those strictly required for kube-proxy to do its job.
-->

以前のリリースでkube-proxyのコンテナイメージはベースイメージとしてDebianを利用してビルドされていました。このリリースから、イメージは[distroless](https://github.com/GoogleContainerTools/distroless)を利用してビルドされるようになりました。この変更はイメージサイズを約50%減らし、インストールされるパッケージとファイルの数は、kube-proxyが仕事をするために厳密に必要なものだけになりました。

## Known Issues

### LocalStorageCapacityIsolationFSQuotaMonitoring ConfigMap rendering failure

<!--
ConfigMap rendering [issue](https://github.com/kubernetes/kubernetes/issues/112081) was found in the 1.25.0 release. When ConfigMaps get updated within the API, they do not get rendered to the resulting pod's filesystem by the Kubelet. The feature has been [reverted to alpha](https://github.com/kubernetes/kubernetes/pull/112078) in the 1.25.1 release.
-->

[ConfigMapのレンダリングの問題](https://github.com/kubernetes/kubernetes/issues/112081)がv1.25.0のリリースで見つかりました。ConfigMapがAPIでアップデートされたとき、kubeletによってPodのファイルシステムへ結果がレンダーされません。この機能は1.25.1のリリースで[alphaへrevert](https://github.com/kubernetes/kubernetes/pull/112078)されます。

## Urgent Upgrade Notes

### (No, really, you MUST read this before you upgrade)

<!--
- Deprecated beta APIs scheduled for removal in 1.25 are no longer served. See https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-25 for more information. ([#108797](https://github.com/kubernetes/kubernetes/pull/108797), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Instrumentation and Testing]
- Encrypted data with DEK using AES-GCM instead of AES-CBC for kms data encryption. No user action required. Reads with AES-GCM and AES-CBC will continue to be allowed. ([#111119](https://github.com/kubernetes/kubernetes/pull/111119), [@aramase](https://github.com/aramase))
- End-to-end testing has been migrated from Ginkgo v1 to v2.

 When running test/e2e via the Ginkgo CLI, the v2 CLI must be used and `-timeout=24h` (or some other, suitable value) must be passed because the default timeout was reduced from 24h to 1h. When running it via `go test`, the corresponding `-args` parameter is `-ginkgo.timeout=24h`. To build the CLI in the Kubernetes repo, use `make all WHAT=github.com/onsi/ginkgo/v2/ginkgo`.
 Ginkgo V2 doesn't accept go test's `-parallel` flags to parallelize Ginkgo specs, please switch to use `ginkgo -p` or `ginkgo -procs=N` instead. ([#109111](https://github.com/kubernetes/kubernetes/pull/109111), [@chendave](https://github.com/chendave)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scheduling, Storage, Testing and Windows]

- No action required; No API/CLI changed; Add new Windows Image Support ([#110333](https://github.com/kubernetes/kubernetes/pull/110333), [@liurupeng](https://github.com/liurupeng)) [SIG Cloud Provider and Windows]
- The intree volume plugin flocker support was completely removed from Kubernetes. ([#111618](https://github.com/kubernetes/kubernetes/pull/111618), [@Jiawei0227](https://github.com/Jiawei0227))
- The intree volume plugin quobyte support has been completely removed from Kubernetes. ([#111619](https://github.com/kubernetes/kubernetes/pull/111619), [@Jiawei0227](https://github.com/Jiawei0227))
- The intree volume plugin storageos support has been completely removed from Kubernetes. ([#111620](https://github.com/kubernetes/kubernetes/pull/111620), [@Jiawei0227](https://github.com/Jiawei0227))
- There is a new OCI image registry (`registry.k8s.io`) that can be used to pull Kubernetes images. The old registry (`k8s.gcr.io`) will continue to be supported for the foreseeable future, but the new name should perform better because it frontends equivalent mirrors in other clouds.  Please point your clusters to the new registry going forward. \n\nAdmission/Policy integrations that have an allowlist of registries need to include `registry.k8s.io` alongside `k8s.gcr.io`.\nAir-gapped environments and image garbage-collection configurations will need to update to pre-pull and preserve required images under `registry.k8s.io` as well as `k8s.gcr.io`. ([#109938](https://github.com/kubernetes/kubernetes/pull/109938), [@dims](https://github.com/dims))
-->

- 1.25で削除予定だった非推奨のbeta APIがサーブされなくなりました。詳細は https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-25 をご参照ください。
  - :pencil: CronJobのbatch/v1beta1やautoscaling/v2beta1やpolicy/v1beta1などが利用できなくなるため注意が必要です。
- kmsのデータ暗号化のためにAES-CBCの代わりにAES-GCMを用いてDEKでデータが暗号化されます。ユーザのアクションは必要ありません。AES-GCMとAES-CBCを用いての読み込みは非木津付き利用可能です。
- End-to-endのテストはGinkgo v1からv2へ移行されました。


test/e2eをGinkgo CLIで動作させるとき、v2 CLIはかならず利用される必要があり、また `-timeout=24h`(もしくはその他の適切な値)が渡されなければなりません。なぜならデフォルトのタイムアウトが24時間から1時間へ減らされたためです。 `go test`経由で実行する時、対応する`-args`パラメータは`-ginkgo.timeout=24h`となります。KubernetesのリポジトリでCLIをビルドするためには`make all WHAT=github.com/onsi/ginkgo/v2/ginkgo`を利用してください。Ginkgo V2はgo testの`-parallel`フラグをGinkgo specの並列化のために受け付けませんので、代わりに`ginkgo -p`や`ginkgo -procs=N`へ切り替えてください。([#109111](https://github.com/kubernetes/kubernetes/pull/109111), [@chendave](https://github.com/chendave)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scheduling, Storage, Testing and Windows]


- アクションは不要です; API/CLIの変更はありません；新しいWindows Imageのサポートが追加されました ([#110333](https://github.com/kubernetes/kubernetes/pull/110333), [@liurupeng](https://github.com/liurupeng)) [SIG Cloud Provider and Windows]
- intreeのflockerのvolume pluginのサポートはKubernetesから完全に削除されました。([#111618](https://github.com/kubernetes/kubernetes/pull/111618), [@Jiawei0227](https://github.com/Jiawei0227))
- intreeのquobyteのvolume pluginのサポートはKubernetesから完全に削除されました。([#111619](https://github.com/kubernetes/kubernetes/pull/111619), [@Jiawei0227](https://github.com/Jiawei0227))
- intreeのstorageosのvolume pluginのサポートはKubernetesから完全に削除されました。([#111620](https://github.com/kubernetes/kubernetes/pull/111620), [@Jiawei0227](https://github.com/Jiawei0227))
- Kubernetesのイメージをpullするために利用可能な新しいOCIイメージレジストリ(`registry.k8s.io`)があります。古いレジストリ(`k8s.gcr.io`)は引き続きしばらくの間サポートされますが、他のクラウドにある同等のミラーのフロントエンドであるため、新しい名前はより良いパフォーマンスを発揮するはずです。あなたのクラスタを新しいレジストリへ向くようにしてください。レジストリの許可リストをもつAdmission/Policyを統合している場合は、`k8s.gcr.io`と一緒に`registyr.k8s.io`を含む必要があります。air-gap環境でイメージのgarbage-collectionの設定は`registry.k8s.io`と`k8s.gcr.io`で必要なイメージをpre-pull して保存するように更新する必要があります。([#109938](https://github.com/kubernetes/kubernetes/pull/109938), [@dims](https://github.com/dims))