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



# はじめに

Kubernetes 1.30 がリリースされました 🎉

今回のリリースでもCELまわりの改善がすすんでいます。今回はFeatureGateの追加ですが、実際にMutatingAdmissionPolicyが入るとValidatingの方と含めて置き換えられるWebhookが増えるので嬉しいですね。他にも `CustomResourceFieldSelectors` など便利機能がいくつか入っています。

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

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


# 🎉 Major Changes


## CRD validation ratcheting

この機能を利用するにはFeature GateのCRDValidationRatchetingの有効化が必要です。有効化すると、クラスタ内のすべてのCustomResourceDefinitionに適用されます。これにより、APIサーバは、バリデーションに失敗したフィールドが更新リクエストの変更対象でなければ、正常に変更するようになります。つまり、もともとバリデーションに失敗している箇所はそのまま残ります。この機能により、CRDの管理者はOpenAPIV3スキーマに新しい検証を安心して追加できます。ユーザーは、オブジェクトのバージョンアップや、ワークフローの破壊を気にせず新しいスキーマを利用できます。

📝 リソースのPATCH/UPDATE時に、変更していないフィールドのバリデーションエラーを無視するための機能です。ユーザ影響を気にしてCRDのバリデーションを変更できない&#x2026;という悩みを解決してくれます。


## Storage Version Migration

Kubernetes v1.30では、StorageVersionMigration用の新しいAPIが追加されました。Kubernetesは、ストレージ内のデータをメンテナンスするトリガとして、APIデータがアクティブに書き変えられることに依存しています。たとえば、保存されたリソースのバージョン管理スキーマの推奨バージョンがv1からv2に変更されると、保存されているデータの暗号化、つまり、データの暗号化方法の変更に基づいて古いデータが書き換えられます。StorageVersionMigrationはAlpha APIで、以前から利用可能でした。詳細はストレージのバージョン移行を参照してください。

