Kubernetes 1.25: SIG-API Machineryの変更内容

# はじめに

Kubernetes v1.25がリリースされました :tada:

今回SIG-API主体な変更は少ないですが、全体でみると一番はPSPの廃止でしょうか。GAした機能では、EphemeralContainerや、[前々リリースのv1.23](https://qiita.com/Ladicle/items/a37d040dddfd7a982fb2)で入ったCELによるCRDバリデーションがあります。
また、個人的に気になる機能は実装の今回ちょいちょい変更の入っている[KEP-3229](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3329-retriable-and-non-retriable-failures)です。Podのエラーに合わせてJobのリトライを制御する機能は嬉しい人が多いかと思います。

それでは、API周りの変更を担当するSIG-API Machineryの変更点を[CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md)からピックアックします。(:memo:がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です)

> SIG, KEPについては[こちら](https://qiita.com/Ladicle/items/24cff72f5e8f4bd293a6)を参照ください。


# Urgent Upgrade Notes

-  :star: 非推奨となったBeta APIの公開が停止し、削除スケジュールがドキュメントに記載されました。詳しくは <https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-25> をご覧ください。([#108797](https://github.com/kubernetes/kubernetes/pull/108797))
    -   :memo: 上記ドキュメントには、v1.27までの削除スケジュールが記載されています。v1.25で公開が停止したBeta APIは以下の通りです
        -   batch/v1beta1
        -   discovery.k8s.io/v1beta1
        -   events.k8s.io/v1beta1
        -   autoscaling/v2beta1
        -   policy/v1beta1
        -   policy/v1beta1
        -   node.k8s.io/v1beta1
-   e2eテストライブラリのGinkgoがv1からv2にアップグレードされました。 Ginkgo CLIでtest/e2eを実行する場合、v2のCLIを使用してください。また、デフォルトのタイムアウトが24hから1hになっているので、 `-timeout=24h` など適切な値を渡してください。Ginkgo V2 は go test の `-parallel` フラグを受け付けないため、代わりに `ginkgo -p` または `ginkgo -procs=N` を設定してください。([#109111](https://github.com/kubernetes/kubernetes/pull/109111))
-  :star: Kubernetesの公式イメージのOCIイメージレジストリ(`registry.k8s.io`)ができました。古いレジストリ(`k8s.gcr.io`)もしばらくサポートされますが、新しいレジストリはミラーが設定されているので、パフォーマンスの面でおすすめです。([#109938](https://github.com/kubernetes/kubernetes/pull/109938))
    -   Admission/Policyでレジストリの許可リストを設定している場合は、 `k8s.gcr.io` と共に `registry.k8s.io` も設定してください
    -   エアギャップ環境やイメージのガベージコレクション設定がある場合も、 `k8s.gcr.io` に加えて `registry.k8s.io` の設定が必要になります


# :wastebasket: Deprecation (非推奨になったAPI)

-   Kube-controller-managerのフラグから `deleting-pods-qps`, `deleting-pods-burst`, `register-retry-count` が削除されました。 ([#109612](https://github.com/kubernetes/kubernetes/pull/109612))
    -   :memo: v1.10時点で非推奨になっていたフラグが削除されています。
- :star:  `gcp` と `azure` の認証プラグインは client-go と kubectl から削除されました。詳しくは<https://github.com/Azure/kubelogin> と <https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke> を参照してください ([#110013](https://github.com/kubernetes/kubernetes/pull/110013))
    -   :memo: バグが見つかったためこの変更はRevertされました。Featuresで取り上げられているIssuel [#111911](https://issue.k8s.io/111911) が解決後、再度削除される予定です。 ->  [#112017](https://github.com/kubernetes/kubernetes/pull/112017)で修正されました。この変更はv1.26に入ります
-   1.21 から非推奨になっていた `PodSecurityPolicy` のbeta admission pluginは削除されました。v1.25にアップグレードする前に、[Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller](https://kubernetes.io/docs/tasks/configure-pod-container/migrate-from-psp/) にある指示に従って、組み込みのPodSecurity admission plugin（または他のサードパーティのwebhook）に移行してください。([#109798](https://github.com/kubernetes/kubernetes/pull/109798))


# :earth\_asia: API Changes (API周りの変更)

-   PodSpecの `TopologySpreadConstraints` に `NodeInclusionPolicy` を追加しました。([#108492](https://github.com/kubernetes/kubernetes/pull/108492))
-   KMSのv2alpha1が追加されました。([#111126](https://github.com/kubernetes/kubernetes/pull/111126))
-   v1.25で、PodSecurity `restricted` レベルでは、 .spec.os.name="windows" を利用するPodにLinux固有のsecurityContextフィールドの設定が不要になりました。v1.25以降のクラスタにv1.23以前のノードが存在し、かつLinux固有のsecurityContextフィールドを引き続き必須としたい場合、Namespaceにラベル(e.g. `pod-security.kubernetes.io/enforce-version: v1.24`)を付与してv1.25以前の `restricted` バージョンが選択されるように設定してください。([#105919](https://github.com/kubernetes/kubernetes/pull/105919))
- Pod障害Policyに応じてPod障害を処理するようになりました。([#111113](https://github.com/kubernetes/kubernetes/pull/111113))
    -   :memo: JobのPodが失敗した際に、ExitCodeに応じた処理を定義できるようになりました。詳しくは[KEP-3229 Retriable and Non Retriable Failures](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3329-retriable-and-non-retriable-failures)を参照してください。
-   Kube-Schedulerの `ComponentConfig` がGAに昇格し、 `kubescheduler.config.k8s.io/v1` が有効になりました。 `SelectorSpread` プラグインはv1で削除されています。([#110534](https://github.com/kubernetes/kubernetes/pull/110534))
-   ローカルストレージの容量分離機能がGAしました。rootファイルシステムを確認できないシステム(rootless)では、 `kubelet config --local-storage-capacity-isolation=false` でこの機能を無効にしてください。無効化すると、LocalEphemeralStorageのrequest/limitと、emptyDirの `sizeLimit` を設定できなくなります。([#111513](https://github.com/kubernetes/kubernetes/pull/111513))
-  CronJobのTimeZone機能がBetaに昇格しました。([#111435](https://github.com/kubernetes/kubernetes/pull/111435))
-   Pod `spec.podOS` フィールドがGAに昇格しました。FeatureGateの `IdentifyPodOS` が常に有効になります。1.27では `--feature-gates` パラメータからも削除予定です。 ([#111229](https://github.com/kubernetes/kubernetes/pull/111229))
-   ローリングアップグレード後も `PodTopologySpread` が反映されるようになりました。([#111441](https://github.com/kubernetes/kubernetes/pull/111441))
-   `CSIInlineVolume` がBetaからGAに昇格しました。([#111258](https://github.com/kubernetes/kubernetes/pull/111258))
-   Admissionプラグイン `PodSecurity` がGAに昇格し、デフォルト有効になりました。AdmissionConfigのバージョンは `pod-security.admission.config.k8s.io/v1` に昇格しました。 ([#110459](https://github.com/kubernetes/kubernetes/pull/110459))
-   Network Policyの `endPort` フィールドがGAに昇格しました。 `endPort` フィールドをサポートするNetwork Policyプロバイダは、Network Policyを適用するポートの範囲を指定できます。以前のNetwork Policyは、1ポートのみを指定可能でした。 `endPort` フィールドは、Network Policyプロバイダがサポートしている場合のみ利用できます。プロバイダが `endPort` をサポートしていない場合、Network Policyは `port` フィールド(単一ポート)のみを対象としたものが作成されます。([#110868](https://github.com/kubernetes/kubernetes/pull/110868))
-   `metadata.clusterName` フィールドが削除されました。これによるユーザー影響は特にありません。([#109602](https://github.com/kubernetes/kubernetes/pull/109602))
-   Pod Topology Spreadの `minDomains` フィールドがBetaに昇格しました。([#110388](https://github.com/kubernetes/kubernetes/pull/110388))
-   kube-controller-managerの `enable-taint-manager` フラグが非推奨になりました。1.26 で削除予定です。taint-based eviction機能は既にデフォルト有効になっているため、フラグが削除されても利用できます。([#111411](https://github.com/kubernetes/kubernetes/pull/111411))
-   CSI Driver Clientに `NodeExpandSecret` が追加されました。Nodeを拡張する際に、CSI DriverがこのSecretを利用できるようになりました。以前は `nodeexpansion` 呼び出しの一部として秘密鍵が提供できませんでした。([#105963](https://github.com/kubernetes/kubernetes/pull/105963))
-   [EphemeralContainer](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/)がGAしました。 `EphemeralContainers` のFeatureGateは常に有効になります。また、kube-apiserverとkubelet `--feature-gates` フラグから削除が必要です。FeatureGateの `EphemeralContainers` は、今後のリリースで削除予定です。詳しくは[非推奨および削除予定](https://kubernetes.io/docs/reference/using-api/deprecation-policy/#deprecation)を参照してください。([#111402](https://github.com/kubernetes/kubernetes/pull/111402))
    -   :memo: 2016年からDebug用の機能欲しいというIssueがたてられてから、ついに1.25でGAしました! 詳しくは [KEP-277 Ephemeral Container](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/277-ephemeral-containers) を参照してください。


# :sparkle: Features (機能追加)

-   KMS `v2alpha1` APIが追加されました。([#110201](https://github.com/kubernetes/kubernetes/pull/110201))
-   dynamic `ResourceInterface` に `Apply` と `ApplyStatus` メソッドが追加されました。 ([#109443](https://github.com/kubernetes/kubernetes/pull/109443))
    -   :memo: typed clientには既にApply/ApplyStatusが実装されているので、dynamic clientにも追加したようです。
- :star:   `ServerSideFieldValidation` がBetaに昇格しました。schema検証がserver-sideで実施されるようになり、リクエストにinvalid/unknownなフィールドがあった場合にはデフォルトでwarningが表示されるようになります。([#110178](https://github.com/kubernetes/kubernetes/pull/110178))
    -   :memo: いままではclient側でバリデーションされていましたが、デフォルトでserver-sideで実施されるようになりました。v1.24でも一度ベータに上がったのですが、バグが発見されたためアルファに戻り、1.25で正式にベータに昇格しました。詳しくは[KEP-2885 Server Side Unknown Field Validation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2885-server-side-unknown-field-validation)を参照してください。
-  :star:  `CustomResourceValidationExpressions` がBetaに昇格しました。FeatureGateの `CustomResourceValidationExpressions` はデフォルト有効になります。([#111524](https://github.com/kubernetes/kubernetes/pull/111524))
    -   :memo: これでCRDの単体で完結するようなValidationであればwebhook使わずCELでいけそうです。詳しくは [KEP-2876 CRD Validation Expression Language](https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2876-crd-validation-expression-language/README.md) を参照してください。
-   Etcdのバージョンがv3.5.4になりました ([#110033](https://github.com/kubernetes/kubernetes/pull/110033))
-   対応中の <https://issue.k8s.io/111911> が修正されるまで、 `gcp` と `azure` のauth pluginがclient-goとkubectlに復活しました。([#111918](https://github.com/kubernetes/kubernetes/pull/111918))
-  status=TrueのPodがDisruptionTargetを満したまま、DeletionTimestampが更新されずに2分以上経過した場合、controle planeがstatus=Falseをセットするようになりました。([#111475](https://github.com/kubernetes/kubernetes/pull/111475))
    -   :memo: 詳しくは[KEP-3329 Retriable and Non Retriable Failures](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3329-retriable-and-non-retriable-failures)を参照してください


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

-   api-server: 複数のwebhookをロードする際のauditの処理が修正されました。([#110145](https://github.com/kubernetes/kubernetes/pull/110145))
    -   :memo: 関数リテラル内でループ変数を掴んでしまうよくあるやつ
-   strict server-sideフィールド検証で `metadata` フィールドをunknownフィールドとして検出してしまうバグを修正しました。([#109268](https://github.com/kubernetes/kubernetes/pull/109268))
-   AuthenticatedGroupAdderとキャッシュされたauth token間のデータ競合を修正しました。([#109969](https://github.com/kubernetes/kubernetes/pull/109969))
-   スキーマが未指定(preserveUnknownFields)の大きなオブジェクトをSSA経由で作成する際のパフォーマンス問題が修正されました。([#111557](https://github.com/kubernetes/kubernetes/pull/111557))
-   Informer/Reflectorの呼び出し元が、特定のAPIエラーをタイプ別にunwrapできるようになりました。([#110076](https://github.com/kubernetes/kubernetes/pull/110076))
    -   :memo: `fmt.Errorf` で `%v` でエラーを埋めこむのではなく `%w` が使われるようになってます。
-   kube-apiserver: シャットダウン中にapiserverのcacherがGet/GetList/Watchリクエストを受けつけるとdeadlockする可能性があるため、拒否するようになりました。([#108414](https://github.com/kubernetes/kubernetes/pull/108414))
-   ManafedFiledの値が変更された際に、正しく時間が更新されるようになりました。([#110058](https://github.com/kubernetes/kubernetes/pull/110058))
    -   :memo: 今まで `managedFields.time` の値はApply時のみ更新されていましたが、manfedFiledが更新された際は常に更新するようになりました。
-   OpenAPIは以下のスキーマを複製しなくなりました。([#110179](https://github.com/kubernetes/kubernetes/pull/110179))
    -   io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions\_v2
    -   io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta\_v2
    -   io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference\_v2
    -   io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails\_v2
    -   io.k8s.apimachinery.pkg.apis.meta.v1.Status\_v2
-   validation admission webhookの検証中に発生したpanicを検出し、fail open/closeの設定に応じて処理するようになりました。([#108746](https://github.com/kubernetes/kubernetes/pull/108746))
-   Namespaceのeditorとownerが `leases.coordination.k8s.io` を作成できるようになりました。leaderelectionでは、configmapではなくleasesを利用してください。([#111472](https://github.com/kubernetes/kubernetes/pull/111472))
-   discovery cacheとの整合性を確保するため、fsyncの代わりにchecksumを使うようになりました。 ([#110851](https://github.com/kubernetes/kubernetes/pull/110851))
    -   :memo: MacOSでfsyncをつかったdiscoveryをすると遅いということでこの修正が入ったようです。