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

# はじめに

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

期待していた[In-place Pod Vertical Scaling](https://qiita.com/Ladicle/items/5bb5a9b7fb18bd400682)は入りませんでしたが、待望のEphemeral ContainerがBetaに昇格してデフォルト有効になったり、CEL expression languageによるCRDのバリデーションなど気になる機能もいくつか入っています。

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

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

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

- EgressSelectorConfiguration APIの`EgressSelection`タイプから'master'が削除されました。([#102242](https://github.com/kubernetes/kubernetes/pull/102242))
  - :memo: politeな'controlplane'に変更されています

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

- client-goのimpersonation設定にUIDが設定できるようになりました。設定した値はリクエストの`impersonated uid`に渡されます。([#104483](https://github.com/kubernetes/kubernetes/pull/104483))
- HPAのv2beta2を元に`v2`が作成されました。これに伴い、いくつかのフィールドが変更されています。([#102534](https://github.com/kubernetes/kubernetes/pull/102534))
  - :memo: ChangeLogにはフィールド変更と書かれていますが、HPAリソースのフィールド変更はありませんでした。KEPには分かりづらい`Resource`を`PodResource`に変更するなどのRenameが書かれているので今後変更が入るかもしれません。 詳しくは [KEP-2702: Graduate v2beta2 Autoscaling API to GA](https://github.com/kubernetes/enhancements/tree/master/keps/sig-autoscaling/2702-graduate-hpa-api-to-GA) を参照してください。
- エフェメラルコンテナがBetaに昇格し、デフォルトで有効になりました。([#105405](https://github.com/kubernetes/kubernetes/pull/105405), [#105609](https://github.com/kubernetes/kubernetes/pull/105609))
  - :memo: ついにデフォルト有効になりました :tada: 起動パラメータ調整できない環境多くの環境でデバックできるようになりますね！ 使い方については[公式ドキュメント](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container)にも追記されています。設計について知りたい場合は [KEP-277: Ephemeral Containers](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/277-ephemeral-containers) を参照してください。
- `kube-controller-manager`に`--concurrent-ephemeralvolume-syncs`フラグが追加されました。これにより、ephemeral-volume-controllerのworker数を指定できます。 ([#102981](https://github.com/kubernetes/kubernetes/pull/102981))
- `generateName`を持つオブジェクトの生成時にConflictが発生すると、`AlreadyExists`エラーをリトライオプションと共に返すようになりました。([#104699](https://github.com/kubernetes/kubernetes/pull/104699))
- Priority and Fairness のv1beta2が導入されました。これに伴うAPIの変更はありません。([#104399](https://github.com/kubernetes/kubernetes/pull/104399))
- JSON形式のログにおいて、Infoメッセージを標準出力・Errorメッセージを標準エラー出力に書き出すよう設定できるようになりました。また、Infoメッセージはメモリにバッファ可能です。ただし、デフォルトでは、バッファせず標準出力に書き出します。([#104873](https://github.com/kubernetes/kubernetes/pull/104873))
- `LogFormatRegistry`のユーザはlogrの v1.0.0 APIを使うようにコードのアップデートが必要です。JSONログの出力では、go-logr/zapr フォーマットが使われるようになりました。(エラーやメッセージに`v`フィールドが無いことに注意してください。)また、これに伴いいくつかの修正が入っています。([#104103](https://github.com/kubernetes/kubernetes/pull/104103))
- kube-apiserver: CRDスキーマにおいて、enumのnull値の取扱が修正されました。([#104969](https://github.com/kubernetes/kubernetes/pull/104969))
  - :memo: nullをskipするためconvertion関数のエラーを無視していましたが、エラーはそのまま返すようになりました。代わりに、事前に値が空 or `null`文字であるかを検証しています。
- kube-apiserver: 非推奨APIの廃止 ([#104248](https://github.com/kubernetes/kubernetes/pull/104248))
  - `rbac.authorization.k8s.io/v1alpha1` APIが削除されました。代わりに `rbac.authorization.k8s.io/v1` APIを利用してください。v1はv1.8から有効になっています。
  - `scheduling.k8s.io/v1alpha1` APIが削除されました。代わりに `scheduling.k8s.io/v1` APIを利用してください。v1はv1.14から有効になっています。
- KubernetesはGo 1.17 (1.17.3)でビルドされるようになりました。([#103692](https://github.com/kubernetes/kubernetes/pull/103692), [#106209](https://github.com/kubernetes/kubernetes/pull/106209))
  - :memo: Go 1.17 のRelease Notesは[こちら](https://go.dev/doc/go1.17)。Kubernetesでは `//go:build` へのマイグレーションのための変更が大量に入ってます。
- クエリパラメータの `fieldValidation=[Strict,Warn,Ignore]` を設定することで、Server SideのSchema検証を実行します。([#105916](https://github.com/kubernetes/kubernetes/pull/105916))
  - :memo: `Strict`を設定するとunknownフィールドが存在する時にエラー、`Warn`を設定するとリクエストは成功するがWarningを表示、`Ignore`を設定すると何もせずエラーを無視します。詳しくは [KEP-2885: Server Side Unknown Field Validation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2885-server-side-unknown-field-validation) を参照してください。
- Feature Gateの `TTLAfterFinished` がGAに昇格し、デフォルト有効になります。([#105219](https://github.com/kubernetes/kubernetes/pull/105219))
  - :memo: 便利なTTL機能がGAになりました。今まではCronJobを使っているとJobやPodなどの実行済みリソースが大量に残るため、これを定期的に消すようなcleanerなどを動かしていた方も多いのではないでしょうか?この機能では、JobやPodにTTLを設定することで、実行済みリソースがTTLを過ぎると自動でcleanupしてくれるという機能です。
  - デフォルト有効になりましたが、この機能自体はJobやPodのデフォルト挙動は変更していません。利用する場合はTTLを明示的に設定してください。
  - 下のPR含め、CronJobがv1.21でGAしてからちょいちょい改善入ってます。詳しくは [KEP-592: TTL After Finished Controller](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/592-ttl-after-finish) を参照してください。
- JobステータスでReady状態のPod数を記録するようになりました。この機能は現在Alphaで、利用にはFeature Gateの`JobReadyPods`の有効化が必要です。([#104915](https://github.com/kubernetes/kubernetes/pull/104915))
  - :memo: 詳しくは [KEP-2879: Track ready Pods in Job status]( https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/2879-ready-pods-job-status ) を参照してください。
- Custom Resource Definitionのバリデーションを[CEL expression language](https://github.com/google/cel-spec)で記述できます。CELによるバリデーションは、OpenAPIv3 schema (alpha)の`x-kubernetes-validations`拡張フィールドに設定してください。現在この機能はAlphaで、利用にはFeature Gateの `CustomResourceValidationExpressions` の有効化が必要です。 ([#106051](https://github.com/kubernetes/kubernetes/pull/106051), [#105107](https://github.com/kubernetes/kubernetes/pull/105107))
  - :memo: 詳しくは: [KEP-2876: CRD Validation Expression Language](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2876-crd-validation-expression-language) を参照してください。

# :sparkle: Features (機能追加)

- `workqueue`APIのconditionに`Processing`が追加されました。`workqueue`APIの`Shutdown`の挙動が変わり、全てのin-flightアイテムの処理が終了するまで待機するようになります。([#101928](https://github.com/kubernetes/kubernetes/pull/101928))
- client-go: `Reactor`のfake clientに`DeleteOptions`を渡すようになりました。([#102945](https://github.com/kubernetes/kubernetes/pull/102945))
- `meta/v1`パッケージの`NewUnstructuredExtractor`がパブリックになりました。これは、オブジェクトをUnstructuredなApply設定に展開できます。([#103564](https://github.com/kubernetes/kubernetes/pull/103564))
- 機能フラグを有効化した場合、OpenAPI v3フォーマットの`/openapi/v3`エンドポイントが公開されます。([#105945](https://github.com/kubernetes/kubernetes/pull/105945))
  - :memo: Feature Gateのフラグ名は`OpenAPIV3`です。
- `client-go`のEventライブラリでスパムのフィルタリングを拡張できるようになりました。これは、`SpamKeyFun`を上書きすることでイベントのスパムフィルタを変更できます。([#103918](https://github.com/kubernetes/kubernetes/pull/103918))
- `client-go`において、以下のHTTPリクエストイベントのトレースにログレベル9が使われるようになりました。([#105156](https://github.com/kubernetes/kubernetes/pull/105156))
  - DNS lookup
  - TCP dialing
  - TLS handshake
  - poolからコネクションを取得した時間
  - リクエストを処理した時間

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

- `generic-apiserver`をベースとしているサーバで、CAや証明書とキーのbundleファイルに変更が合った場合、即座にリロードされます。([#104102](https://github.com/kubernetes/kubernetes/pull/104102))
- client-goにおいて、生成された全グループとバージョンに同じHTTPクライアントを使うようになりました。これにより、複数のグループとバージョンに対して、カスタマイズしたTransportを共有できます。([#105490](https://github.com/kubernetes/kubernetes/pull/105490))
- Apply/Update後において、webhookにおいて古いオブジェクトによる不正なコピーが発生する問題が修正されました。([#106195](https://github.com/kubernetes/kubernetes/pull/106195))
- APIタイムアウトの記録中に並列マップアクセスによってpanicが発生する問題が解消されました。([#105734](https://github.com/kubernetes/kubernetes/pull/105734))
- controller-manager, kubelet, kube-apiserver, or client-goにおいて、LRUキャッシュでpanicが発生する退行バグが解消されました。([#104466](https://github.com/kubernetes/kubernetes/pull/104466))
- 新しいサーバオプション`shutdown-send-retry-after`を追加します。trueの場合、HTTPサーバは実行中の全ての(ロングランニングではない)リクエストが処理されるまでListenを続けます。このウィンドウの間、全ての新規リクエストにはステータスコード`429 Retry-After`を返します。([#101257](https://github.com/kubernetes/kubernetes/pull/101257))
  - :memo: API serverのオプションです
- kube-apiserver: `admission webhook`に対する不必要な連続呼び出しを避けるため、UPDATE/DELETEリクエストを除外します。([#104182](https://github.com/kubernetes/kubernetes/pull/104182))
- kube-apiserver: `events.k8s.io` APIグループを介して作製されたClusterスコープのEventオブジェクトは、default namespaceでも許可されるようになりました。これは、`v1`APIとEventクライアントの互換性を保つための変更です。([#100125](https://github.com/kubernetes/kubernetes/pull/100125))
- APIサーバで使われているetcdクライアントで、特定のエラーをリトライさせるようになりました。該当エラー(codes.Unavailable)のリストは[ここ](https://github.com/etcd-io/etcd/blob/main/api/v3rpc/rpctypes/error.go#L72)から確認できます。([#105069](https://github.com/kubernetes/kubernetes/pull/105069))
  - :memo: 現在`codes.Unavailable`が設定されているetcdサーバ側のエラーは7つあります。それぞれLeader変更や不在系、Timeout系、Unhealthyなど時間が解決するかもしれないエラーが対象となっています。
- サーバの起動時に404レスポンスを受け取った場合、オブジェクト削除の可能性があるGC及びNamespaceコントローラの問題を解消しました。このPRにより、APIServiceRegistrationControllerのジョブが完了するまで、AggregatedAPIサーバへのリクエストが404ではなく503を受け取ることを保証できます。([#104748](https://github.com/kubernetes/kubernetes/pull/104748))
- `client-go`のダイナミッククライアントが、デフォルトで`Content-Type: application/json`ヘッダを付与するようになりました。([#104327](https://github.com/kubernetes/kubernetes/pull/104327))

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

- `-v`と`-vmodule`を除く全ての`klog`フラグは非推奨になりました。`-vmodule`はテキストログ形式でのみサポートします。([#105042](https://github.com/kubernetes/kubernetes/pull/105042))
- kube-apiserver: URLパスを追加しないNode/Service/Podの`/proxy`サブリソースへのリクエストは、GETとHEADリクエストのみを自動的にリダイレクトします。([#95128](https://github.com/kubernetes/kubernetes/pull/95128))
- kube-apiserver: アイドル状態のkeep-alive接続のlifetimeと、リクエストヘッダのRead時間の上限を設定しました。([#103958](https://github.com/kubernetes/kubernetes/pull/103958))