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

# はじめに

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

今回のAPI周りの変更では、Ingressを始めとしていくつかのBeta APIが削除されています(アップグレード時にはご注意ください)。他にも、External Credential ProviderはBeta、皆様お待ちかねのServer-Side Apply(SSA)[^1]はGAに昇格しています。

また、新機能についてはNode周りが多い印象です。seccompをcluster-wideでデフォルト有効にするSeccompDefaultや、Cgroup v2 APIでメモリのQoSを設定可能にするMemoryQoSなどがあります。こちらについては後日公開予定のSIG-Nodeの記事の方を参照ください。(実装の進んでいたin-place Upgradeは今回入らなかったので次回に期待です。)

ちなみにk8sのサポートするetcdのデフォルトバージョンはv3.5.0にあがりましたが、先日etcd clientのv3.5.0を試したところバグを引いたのでパッチバージョン待ちです。

それでは、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)

-   controller-managerの `--port`, `--address` はv1.24で削除されます。insecure portフラグである `--port` には0のみセットできます。また、以下の点に注意してください。
    -   controller-managerは認証/認可の挙動を `--authorization-kubeconfig` と `--authentication-kubeconfig` フラグで指定して起動しなければなりません。
    -   controller-managerのliveness/readiness probeは現在HTTPSのみ利用できます。また、デフォルトのポート番号は10257に変更されました。
    -   controller-managerからメトリクスを取得するアプリケーションは、Service AccountのnonResourceURLsの `/metrics` で指定したものを利用してください。 ([#96216](https://github.com/kubernetes/kubernetes/pull/96216))
-   Serviceの `topologyKeys` フィールド(alpha)と、 `kube-proxy` にある実装のサポートを廃止しました。このフィールドは数サイクル前に非推奨となっています。この機能は、endpointごとのautomatic topology hints (alpha)と、Serviceの `internalTrafficPolicy` フィールドによって置き換えられます。([#102412](https://github.com/kubernetes/kubernetes/pull/102412))


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

-   NodeResourcesFitプラグイン用の新しいscore extensionは、NodeResourcesLeastAllocated / NodeResourcesMostAllocated / RequestedToCapacityRatioプラグインの機能を統合します。統合前の機能はv1beta2で非推奨になります。v1beta1では引き続き利用できますが、 `NodeResourcesFit` のscore extentionとの併用はできません。([#101822](https://github.com/kubernetes/kubernetes/pull/101822))
-   PVCのspecに `DataSourceRef` (alpha) フィールドが追加されました。このフィールドは、PVCとVolumeSnapshotsのデータソースになります。([#103276](https://github.com/kubernetes/kubernetes/pull/103276))
-   StatefulSet APIに `PersistentVolumeClaimDeletePoilcy` が追加されました。([#99378](https://github.com/kubernetes/kubernetes/pull/99378))
-   全probe(/readyz, /healthz, /livez)をPriority and Fairnessから免除するルールを追加しました。これにより、正常なkube-apiserverがkubeletによって再起動されるのを防ぎます。([#100678](https://github.com/kubernetes/kubernetes/pull/100678))
-   `kube-apiserver` に分散トレーシングを追加しました。Feature Gateの `APIServerTracing` から有効化できます。([#94942](https://github.com/kubernetes/kubernetes/pull/94942))
    -   :memo: ついに[KEP-647](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/647-apiserver-tracing)のOpenTelemetryによるAPIサーバの分散トレーシングが追加されました。今回Kubernetesのデフォルトサポートバージョンがetcd v3.5.0になりましたが、etcdの方にもv3.5.0よりトレーシング機能が追加されています。他のPull-Requestでetcdへcontextを渡す修正も入っているので、途切れることなくトレースできます。
-   Jobリソースに `.status.uncountedTerminatedPods` フィールドを追加しました。このフィールドは、job-controllerがJob Statusのカウンタ反映前の終了済みPodを記録するために利用します。job-controllerから生成されたPodは `batch.kubernetes.io/job-tracking` Finalizerを持ちます。なお、 `batch.kubernetes.io/job-tracking` アノテーションを持つJobの追跡は一時的なものです。2リリース後にこの機能はBetaとなり、このアノテーションはJobに設定されなくなります。([#98817](https://github.com/kubernetes/kubernetes/pull/98817))
    -   :memo: これは欲しかった人も多いと思われる[KEP-2307](https://github.com/alculquicondor/enhancements/tree/a6bc41629b4b5ec3894f5ca3136e3ef45a5f01d1/keps/sig-apps/2307-job-tracking-wihout-lingering-pods)の便利?機能です。今まではJobが終了するまで終了済みPodが削除されなかったため、大量のPodを走らせるJobなどで問題になっていました。この変更により、終了済みPodを残さなくてもJobのステータス管理できるようになりました。前々回のリリースでポーリング式からControllerらしい実装となったCronJob Controller v2が入り、ココらへんの改善が入ってきたのは嬉しいですね。
-   Alpha機能のswapがサポートされました。この機能は、Kubernetes Nodeの `NodeSwapEnabled` フラグから有効にできます。詳しくは[KEP-2400](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/2400-node-swap/README.md#design-details)を参照ください。([#102823](https://github.com/kubernetes/kubernetes/pull/102823))
-   Ephemeral ContainerがPodとことなる `securityContext` を設定できるようになりました。クラスタでこの機能を利用する前に、クラスタ管理者はSecurity Policyコントローラが `EphemeralContainers` をサポートしていることを確認してください。([#99023](https://github.com/kubernetes/kubernetes/pull/99023))
-   Execプラグインの作成者は、kubeconfigの `interactiveMode` フィールドを利用してデフォルトの標準入力の処理を変更できるようになりました。([#99310](https://github.com/kubernetes/kubernetes/pull/99310))
    -   :memo: いままでclient-goは標準出力がターミナルであればインタラクティブな標準入力を受け付ける挙動をしていましたが、スクリプト内で実行する際に問題になっていたため、pluginがハンドリングできるようになりました。
-   ラベルセレクタのパース方法を改善しました。([#102188](https://github.com/kubernetes/kubernetes/pull/102188))
-   StatefulSets に `minReadySeconds` APIが追加されました。([#100842](https://github.com/kubernetes/kubernetes/pull/100842))
-   現在提供されている Impersonate-User, Impersonate-Group, Impersonate-Extraと同じように、 `Impersonate-Uid` ヘッダを利用してimpersonateユーザをUIDから指定できるようになりました。
-   kube-apiserverに `--service-account-issuer` フラグを複数指定できるようになりました。これにより、無停止でissuerを変更できます。([#101155](https://github.com/kubernetes/kubernetes/pull/101155))
-   HeapsterによるHPAをサポートするkube-controller-managerの `--horizontal-pod-autoscaler-use-rest-clients` フラグが削除されました。このフラグは1.12から非推奨になっていました。([#90368](https://github.com/kubernetes/kubernetes/pull/90368))
-   Suggested API Priorityに `node-high` が追加されました。([#101151](https://github.com/kubernetes/kubernetes/pull/101151))
    -   :memo: コントロールプレーンの高負荷時にkubeletがstatusのレポートもできなくなると困るということで、node-highというより優先度の高いレベルが追加されました。
-   StatefulSet APIに追加されていた `PersistentVolumeClaimDeletePoilcy` がrevertされました。([#103747](https://github.com/kubernetes/kubernetes/pull/103747))
-   Server Side Apply(SSA)が全てのSelectorフィールドをアトミックに扱うようになりました(つまり、Selectorは単一のwriterによって管理されます)。これらのフィールドには、直感的にマージできない依存関係のあるフィールドが含まれています。([#97989](https://github.com/kubernetes/kubernetes/pull/97989))
-   CertificateSigningRequest.certificates.k8s.io APIがexpirationSecondsフィールドをサポートしました。これにより、クライアントは証明書の発行時に期間をリクエストできます。デフォルトの実装では、kubernetes controller-managerは `--cluster-signing-duration` フィールドを超えない範囲でこの値を尊重します。([#99494](https://github.com/kubernetes/kubernetes/pull/99494))
-   EndpointSlice Mirroring controllerがEndpointSlicesを更新するために、kubectlにより生成された `last-applied-configuration` アノテーションをミラーしなくなりました。([#102731](https://github.com/kubernetes/kubernetes/pull/102731))
-   Pod specの `TerminationGracePeriodSeconds` とコンテナのprobeに負の値を設定しないでください。負の値を設定した場合、削除時には `1s` として扱われます。イミュータブルフィールドのバリデーションはこの負の値を更新するために緩和されます。将来的には負の値を許可しなくなります。([#98866](https://github.com/kubernetes/kubernetes/pull/98866))
-   サブリソースの `pod/eviction` がpolicy/v1beta1に加えてpolicy/v1も受け入れるようになりました。([#98866](https://github.com/kubernetes/kubernetes/pull/98866))
-   podAffinity, NamespaceSelector, CrossNamespaceAffinityの機能がBetaに昇格し、デフォルト有効になりました。([#101496](https://github.com/kubernetes/kubernetes/pull/101496))
-   全Scalableリソースの `scale` サブリソースOwnerを記録するようになります。(例: Deployment, ReplicaSet, StatefulSet, ReplicationController, Custom Resources) ([#98377](https://github.com/kubernetes/kubernetes/pull/98377))


# :sparkle: Features (機能追加)

-   APIServerTracingがetcdクラインアントの呼び出しをspanとして収集し、etcdへcontextを伝搬するようになりました。([#103216](https://github.com/kubernetes/kubernetes/pull/103216))
-   APIServerTracingがAdmission Webhookへのリクエストspanとして収集するようになりました。([#103601](https://github.com/kubernetes/kubernetes/pull/103601))
-   JSONロギングフォーマットがKubernetesのCoreコンポーネント以外でデフォルト無効になります。([#102869](https://github.com/kubernetes/kubernetes/pull/102869))
-   kubernetes-apiserverに `--feature-gates=PodSecurity=true` フラグを渡すとPodSecurity機能が有効になります。この機能を有効にするとNamespaceラベルを使用可能なPodを制御できます。詳しくは[KEP-2579](https://git.k8s.io/enhancements/keps/sig-auth/2579-psp-replacement)を参照してください。 ([#103099](https://github.com/kubernetes/kubernetes/pull/103099))
-   controller-managerのためのリーダーマイグレーションがBetaになりました。([#103533](https://github.com/kubernetes/kubernetes/pull/103533))
-   EventのField Selectorの生成にBuilder関数を利用できるようになりました。([#101817](https://github.com/kubernetes/kubernetes/pull/101817))
-   CVEに対応するため、以下のイメージを更新しました:
    -   `debian` to v1.8.0
    -   `debian-iptables` to v1.6.5
    -   `setcap` to v2.0.3 ([#103235](https://github.com/kubernetes/kubernetes/pull/103235))


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

-   Lease ControllerにJitter係数を追加しました。これにより、kube-apiserverの負荷がより適切に処理されます。([#101652](https://github.com/kubernetes/kubernetes/pull/101652))
    -   :memo: P&Fが導入された後にAPI呼び出しのレイテンシが劣化しましたが、根本原因はP&FではなくNodeのleaseによるスパイクだったようです。Leaseにjitterを入れることで、API呼び出しを分散してスパイクを緩和したようです。
-   大きなCRDを更新/適用する際のパフォーマンスのリグレッション問題を修正しました。 ([#103318](https://github.com/kubernetes/kubernetes/pull/103318))
-   SSAによるクライアント側でのAnnotation適用において、Annotationのサイズ制限を考慮するようになりました。また、opt-outの挙動をクライアント側でのAnnotation適用で空文字列を設定することで対応しています。([#102105](https://github.com/kubernetes/kubernetes/pull/102105))
-   YAMLドキュメントのセパレータ("&#x2014;")の同じ行に対して、空白やコメント("# &#x2026;.")を設定できるようになりました。この修正では、コメントが続くセパレータを無視するバグが修正されています。また、コメント以外が同じ行に続く場合はエラーを返します。([#103457](https://github.com/kubernetes/kubernetes/pull/103457))


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

-   Fake clientsが `FakeClient` interfaceに実装されました。 ([#100940](https://github.com/kubernetes/kubernetes/pull/100940))
    -   :memo: trackerにアクセスするためのTracker()関数ををDynamicFakeClientに追加する変更([#100085](https://github.com/kubernetes/kubernetes/pull/100085))の続きの修正で、DynamicFakeClientが実装するinterfaceとなるFakeClientが追加されています。
-   golang.org/x/netパッケージがv0.0.0-20210520170846-37e1c6afe023に更新されました ([#103176](https://github.com/kubernetes/kubernetes/pull/103176))


[^1]: SSAについての詳しい解説は[公式ブログ](https://kubernetes.io/blog/2021/08/06/server-side-apply-ga/)で公開されています