📝 もともと [kubernetes-sigs/kube-storage-version-migrator](https://github.com/kubernetes-sigs/kube-storage-version-migrator) のリポジトリで管理されていたSVMがk8s本体に移動しました。今回は移動なため、SVMの[HA APIサーバのハンドリング](https://github.com/kubernetes/enhancements/issues/2339)などが追加されたわけではありません。SVMについては [そのクラスタ本当にアップグレードして大丈夫？ Storage Version の更新も忘れずにしよう！](https://speakerdeck.com/uesyn/k8s-storage-version-migration) で詳しく解説されています。 


# 🗑️ Deprecation (非推奨になったAPI)

`None`


# 🌏 API Changes (API周りの変更)

-   Jobの `managedBy` フィールドを追加しました。このフィールドのカスタム値(`kubernetes.io/job-controller` 以外の値)を持つJobはJobコントローラによってスキップされ、フィールドの値で示される外部コントローラに委譲されます。このフィールドを持たないJobや、フィールドの値が予約文字列 `kubernetes.io/job-controller` であるJobは、ビルドインのJobコントローラに調整されます。([#123273](https://github.com/kubernetes/kubernetes/pull/123273))
    -   📝 kueueのmulticluster用
-   JobsのSuccessPolicyをAlphaでサポートしました。([#123412](https://github.com/kubernetes/kubernetes/pull/123412))
    -   📝 コンテナのexit codeやPodのconditionに応じて失敗条件を指定するFailurePolicyの方はv1.26からBetaでしたが、今回は成功条件の方もAlphaで入りました。詳しくは [KEP-3998](https://kep.k8s.io/3998) 参照。
-   IPアドレスとCIDR用の `CEL` ライブラリを追加しました。これはバージョン `1.31` から使えます。([#121912](https://github.com/kubernetes/kubernetes/pull/121912))
-   Dynamic Resource Allocation: DRA ドライバは、"構造化パラメータ" を使って、スケジューラがClaim割り当てを処理できるようになりました。([#123516](https://github.com/kubernetes/kubernetes/pull/123516))
-   `AdmissionWebhookMatchConditions` がGAに昇格しました。FeatureGateはデフォルト有効になっています。([#123560](https://github.com/kubernetes/kubernetes/pull/123560))
    -   📝 AdmissionWebhookのmatchConditionフィールドで、リソースとWebhookの紐づけをCELで記述できるようにした機能です。 [KEP-3716](https://kep.k8s.io/3716)
-   Structured Authentication Configurationが `DiscoveryURL` をサポートしました。指定された場合、 `discoveryURL` はDiscovery情報取得のためのURLを上書きします。これは、well-known と jwks のエンドポイントがissuerと別の場所(クラスタ内のローカルなど)でホストされている場合のためです。([#123527](https://github.com/kubernetes/kubernetes/pull/123527))
-   以前はCustom Resource Definition(CRD)として利用できた `StorageVersionMigration` APIが、のビルトインAPIになりました。([#123344](https://github.com/kubernetes/kubernetes/pull/123344))
-   `readOnly` ボリュームがカーネルバージョン >= 5.12 で再帰的読み込み専用マウントをサポートしました。([#123180](https://github.com/kubernetes/kubernetes/pull/123180))
    -   📝 公式ブログの [Kubernetes 1.30: Read-only volume mounts can be finally literally read-only | Kubernetes](https://kubernetes.io/blog/2024/04/23/recursive-read-only-mounts/) で詳しく解説されています
-   kube-apiserver: `--authentication-config` フラグで設定できる AuthenticationConfiguration が `apiserver.config.k8s.io/v1beta1` に昇格しました。([#123696](https://github.com/kubernetes/kubernetes/pull/123696), [#123640](https://github.com/kubernetes/kubernetes/pull/123640))
-   kubelet 設定の `podLogsDir` から(デフォルトの /var/log/pods の代わりに) Podログ用のカスタムルートディレクトリを指定できるようになりました。([#112957](https://github.com/kubernetes/kubernetes/pull/112957))
-   resource.k8s.io/ResourceClaim (AlphaAPI)： `status.reservedFor` 配列用のStrategicMergePatchで個々のエントリーを追加できるようになりました。この変更により、StrategicMergePatchを利用しているクライアントがステータス変更時に以前の動作(配列全体を置き換える)に依存していると、破損する可能性があります。([#122276](https://github.com/kubernetes/kubernetes/pull/122276))
    -   📝 DRAでPod情報の更新で必要になって実装された機能です
-   `runtime.Serializer` にCBORの実装を追加しました。CBORがAlphaを卒業するまでは、CBORが設定されたAPIサーバは起動に失敗します。([#122881](https://github.com/kubernetes/kubernetes/pull/122881))
-   Service `spec` に新しいAlphaフィールド `trafficDistribution` を追加しました。これは `ServiceTrafficDistribution` FeatureGateで有効になります。([#123487](https://github.com/kubernetes/kubernetes/pull/123487))
-   AuthenticationConfigurationにaudienceMatchPolicyフィールドを追加し、複数のaudienceの設定をサポートしました。([#123165](https://github.com/kubernetes/kubernetes/pull/123165))
    -   audiencesフィールドに単一のaudienceを指定する場合、audienceMatchPolicyは空(または未設定)にできます。
    -   audiencesフィールドに複数のaudienceが指定されている場合、audienceMatchPolicyは `MatchAny` の設定が必要です。
-   `MutableFeatureGate` に、FeatureGateのデフォルト設定を上書きする機能を追加しました。これにより、全コンポーネントに影響をあたえることなく、個別に設定できるようになります。([#122647](https://github.com/kubernetes/kubernetes/pull/122647))
-   Aggregated Discoveryは `v2beta1` と `v2` の両方をサポートし、GA に昇格しました。([#122882](https://github.com/kubernetes/kubernetes/pull/122882))
-   Custom ResourceのフィールドセレクタがAlphaでサポートされました。 `CustomResourceFieldSelectors` FeatureGateを有効にすると、CustomResourceDefinition API で `selectableFields` を指定できます。設定すると、ListリクエストやWatchリクエストでその CustomResourceDefinition のCustom Resourceをフィルタできます。([#122717](https://github.com/kubernetes/kubernetes/pull/122717))
    -   📝 標準リソースではフィルタできるfield selectorが[いくつか](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/)ありましたが、CRDでも設定できるようになりました。
-   AppArmor プロファイルは `PodSecurityContext` とコンテナの `SecurityContext` のフィールドに設定できるようになります。Beta版の AppArmor アノテーションは非推奨となり、AppArmor のステータスはノードのReady条件に含まれなくなりました。([#123435](https://github.com/kubernetes/kubernetes/pull/123435))
-   kubeletでConcurrent Log Rotationを有効にします。 `containerLogMaxWorkers` 設定で同時ローテーションの最大数、 `containerLogMonitorInterval` で監視間隔を調整できるようになりました。([#114301](https://github.com/kubernetes/kubernetes/pull/114301))
-   Pod Scheduling GateがGAしました。FeatureGateの `PodSchedulingReadiness` の設定にかかわらず、 `.spec.schedulingGates` フィールドは、PodとPodTemplate APIで常に有効になります。([#123575](https://github.com/kubernetes/kubernetes/pull/123575))
-   PodのTopology Spread Constraintsにおける `minDomains` がGAしました。 FeatureGateの `MinDomainsInPodTopologySpread` の設定にかかわらず、PodとPodTopologySpreadは常に有効になります。([#123481](https://github.com/kubernetes/kubernetes/pull/123481))
-   kubelet の設定で、 `.memorySwap.swapBehavior` フィールドに `NoSwap` が指定できるようになりました。これまで設定できていた `UnlimitedSwap` は削除されます。([#122745](https://github.com/kubernetes/kubernetes/pull/122745))
-   CEL式でチェックされるユーザ名が空文字列の場合OIDC認証を失敗させます。 以前はユーザ名が空文字列であっても認証されていました。([#123568](https://github.com/kubernetes/kubernetes/pull/123568))
-   PodSpecAPIから、 `hostAliases` がhostNetworkPodではサポートされないという注意書きを削除しました。この機能は、v1.8からサポートされています。([#122422](https://github.com/kubernetes/kubernetes/pull/122422))
-   `authentication-config` フラグで設定された JWT認証の設定は、ディスク上のファイルが変更されると自動的に再読み込みされるようになりました。([#123525](https://github.com/kubernetes/kubernetes/pull/123525))
-   `StructuredAuthenticationConfiguration` 機能がBetaに昇格し、デフォルト有効になりました。([#123719](https://github.com/kubernetes/kubernetes/pull/123719))
    -   📝 公式ブログの [Kubernetes 1.30: Structured Authentication Configuration Moves to Beta | Kubernetes](https://kubernetes.io/blog/2024/04/25/structured-authentication-moves-to-beta/) で詳しく解説されています
-   ユーザが `CSIDriver.Spec` の `FSGroupPolicy` と `PodInfoOnMount` を変更できるようになりました。([#116209](https://github.com/kubernetes/kubernetes/pull/116209))
-   ValidatingAdmissionPolicy がGAに昇格し、デフォルト有効になりました。([#123405](https://github.com/kubernetes/kubernetes/pull/123405))
    -   📝 Validating Webhook無しにリソースのValidationを定義できる機能がGAしました。Validating 公式ブログの [Kubernetes 1.30: Validating Admission Policy Is Generally Available | Kubernetes](https://kubernetes.io/blog/2024/04/24/validating-admission-policy-ga/) で詳しく解説されています
-   client-goでEventを扱うとき、Contextual Loggingのサポートが必要な場合は `NewEventBroadcasterAdapter` ではなく `NewEventBroadcasterAdapterWithContext` の利用が推奨になりました。([#122142](https://github.com/kubernetes/kubernetes/pull/122142))


# ✨ Features (機能追加)

-   `WatchListClient` FeatureGateを `client-go` に追加しました。これを有効にすると、クライアントはサーバからチャンキングではなく、ストリームを取得できます。([#122571](https://github.com/kubernetes/kubernetes/pull/122571))
-   Informersが起動後にIndexersを追加できるようになりました。([#117046](https://github.com/kubernetes/kubernetes/pull/117046))
-   FeatureGateの `CRDValidationRatcheting` がBetaに昇格し、デフォルト有効になりました。([#121461](https://github.com/kubernetes/kubernetes/pull/121461))
-   sendInitialEventsが要求された場合、Watchキャッシュは少なくとも指定されたrequestedWatchRVと同じになるまで待機するようになりました。([#122830](https://github.com/kubernetes/kubernetes/pull/122830))
-   `client-go` でsub-resourceのフィールドをクライアントサイドからサーバーサイドにアップグレードをサポートしました。([#123484](https://github.com/kubernetes/kubernetes/pull/123484))
-   AdmissionChainでMutatingPolicyを有効にするためのFeatureGate `MutatingAdmissionPolicy` を追加しました。([#123425](https://github.com/kubernetes/kubernetes/pull/123425))
-   PriorityLevelConfigurationオブジェクトの `nominalConcurrencyShares` フィールドが、 `flowcontrol.apiserver.k8s.io/v1` と `flowcontrol.apiserver.k8s.io/v1beta3` の両方のAPIでゼロ値を受け入れるようになりました。([#123001](https://github.com/kubernetes/kubernetes/pull/123001))
    -   📝 APFまわりの変更がおちついてきましたね。APFについては [Kubernetes: API Priority and Fairness](https://speakerdeck.com/ladicle/kubernetes-api-priority-and-fairness) で解説しています。
-   `client-go` にFeatureGateメカニズムを導入しました。 ユーザーは、環境変数やコマンドラインオプションで機能を制御できるようになります。([#122555](https://github.com/kubernetes/kubernetes/pull/122555))
-   監査ログに `apiserver.latency.k8s.io/decode-response-object` アノテーションが追加され、デコード時間が記録されるようになりました。([#121512](https://github.com/kubernetes/kubernetes/pull/121512))
-   ValidatingAdmissionPolicyで、tokenReview、SelfSubjectReview、LocalSubjectAccessReview、およびSubjectAccessReviewが、すべてのバージョンのauthentication.k8s.ioおよび、authorization.k8s.ioグループから除外されるようになりました。([#123543](https://github.com/kubernetes/kubernetes/pull/123543))
-   kube-apiserverで `RetryGenerateName` FeatureGateが有効な場合、generateNameを使用した作成リクエストが既存のリソース名と競合すると、apiserverによって自動的に再試行されるようになりました。この機能はAlphaです。([#122887](https://github.com/kubernetes/kubernetes/pull/122887))
-   `ValidatingAdmissionPolicy` がType Check Policyで変数が使えるようになりました。([#123083](https://github.com/kubernetes/kubernetes/pull/123083))


# 🐛 Bug or Regression (バグ修正)

-   `CRDValidationRatcheting` FeatureGateが有効な場合にのみ設定できるはずの `CustomResourceDefinition` 検証ルールで、新しいAlpha値 `optionalOldSelf` API フィールドが誤って有効になっていたのを修正しました。([#122329](https://github.com/kubernetes/kubernetes/pull/122329))
-   `ValidatingAdmissionPolicy` でCRDパラメータを利用するポリシーの同期に失敗するバグを修正しました。([#123003](https://github.com/kubernetes/kubernetes/pull/123003))
-   キャッシュからのConsistent Listingを有効にした場合に、非再帰リストが "resource version too high" エラーを返す問題を修正しました。([#123674](https://github.com/kubernetes/kubernetes/pull/123674))
-   etcdのレスポンスをデコードするときに、コンテキストのタイムアウトを尊重するようになりました。([#121815](https://github.com/kubernetes/kubernetes/pull/121815))
-   Etcd: `v3.5.11` に更新しました。([#122393](https://github.com/kubernetes/kubernetes/pull/122393))
-   APIServicesがAggregated Discoveryから欠落している場合も、ヘルスチェックに成功することがあるバグを修正しました。([#122883](https://github.com/kubernetes/kubernetes/pull/122883))
-   CRD検証ルールにFieldPathを提供すると、同じスキーマ上の他の無関係なCRD検証ルールのフィールドパスに影響してしまうバグを修正しました。([#123475](https://github.com/kubernetes/kubernetes/pull/123475))
-   resourceVersion=0で動作していたWatchキャッシュから、ConsistentListingを有効にするように修正しました。([#123676](https://github.com/kubernetes/kubernetes/pull/123676))
-   `InPlacePodVerticalScaling` がオンの場合に、クォータ計算エラーによってリソース削除に失敗する問題を修正しました。([#122701](https://github.com/kubernetes/kubernetes/pull/122701))
-   Kube-apiserver： `<=1.27` のようにデフォルトでWatchキャッシュから `resourceVersion` なしのWatchリクエストを許可することで、 `1.27+` からあったWatchの安定性 のリグレッションを修正したました。(PR 115096 の変更をデフォルトで無効にしました)。これにより、EtcdのWatchのバグ (<https://github.com/etcd-io/etcd/pull/17555>) の影響が緩和されます。Watchの安定性を犠牲にしてでも、PR 115096 の 1.27 の変更が必要な場合は、 `WatchFromStorageWithoutResourceVersion` FeatureGateから再度有効にしてください。([#123935](https://github.com/kubernetes/kubernetes/pull/123935))
-   OpenAPI V2 は、APIService で指定されたグループバージョンと一致しないAggregated APIServiceのOpenAPIを非公開にします。([#123570](https://github.com/kubernetes/kubernetes/pull/123570))
-   Aggregated APIServiceがそのSpec.Serviceフィールドを変更したまま戻さなかった場合に発生する、Discovery Documentのリークを修正します。([#123517](https://github.com/kubernetes/kubernetes/pull/123517))
-   Watchキャッシュが飢餓状態になるのを防ぐため、Watchを別のRPCに移動しました。この動作を無効にするための `SeparateCacheWatchRPC` 機能フラグを追加しました。([#123532](https://github.com/kubernetes/kubernetes/pull/123532))
-   `CVE-2024-24786` を解決するため、 google.golang.org/protobuf を `v1.33.0` に更新しました。([#123758](https://github.com/kubernetes/kubernetes/pull/123758))


# 🔬 Others (その他修正)

-   client-go: リーダがLeaseを更新するときに、APIサーバからレコードを取得せずにリーダロックを楽観的に更新するよう最適化しました。また、新しいメトリック `leader_election_slowpath_total` が追加されました。これにより、ユーザはLeader Electionで楽観的に更新されてない数を監視できます。([#122069](https://github.com/kubernetes/kubernetes/pull/122069))
-   `client-go/metadata` がコンテキストロギングに移行しました。([#122225](https://github.com/kubernetes/kubernetes/pull/122225))
-   FeatureGateからGAしている `RemoveSelfLink` を削除しました。([#122468](https://github.com/kubernetes/kubernetes/pull/122468))
-   Watchリクエストのスタックメモリ利用量を削減する最適化を追加しました。 これは、 `APIServingWithRoutine=false` で無効化できます。 ([#120902](https://github.com/kubernetes/kubernetes/pull/120902))
-   FeatureGate `LegacyServiceAccountTokenCleanUp` がGAに昇格し、デフォルトで常時有効になりました。 ([#122635](https://github.com/kubernetes/kubernetes/pull/122635))
-   `kube-controller-manager` の `--cidr-allocator-type` オプションを `CloudAllocator` に設定していましたが、将来のリリースで非推奨になり削除予定です。外部のクラウドプロバイダが提供するオプションへの移行を検討してください。([#123011](https://github.com/kubernetes/kubernetes/pull/123011))