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

# はじめに

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

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

- [Metrics Changes と SIG Instrumentation](https://qiita.com/watawuwu/items/9259782239976825d287) @watawuwu 
- [SIG Apps](https://qiita.com/yosshi_/items/35bce758b17e644a2f50) @yosshi_ 
- [SIG API Machinery](https://qiita.com/Ladicle/items/fadac729a8e1b6678070) @Ladicle
- [SIG Auth](https://qiita.com/hiyosi/items/11dbfc33811fe4aa2d50) @hiyosi 
- [SIG CLI](https://qiita.com/superbrothers/items/ce7e292e2d399ec0c9db) @superbrothers
- [SIG Cluster Lifecycle](https://qiita.com/yuanying/items/640705f03f625e95390e) @yuanying 
- [SIG Storage](https://qiita.com/ysakashita/items/bf33cca73878a54950cf) @ysakashita 
- [SIG Network](https://qiita.com/tkusumi/items/bc3b6c8073c5b3785741) @tkusumi
- [SIG Scheduling](https://qiita.com/everpeace/items/8ffce0195f7d8371c54f) @everpeace
- [SIG Node](https://qiita.com/y1r96/items/a217070aca59be39f161) @y1r96

## What's New (Major Themes)

### Change in container image registry 

<!--
In the previous release, Kubernetes changed the container registry, allowing the spread of the load across multiple Cloud Providers and Regions, a change that reduced the reliance on a single entity and provided a faster download experience for a large number of users.

This release of Kubernetes is the first that is exclusively published in the new registry.k8s.io container image registry. In the (now legacy) k8s.gcr.io image registry, no container images tags for v1.26 will be published, and only tags from releases before v1.26 will continue to be updated. Refer to registry.k8s.io: faster, cheaper and Generally Available for more information on the motivation, advantages, and implications of this significant change.
-->

前のリリースでは、[Kubernetesはコンテナレジストリを変更し](https://github.com/kubernetes/kubernetes/pull/109938)、複数のクラウドプロバイダやリージョンに負荷分散できるようになり、この変更により単一のエンティティへの依存を減らし、多くのユーザにとってより高速なダウンロード体験が提供されるようになりました。

このKubernetesのリリースは新しい registry.k8s.io コンテナイメージレジストリでのみ配布される最初のリリースです。(今となってはlegacyの) k8s.gcr.io イメージレジストリでは、v1.26のためのタグを持つコンテナイメージは配布されず、v1.26より前のタグのみアップデートされ続けます。この重要な変更の動機、利点、および意味については[registry.k8s.io: faster, cheaper and Generally Available](https://kubernetes.io/blog/2022/11/28/registry-k8s-io-faster-cheaper-ga/)をご参照ください。

### CRI v1alpha2 removed 

<!--
With the adoption of the Container Runtime Interface (CRI) and the removal of dockershim in v1.24, the CRI is the only supported and documented way through which Kubernetes interacts with different container runtimes. Each kubelet negotiates which version of CRI to use with the container runtime on that node.

In the previous release, the Kubernetes project recommended using CRI version v1, but kubelet could still negotiate the use of CRI v1alpha2, which was deprecated.

Kubernetes v1.26 drops support for CRI v1alpha2. That removal will result in the kubelet not registering the node if the container runtime doesn't support CRI v1. This means that containerd minor version 1.5 and older are not supported in Kubernetes 1.26; if you use containerd, you will need to upgrade to containerd version 1.6.0 or later before you upgrade that node to Kubernetes v1.26. This applies equally to any other container runtimes that only support the v1alpha2: if that affects you, you should contact the container runtime vendor for advice or check their website for additional instructions in how to move forward.
-->

[Container Runtime Interface(CRI)](https://kubernetes.io/docs/concepts/architecture/cri/)とv1.24の[dockershimの削除](https://kubernetes.io/blog/2022/02/17/dockershim-faq/)により、CRIは異なるコンテナランタイムと対話するための唯一のサポートされ文書化された方法となっています。各kubeletはそのノード上のcontainer runtimeとどのCRIバージョンを利用するかネゴシエートします。

以前のリリースでは、KubernetesプロジェクトはCRI versionであるv1を利用する様に推奨していましたが、kubeletはv1alpha2の利用のネゴシエートを続けており、それは非推奨とされていました。

Kubernetes v1.26ではCRI v1alpha2のためのサポートしなくなりました。その[削除](https://github.com/kubernetes/kubernetes/pull/110618)によりkubeletがcontainer runtimeがCRI v1をサポートしない場合、ノードを登録しなくなります。これはcontainerdのマイナーバージョン1.5以前はKubetrnetes v1.26ではサポートしていないということです。もしcontainerdを利用する場合、ノードをKubernetes v1.26へアップグレードする前にcontainerdのバージョンを1.6.0以降へアップグレードする必要があります。これはv1alpha2のみをサポートする他のコンテナランタイムも同様に適用されます。もし影響がある場合、コンテナランタイムのベンダーに連絡してアドバイスをもらうか、そのウェブサイトで今後の進め方について追加で確認する必要があります。

### Storage improvements 

<!--
Following the GA of the core Container Storage Interface (CSI) Migration feature in the previous release, CSI migration is an on-going effort that we've been working on for a few releases now, and this release continues to add (and remove) features aligned with the migration's goals, as well as other improvements to Kubernetes storage.
-->

以前のリリースで[コアのContainer Storage Interface (CSI) Migration](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/625-csi-migration)機能のGAに続き、CSI migrationは数リリース前から取り組んでいる継続的な取り組みで、今回のリリースでもマイグレーションの目標に沿った機能の追加(および削除)、およびKubernetesストレージのその他の改良が行われています。

### CSI migration for Azure File and vSphere graduated to stable 

<!--
Both the vSphere and Azure in-tree driver migration to CSI have graduated to Stable. You can find more information about them in the vSphere CSI driver and Azure File CSI driver repositories.
-->

[vSphere](https://github.com/kubernetes/enhancements/issues/1491)と[Azure](https://github.com/kubernetes/enhancements/issues/1885)のin-tree driverのCSI migrationはStableへ昇格しました。より詳細な情報が知りたい場合は[vSphere CSI driver](https://github.com/kubernetes-sigs/vsphere-csi-driver)と[Azure File CSI driver](https://github.com/kubernetes-sigs/azurefile-csi-driver)リポジトリをご参照ください。

### Delegate FSGroup to CSI Driver graduated to stable 

<!--
This feature allows Kubernetes to supply the pod's fsGroup to the CSI driver when a volume is mounted so that the driver can utilize mount options to control volume permissions. Previously, the kubelet would always apply the fsGroupownership and permission change to files in the volume according to the policy specified in the Pod's .spec.securityContext.fsGroupChangePolicy field. Starting with this release, CSI drivers have the option to apply the fsGroup settings during attach or mount time of the volumes.
-->

この機能により、Kubernetesは[ボリュームのマウント時にPodのfsGroupをCSIドライバーに供給し](https://github.com/kubernetes/enhancements/issues/2317)、ドライバーはマウントオプションを利用してボリュームのパーミッションを制御できるようになります。以前は、Kubeletは常にPodの`.spec.securityContext.fsGroupChangePolicy`フィールドで指定されたポリシーに従ってボリューム内のファイルへのfsGroupownershipとパーミッション変更を適用していました。このリリースから、CSIドライバには、ボリュームのアタッチ時またはマウント時にfsGroup設定を適用するオプションが追加されました。

### In-tree GlusterFS driver removal 

<!--
Already deprecated in the v1.25 release, the in-tree GlusterFS driver was removed in this release.
-->
v1.25のリリースで既に非推奨となっていたin-treeのGlusterFSドライバーはこのリリースで削除されました。

### In-tree OpenStack Cinder driver removal 

<!--
This release removed the deprecated in-tree storage integration for OpenStack (the cinder volume type). You should migrate to external cloud provider and CSI driver from https://github.com/kubernetes/cloud-provider-openstack instead. For more information, visit Cinder in-tree to CSI driver migration.
-->

このリリースで非推奨となっていたOpenStack(cinder volume type)のためのin-treeのストレージ統合は削除されました。代わりに https://github.com/kubernetes/cloud-provider-openstack のexternal cloud provider及びCSI dirverへ移行すべきです。より詳細な情報は[Cinder in-tree to CSI driver migration](https://github.com/kubernetes/enhancements/issues/1489)をご参照ください。

### Signing Kubernetes release artifacts graduates to beta 

<!--
Introduced in Kubernetes v1.24, this feature constitutes a significant milestone in improving the security of the Kubernetes release process. All release artifacts are signed keyless using cosign, and both binary artifacts and images can be verified.
-->

Kubernetes v1.24で導入された[この機能](https://github.com/kubernetes/enhancements/issues/3031)は、Kubernetesリリースのセキュリティを向上させる重要なマイルストーンを構成しています。すべてのリリースアーティファクトは[cosign](https://github.com/sigstore/cosign/)を使用してキーレスで署名され、バイナリアーティファクトとイメージの両方が[検証可能](https://kubernetes.io/docs/tasks/administer-cluster/verify-signed-artifacts/)です。

### Support for Windows privileged containers graduates to stable 

<!--
Privileged container support allows containers to run with similar access to the host as processes that run on the host directly. Support for this feature in Windows nodes, called HostProcess containers, will now graduate to Stable, enabling access to host resources (including network resources) from privileged containers.
-->

Privileged containerのサポートは直接ホスト上で動作するプロセスと同様にホストへアクセス権をもつコンテナを実行できます。Windowsノードでこの機能をサポートは、[HostProcess containers](https://kubernetes.io/docs/tasks/configure-pod-container/create-hostprocess-pod/)と呼ばれ、[今回Stable](https://github.com/kubernetes/enhancements/issues/1981)となり、privileged containerからネットワークリソースなどを含むホストのリソースへアクエスできる様になりました。

### Improvements to Kubernetes metrics 

<!--
This release has several noteworthy improvements on metrics.
-->

このリリースはいくつかの注目すべきメトリクスの改善が含まれます。


### Metrics framework extension graduates to alpha 

<!--
The metrics framework extension graduates to Alpha, and documentation is now published for every metric in the Kubernetes codebase.This enhancement adds two additional metadata fields to Kubernetes metrics: Internal and Beta, representing different stages of metric maturity.
-->

metrics framework extensionは[alphaとなり](https://github.com/kubernetes/enhancements/issues/3498)、[Kubernetesコードベースの全てのメトリクスについてドキュメントが公開されました](https://kubernetes.io/docs/reference/instrumentation/metrics/)。今回のエンハンスメントでは二つのメタデータフィールドをKubernetesのメトリクスへ追加しました: InternalとBetaの2つのメタデータフィールドが追加され、メトリクスの成熟度の異なる段階を表しています。

### Component Health Service Level Indicators graduates to alpha 

<!--
Also improving on the ability to consume Kubernetes metrics, component health Service Level Indicators (SLIs) have graduated to Alpha: by enabling the ComponentSLIs feature flag there will be an additional metrics endpoint which allows the calculation of Service Level Objectives (SLOs) from raw healthcheck data converted into metric format.
-->

Kubernetesのメトリクスを消費する機能を改善し、[コンポーネントヘルスのService Level Indicator(SLI)](https://kubernetes.io/docs/reference/instrumentation/slis/)が[Alphaになりました](https://github.com/kubernetes/kubernetes/pull/112884)。ComponentSLIs feature フラグを有効にすると、メトリクス形式に変換された生のヘルスチェック・データからサービスレベル目標（SLO）を計算できる追加のメトリックエンドポイントが追加されます。

### Feature metrics are now available

<!--
Feature metrics are now available for each Kubernetes component, making it possible to track whether each active feature gate is enabled by checking the component's metric endpoint for kubernetes_feature_enabled.
-->

FeatureメトリクスがそれぞれのKubernetesコンポーネントで利用可能となり、コンポーネントのメトリクスエンドポイントの`kubernetes_feature_enabled`をチェックすることによりそれぞれの[アクティブなfeature gateが有効化されているかどうかを追うことが可能](https://github.com/kubernetes/kubernetes/pull/112690)となります。

### Dynamic Resource Allocation graduates to alpha 

<!--
Dynamic Resource Allocation is a new feature that puts resource scheduling in the hands of third-party developers: it offers an alternative to the limited "countable" interface for requesting access to resources (e.g. nvidia.com/gpu: 2), providing an API more akin to that of persistent volumes. Under the hood, it uses the Container Device Interface (CDI) to do its device injection. This feature is blocked by the DynamicResourceAllocation feature gate.
-->

[Dynamic Resource Allocation](https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/)は[新たな機能](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3063-dynamic-resource-allocation/README.md)でresource schedulingをthird-partyの開発者へ委ねるものです: それはリソースを要求する(例えばnvidia.com/gpu: 2)ために制限された"カウント可能な"インターフェースを代替を提供し、より永続ボリュームに類似した API を提供します。内部的にはそれはdeviceをインジェクションするために[Container Device Interface(CDI)](https://github.com/container-orchestrated-devices/container-device-interface)を利用します。この機能は`DynamicResourceAllocation` feature gateによりブロックされています。

### CEL in Admission Control graduates to alpha 

<!--
This feature introduces a v1alpha1 API for validating admission policies, enabling extensible admission control via Common Expression Language expressions. Currently, custom policies are enforced via admission webhooks, which, while flexible, have a few drawbacks when compared to in-process policy enforcement. To use, enable the ValidatingAdmissionPolicy feature gate and the admissionregistration.k8s.io/v1alpha1 API via --runtime-config.
-->

[この機能](https://github.com/kubernetes/enhancements/issues/3488)は[validation admission policies](https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/)のためのv1alpha1 APIを導入し、[Common Expression Language](https://github.com/google/cel-spec)を用いて拡張可能なadmission controlを有効化します。現在、カスタムポリシーは[admission webhook](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)により強制されており、それは柔軟な一方in-processなポリシーの執行と比較するといくつか欠点があります。利用するためにはValidatingAdmissionPolicy feature gateを有効化し、かつ`admissionregistration.k8s.io/v1alpha1`を`--runtime-config`経由で有効化する必要があります。

:pencil: 簡単ではありますがこちらの機能を調査しましたので、ご興味がある方は[こちら](https://qiita.com/uesyn/items/de3343d657bc4d0b0d8f)もご参照ください！

### Pod scheduling improvements 

<!--
Kubernetes v1.26 introduces some relevant enhancements to the ability to better control scheduling behavior.
-->

Kubernetes v1.26では、スケジューリング動作をより適切に制御する機能に関連するいくつかの機能強化が導入されています。

### PodSchedulingReadiness graduates to alpha 

<!--
This feature introduces a .spec.schedulingGates field to Pod's API, to indicate whether the Pod is allowed to be scheduled or not. External users/controllers can use this field to hold a Pod from scheduling based on their policies and needs.
-->

この機能は`.spec.schedulingGates`フィールドをPodのAPIへ追加し、Podがスケジュールされることを許可されているかどうかを示します。外部のユーザやコントローラはこのフィールドを使用してポリシーや必要に基づきスケジューリングからPodをホールドできます。

### NodeInclusionPolicyInPodTopologySpread graduates to beta 

<!--
By specifying a nodeInclusionPolicy in topologySpreadConstraints, you can control whether to take taints/tolerations into consideration when calculating Pod Topology Spread skew.
-->

topologySpreadConstraintsのnodeInclusionPolicyを指定することで、Pod Topology Spreadのスキューを計算する際に、taintas/tolerationsを考慮するかどうかをコントロールできます。

## Other Updates

### Graduations to stable

<!--
This release includes a total of eleven enhancements promoted to Stable:
-->

このリリースは合計11のenhancementsがStableへの昇格を含みます。

- [Support for Windows privileged containers](https://github.com/kubernetes/enhancements/issues/1981)
- [vSphere in-tree to CSI driver migration](https://github.com/kubernetes/enhancements/issues/1491)
- [Allow Kubernetes to supply pod's fsgroup to CSI driver on mount](https://github.com/kubernetes/enhancements/issues/2317)
- [Azure file in-tree to CSI driver migration](https://github.com/kubernetes/enhancements/issues/1885)
- [Job tracking without lingering Pods](https://github.com/kubernetes/enhancements/issues/2307)
- [Service Internal Traffic Policy](https://github.com/kubernetes/enhancements/issues/2086)
- [Kubelet Credential Provider](https://github.com/kubernetes/enhancements/issues/2133)
- [Support of mixed protocols in Services with type=LoadBalancer](https://github.com/kubernetes/enhancements/issues/1435)
- [Reserve Service IP Ranges For Dynamic and Static IP Allocation](https://github.com/kubernetes/enhancements/issues/3070)
- [CPUManager](https://github.com/kubernetes/enhancements/issues/3570)
- [DeviceManager](https://github.com/kubernetes/enhancements/issues/3573)

### Deprecations and removals 

<!--
12 features were deprecated or removed from Kubernetes with this release.
-->

このリリースでKubernetesから12の機能が非推奨または削除されました。

- [CRI v1alpha2 API is removed](https://github.com/kubernetes/kubernetes/pull/110618)
- [Removal of the v1beta1 flow control API group](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#flowcontrol-resources-v126)
- [Removal of the v2beta2 HorizontalPodAutoscaler API](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#horizontalpodautoscaler-v126)
- [GlusterFS plugin removed from available in-tree drivers](https://github.com/kubernetes/enhancements/issues/3446)
- [Removal of legacy command line arguments relating to logging](https://github.com/kubernetes/kubernetes/pull/112120)
- [Removal of kube-proxy userspace modes](https://github.com/kubernetes/kubernetes/pull/112133)
- [Removal of in-tree credential management code](https://github.com/kubernetes/kubernetes/pull/112341)
- [The in-tree OpenStack cloud provider is removed](https://github.com/kubernetes/enhancements/issues/1489)
- [Removal of dynamic kubelet configuration](https://github.com/kubernetes/kubernetes/pull/112643)
- [Deprecation of non-inclusive kubectl flag](https://github.com/kubernetes/kubernetes/pull/113116)
- [Deprecations for kube-apiserver command line arguments](https://github.com/kubernetes/kubernetes/pull/38186)
- [Deprecations for kubectl run command line arguments](https://github.com/kubernetes/kubernetes/pull/112261)

## Urgent Upgrade Notes 

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

<!--
- Deprecated beta APIs scheduled for removal in `v1.26` are no longer served. See https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-26 for more information. ([#111973](https://github.com/kubernetes/kubernetes/pull/111973), [@liggitt](https://github.com/liggitt))
-->

- `v1.26`で削除予定であった非推奨のbeta APIはサーブされなくなりました。詳細は https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-26 をご参照ください。([#111973](https://github.com/kubernetes/kubernetes/pull/111973), [@liggitt](https://github.com/liggitt))

<!--
- The in-tree cloud provider for OpenStack (and the cinder volume provider) has been removed. Please use the external cloud provider and csi driver from [cloud-provider-openstack](https://github.com/kubernetes/cloud-provider-openstack) instead. ([#67782](https://github.com/kubernetes/kubernetes/pull/67782), [@dims](https://github.com/dims))
-->

- OpenStackのためのin-treeのcloud provider(とcinder volume provider)は削除されました。代わりに[cloud-provider-openstack](https://github.com/kubernetes/cloud-provider-openstack)からexternal cloud providerとcsi driverを利用してください。([#67782](https://github.com/kubernetes/kubernetes/pull/67782), [@dims](https://github.com/dims))