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

# はじめに

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

今回はAPI周りの大きな変更は少ないですが、CEL周りは引き続き機能追加だったり、AuthenticationConfigurationでも利用可能になったりと、強化されています。また、FlowControl APIはついにv1へ昇格しました。

それでは、今回も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)を参照ください。

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

- ⭐ `PreStop` ライフサイクルフックに新しい `sleep` アクションが追加されました。コンテナが終了する前に指定された時間待機できるようになります。([#119026](https://github.com/kubernetes/kubernetes/pull/119026))
    - 📝 exec.commandでsleepのhookをしなくてもsleepできるようになりました。便利! まだAlphaなので利用にはFeatureGateの `PodLifecycleSleepAction` の有効化が必要です。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
spec:
...
    spec:
      containers:
      - name: app
        image: nginx
        lifecycle:
          preStop:
            sleep: # <- new!
              seconds: 5
```

- ⭐ `v1alpha1.AuthenticationConfiguration` に CEL 式が追加されました。([#121078](https://github.com/kubernetes/kubernetes/pull/121078))
    - 📝 OIDC認証の設定もCELを使ってルールを定義できるようになりました。(e.g., `'claims.exp - claims.nbf <= 86400'`: トークンの有効期限を24h以内に制限する) 詳しくは[KEP-3331](https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3331-structured-authentication-configuration)を参照してください。
- Kubeletの設定に `ImageMaximumGCAge` フィールドが追加され、イメージがガベージコレクションされるまでの最大時間をユーザーが設定できるようになりました。([#121275](https://github.com/kubernetes/kubernetes/pull/121275))
- ⭐ `x-kubernetes-validations` に `optionalOldSelf` が追加されました。ratcheting CRD scheme制約がサポートされます。([#121034](https://github.com/kubernetes/kubernetes/pull/121034))
    - 📝 optionalOldSelfオプションが追加されました。これを有効にすると、新規作成時や更新前の値が未設定の場合にも`None`として前の値を使ったルールが定義できます。まだAlphaなので、利用にはFeatureGateの`CRDValidationRatcheting`の有効化が必要です。CRDValidationRatchetingについては[KEP-4008](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/4008-crd-ratcheting)を参照してください。

```yaml
type: integer
x-kubernetes-validations:
- rule: "oldSelf.hasValue() ? self >= oldSelf.value() : true"
  optionalOldSelf: true
  message: if the field has a value, cannot transition to a lower value than before
```

- 新しい `ServiceCIDR` タイプが追加され、`Service ClusterIPs` アドレスの割り当て範囲を動的に設定できるようになりました。([#116516](https://github.com/kubernetes/kubernetes/pull/116516))
- `LoadBalancer` タイプのService `.status` に `ipMode` フィールドが追加されました。この新しいフィールドは `LoadBalancerIPMode` FeatureGateで設定できます。([#119937](https://github.com/kubernetes/kubernetes/pull/119937))
- kube-proxyに`nf_conntrack_udp_timeout`と`nf_conntrack_udp_timeout_stream`の設定が追加されました。([#120808](https://github.com/kubernetes/kubernetes/pull/120808))
- ⭐ `v1alpha1 AuthorizationConfiguration` webhook の `matchConditions` でCEL式が使えるようになりました。([#121223](https://github.com/kubernetes/kubernetes/pull/121223))
    - 📝 v1.28ではValidating/MutatingWebhookConfigurationの`matchConditions`でCELが使えるようになりましたが、`AuthorizationConfiguration`でも使えるようになりました。
- `certificates.k8s.io/v1alpha1` の `ClusterTrustBundle` オブジェクトをPodに設定できるようになりました。([#113374](https://github.com/kubernetes/kubernetes/pull/113374))
    - 📝 自前でvolume mountしてtrust bundle読み込んでいたケースもありましたが、標準機能として使えるようになりました。
- `DisableNodeKubeProxyVersion` FeatureGateが追加されました。このFeatureGateが有効になると、`kubeProxyVersion` フィールドが設定されなくなります。([#120954](https://github.com/kubernetes/kubernetes/pull/120954))
- CRD validation ruleの CEL 式で、文字列、リスト、またはマップを返す関数に対して、推定コストが誤って高く計算されるバグが修正されました。この問題は、関数の結果が後続の操作で使用されるケースで発見されました。([#119800](https://github.com/kubernetes/kubernetes/pull/119800))
- Job ステータスの `Ready` フィールドに対する API コメントが修正されました。([#121765](https://github.com/kubernetes/kubernetes/pull/121765))
- Job Podの障害ポリシーのアクション `FailIndex` に対する API コメントが修正されました。([#121764](https://github.com/kubernetes/kubernetes/pull/121764))
- Go API: `ResourceRequirements` 構造体が `VolumeResourceRequirements` に置き換えられました。([#118653](https://github.com/kubernetes/kubernetes/pull/118653))
- `Job` のPod障害ポリシーの `onPodConditions` フィールドがオプションになりました。([#120204](https://github.com/kubernetes/kubernetes/pull/120204))
- ⭐ `flowcontrol.apiserver.k8s.io/v1beta3` の `FlowSchema` および `PriorityLevelConfiguration` API が `flowcontrol.apiserver.k8s.io/v1` に昇格しました。変更は以下の通りです ([#121089](https://github.com/kubernetes/kubernetes/pull/121089)): 
    - PriorityLevelConfiguration: `.spec.limited.nominalConcurrencyShares` フィールドは、省略された場合にのみデフォルトで `30` になります（v1beta3 では明示的な `0` の値も `30` にデフォルトされていました）。`v1` バージョンでは、1.29 でこのフィールドが省略された場合にのみ `30` にデフォルトされます。1.30 では、`v1` API ではこのフィールドに明示的な `0` の値を指定することが許可されます。
    - `v1beta3` の API は非推奨となり、v1.32 ではもう提供されません。既存のオブジェクトは `v1` API を介して利用可能です。v1.32 にアップグレードする前に、クライアントとマニフェストを `v1` API を使用するように移行してください。
- Hard/Softの `PodAffinity/PodAntiAffinity` に `matchLabelKeys/mismatchLabelKeys` 機能が追加されました。([#116065](https://github.com/kubernetes/kubernetes/pull/116065))
- CRD を更新する際に、変更されていないバージョンの `x-kubernetes-validations` ルールに対しては、expressionごとのコスト制限のチェックがスキップされるようになりました。([#121460](https://github.com/kubernetes/kubernetes/pull/121460))
- このリリースで `CSINodeExpandSecret` フィーチャーが GA に昇格し、デフォルトで有効になりました。CSI ドライバーは、このリリース以降、CSI クライアントから送信される NodeExpansion リクエストでオプションで渡された `secretRef` 値を使用できるようになります。([#121303](https://github.com/kubernetes/kubernetes/pull/121303))
- ⭐ `ValidatingAdmissionPolicy` のタイプチェックでCRDや他のAPI拡張をサポートするようになりました。([#119109](https://github.com/kubernetes/kubernetes/pull/119109))
    - 📝 k8s標準リソースだけではなく、CRDも`ValidatingAdmissionPolicy`でバリデーションできるようになりました(CRDは自体のvalidation設定でCEL使えるので標準リソースに比べると使う機会は低そう?)。この機能は現在Betaで、利用にはFeatureGateの有効化が必要です。
- kube-apiserver: `--authentication-config` フラグの追加により、 AuthenticationConfiguration ファイルが読み込むめるようになりました。この `--authentication-config` フラグは、既存の `--oidc-*` フラグと併用できません。([#119142](https://github.com/kubernetes/kubernetes/pull/119142))
- `kube-apiserver`: `--authorization-config` フラグの追加により、`apiserver.config.k8s.io/v1alpha1`の`AuthorizationConfiguration`設定ファイルを読み込めるようになりました。`--authorization-config` フラグは `--authorization-modes` および `--authorization-webhook-*` フラグと併用できません。有効化には`alpha` の `StructuredAuthorizationConfiguration` Featureフラグの設定が必要です。([#120154](https://github.com/kubernetes/kubernetes/pull/120154))

# :sparkle: Features (機能追加)

- ⭐ `cel-go` が `v0.17.7` に更新され、 `ext` ライブラリが追加されました。([#121577](https://github.com/kubernetes/kubernetes/pull/121577))
    - 📝 extensionライブラリのSet(データ構造)系の機能が追加されています。ドキュメント化は次のバージョンv1.30を予定しているようです。
- `openAPIV3Schema` は `Properties` でも `AdditionalProperties` でもない CRD をCELで正しく処理できるようになりました。([#121459](https://github.com/kubernetes/kubernetes/pull/121459))
- CEL cost estimater は、列挙型を無制限の文字列として扱わなくなりました。代わりに、長さは最も長い列挙型の値に設定されます。([#121085](https://github.com/kubernetes/kubernetes/pull/121085))
- `Quantity` に乗算機能が追加されました。([#117411](https://github.com/kubernetes/kubernetes/pull/117411))
- OpenAPI v3 での一部の `requestBody` パラメータは、正しく必須としてマークされるようになりました。([#120735](https://github.com/kubernetes/kubernetes/pull/120735))
- `KMSv2KDF` FeatureGateがデフォルトで有効に変更されました。([#120433](https://github.com/kubernetes/kubernetes/pull/120433))
- client-sideのapplyでは、デフォルトで OpenAPI v3 を使用するようになりました。([#120707](https://github.com/kubernetes/kubernetes/pull/120707))
- etcd responseのデコーディングでは、contextのtimeoutを反映するようになりました。([#121614](https://github.com/kubernetes/kubernetes/pull/121614))
- `TaintManager` が `NodeLifeCycleController` から分離されました(KEP-3902)。([#119208](https://github.com/kubernetes/kubernetes/pull/119208))
- KMSv2 の暗号化/復号操作のトレースが有効になりました。([#121095](https://github.com/kubernetes/kubernetes/pull/121095))
- server-sideのapplyリクエストで、重複したアイテムがあるキー付きリストを変更する場合、重複を削除してリクエスト内の一位な要素で置き換えるようになりました。([#121575](https://github.com/kubernetes/kubernetes/pull/121575))
- ⭐ API リストのチャンキング（ページネーション）機能が `stable` に昇格しました。([#119503](https://github.com/kubernetes/kubernetes/pull/119503))
- etcdストア用のストリーミングAPIが実装されました。 `sendInitialEvents ListOption` が `watch=true` と一緒に設定されると、サーバーは合成の初期イベントでウォッチストリームを開始し、その後、合成の `Bookmark` が続き、サーバーはイベントのストリーミングを続けます。([#119557](https://github.com/kubernetes/kubernetes/pull/119557))
- インツリーのクラウドプロバイダはデフォルトでオフになりました。この機能が必要な場合は、引き続き `DisableCloudProviders` および `DisableKubeletCloudCredentialProvider` フィーチャーフラグを使用してください。([#117503](https://github.com/kubernetes/kubernetes/pull/117503))
- KubernetesをGo `1.21.4` でビルドします。([#121808](https://github.com/kubernetes/kubernetes/pull/121808))
- `Priority and Fairness`機能が `stable` になり、FeatureGateは `v1.31` で削除されます。([#121638](https://github.com/kubernetes/kubernetes/pull/121638))
- ⭐ FeatureGate `CustomResourceValidationExpressions` による CRD バリデーションルールが `GA` に昇格しました。([#121373](https://github.com/kubernetes/kubernetes/pull/121373))
    - 📝 CELを使って柔軟なCRのValidationを定義する機能です。1.25のBeta昇格時からデフォルト有効だったので特に変わりません。前バージョンからの変更点はこのChangeLogにもいくつかあるbugfixとパフォーマンス改善です。
- FeatureGate `KMSv2` および `KMSv2KDF` とともに KMSv2 機能が `GA` に昇格しました。`KMSv1` FeatureGateはデフォルトで無効になりました。([#121485](https://github.com/kubernetes/kubernetes/pull/121485))
- CloudDualStackNodeIPs フィーチャーがベータ版になりました。これにより、この機能をサポートする外部クラウドプロバイダを使用すると、kubelet にコンマ区切りのデュアルスタック`--node-ips` を設定します。そして、クラウドプロバイダはこの両方の IP を考慮します。([#120275](https://github.com/kubernetes/kubernetes/pull/120275))
- generic APIサーバーライブラリを更新し、新しいAPIサーバーがJSON、YAML、またはProtobuf以外の形式で構成されている場合はエラーを投げるようになりました。([#121325](https://github.com/kubernetes/kubernetes/pull/121325))
- ⭐ `ValidatingAdmissionPolicy` はコンポジション変数の型を保持し、型関連のエラーを早期に発生させます。([#121001](https://github.com/kubernetes/kubernetes/pull/121001))
    - 📝 型関連のエラーメッセージも分かりやすいものが出力されるようになりました
- `etcd` のイメージが `v3.5.9` に基づいています。([#121567](https://github.com/kubernetes/kubernetes/pull/121567))
- `ServiceAccountTokenNodeBinding`が FeatureGate の `alpha` として追加されました。この機能は、Nodeにトークンを直接バインドする `TokenRequests` を許可します。また、`ServiceAccountTokenNodeBindingValidation` FeatureGateによって、トークンが使用される際にノードの名前とUIDが存在するかを検証します。([#120780](https://github.com/kubernetes/kubernetes/pull/120780))

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

- `ExternalIPs` を持つ `Services` に対して `ExternalTrafficPolicy` を設定できるようになりました。([#119150](https://github.com/kubernetes/kubernetes/pull/119150))
- `replace()` の CEL 推定コストが、置換文字列の長さがゼロの場合も正しく処理できるようになりました。この問題は、推定コストを高く見積もる原因でした。([#120097](https://github.com/kubernetes/kubernetes/pull/120097))
- `APIServices` の削除後に OpenAPI v3 が正しく掃除されるように修正しました。([#120108](https://github.com/kubernetes/kubernetes/pull/120108))
- 負のインデックスを持つ jsonパッチ処理のバグを修正しました。([#120327](https://github.com/kubernetes/kubernetes/pull/120327))
- API グループのパスが削除されたとき、API サーバーのルートパスから登録解除されなかったバグを修正しました。([#121283](https://github.com/kubernetes/kubernetes/pull/121283))
- 廃止予定の `generate-groups.sh` スクリプトの呼び出し時に発生するバグを修正しました。(`CLIENTSET_PKG: unbound variable`) ([#120877](https://github.com/kubernetes/kubernetes/pull/120877))
- `garbagecollection` コントローラがDiscoveryリクエストが失敗した場合に重複したイベントハンドラを登録するバグを修正しました。([#117992](https://github.com/kubernetes/kubernetes/pull/117992))
- `progressNotify` オプションが設定されたwatchを作成する場合、かつレジストリが `newFunc` を提供していない場合、エラーを返すように修正しました。([#120212](https://github.com/kubernetes/kubernetes/pull/120212))
- PR #119341 に対するフィードバックを組み込みました。([#120087](https://github.com/kubernetes/kubernetes/pull/120087))
- `kube-openapi`: 特定のフィールドに対して不要なデフォルト値（`{}`）が OpenAPI スペックに含まれないようにしました。([#120757](https://github.com/kubernetes/kubernetes/pull/120757))
- `etcd` を `v3.5.10` に更新しました。([#121566](https://github.com/kubernetes/kubernetes/pull/121566))

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

- `caches populated` ログメッセージにコンテキストを追加しました。([#119796](https://github.com/kubernetes/kubernetes/pull/119796))
- impersonationリクエスト関連の `kube-apiserver` HTTP ログを整理しました。([#119795](https://github.com/kubernetes/kubernetes/pull/119795))
- `kube-apiserver` における `--cloud-provider` および `--cloud-config` CLI パラメーターが非推奨となりました。これらのパラメーターは将来のリリースで削除される予定です。([#120903](https://github.com/kubernetes/kubernetes/pull/120903))
- グループバージョンの変更が無い場合にも、`Adding GroupVersion` ログが繰り返し表示されるバグを修正しました。([#119825](https://github.com/kubernetes/kubernetes/pull/119825))
- `kube-controller-manager` のメモリ使用量が改善されました。`kube-controller-manager` が必要としない `.metadata.managedFields` フィールドを削除しています。([#118455](https://github.com/kubernetes/kubernetes/pull/118455))
- `OpenAPIV3`の`GA`になったFeatureGateを削除しました。([#121255](https://github.com/kubernetes/kubernetes/pull/121255))
- `GRPCContainerProbe` FeatureGateを削除しました。(この機能は既にstableで、常に有効になっています)([#120248](https://github.com/kubernetes/kubernetes/pull/120248))
- `GetPodQOS(pod *core.Pod)` 関数は、`PodStatus.QOSClass`が設定されている場合、この値を返すようになりました。`QOSClass` の値を一から計算するには、`ComputePodQOS(pod*core.Pod)` を使用してください。([#119665](https://github.com/kubernetes/kubernetes/pull/119665))
- etcdには `ValidatingAdmissionPolicy` と `ValidatingAdmissionPolicyBinding` の `v1beta1` が保存されるようになりました。APIサーバを1.27 から 1.28 にアップグレードする前に、alphaの `ValidatingAdmissionPolicy` 機能を無効にするか、alpha版のオブジェクトを削除してください。([#120018](https://github.com/kubernetes/kubernetes/pull/120018))
    - 📝 ValidatingAdmissionPolicy/Bindingのstorageバージョンが変更されました
- `client-go`: `k8s.io/client-go/tools` の events および record パッケージにcontextとloggerを指定するための新しいAPIを追加しました。([#120729](https://github.com/kubernetes/kubernetes/pull/120729))
- `kubectl`は、長らく非推奨となっていた `/swagger-2.0.0.pb-v1` エンドポイントをサポートしなくなりました。([#119410](https://github.com/kubernetes/kubernetes/pull/119410))