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

## はじめに

Kubernetes v1.26がリリースされました 🎉

SIG-APIの目玉はWebhookなしに手軽なバリデーションを可能にするValidatingAdmissionPolicyです。その他にも運用に便利な改善が色々入っています。また、前リリースで見送られたclient-goのGCP/Azureのauthプラグインがついに削除されました。

いままでKEPを探したい時はenhansmentsのリポジトリ内をtext検索する必要がありましたが、公式の[KEPの検索ページ](https://www.kubernetes.dev/resources/keps/)が公開されました。便利なのでオススメです。

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


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

📝 `flowcontrol.apiserver.k8s.io/v1beta1` と `autoscaling/v2beta2` が削除されました。マイグレーション方法については [Deprecated API Migration Guide](https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-26) を参照してください。

-   Kube-apiserverの `--master-service-namespace` フラグが非推奨になりました。1.27で削除予定です。([#112797](https://github.com/kubernetes/kubernetes/pull/112797))
-   CLIフラグの `pod-eviction-timeout` が非推奨になりました。 `enable-taint-manager` と共にv1.27で削除予定です。([#113710](https://github.com/kubernetes/kubernetes/pull/113710))
-   `gcp` と `azure` の認証プラグインが `client-go` と `kubectl` から削除されました。各クラウド用の代替手段については [kubelogin](https://github.com/Azure/kubelogin) と [Kubectl Auth Changes in GKE](https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke) を参照してください。([#112341](https://github.com/kubernetes/kubernetes/pull/112341))
    -   📝 前回の1.25で削除予定でしたが、バグが発見されたため1.26に延期されました。これに伴いAzureの認証にはkubelogin、GKEの認証にはgke-gcloud-auth-pluginが使われます。


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

-   新しい拡張ポイントの `preEnqueue` がスケジューラコンポーネントの設定(`v1beta2/v1beta3/v1`)に追加されました。([#113275](https://github.com/kubernetes/kubernetes/pull/113275))
-   `ResourceClaim` APIが追加されました。(FeatureGate `DynamicResourceAllocation` の `resource.k8s.io/v1alpha1` APIグループ)。新しいAPIは既存のデバイスプラグインより柔軟になりました。Pods単位で専用リソースへのリクエストを許可していましたが、Nodeやクラスタ、その他実装したモデルのレベルに対応可能になりました。([#111023](https://github.com/kubernetes/kubernetes/pull/111023))
    -   📝 Dynamic resource allocationはk8sのworkloadの用途が増えるに伴い、リソースも従来のRAM/CPUだけでなく他のハードウェアも考慮したスケジューリングが必要だよね。ということで進められている機能です。詳しくは [KEP-3063](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/3063-dynamic-resource-allocation) を参照してください。公式ブログもでてます。-> [Kubernetes 1.26: Alpha API For Dynamic Resource Allocation](https://kubernetes.io/blog/2022/12/15/dynamic-resource-allocation/)
-   コンテナのライフサイクルハンドラのうち、 `httpGet` を利用する `preStop` と `postStart` が特定の `scheme` と `header` フィールドを尊重するようになりました。これにより、カスタムヘッダやスキーマがHTTPSへ変更可能です。コンテナのstartup/readiness/liveness probeとの一貫性が保てるようになります。互換性を保つため、ライフサイクルハンドラが `scheme: HTTPS` でエラーを検出した場合、HTTPにフォールバックします。その際、該当Podの `LifecycleHTTPFallback` イベントとして記録されます。また、kubeletの `kubelet_lifecycle_handler_http_fallbacks_total` メトリクスもカウントアップします。本機能を無効化したい場合は、kubeletに `--feature-gates=ConsistentHTTPGetHandlers=false` フラグを設定してください。([#86139](https://github.com/kubernetes/kubernetes/pull/86139))
-   `JobTrackingWithFinalizers` がstableになりました。この機能が有効になるまえに作成されたJobはfinalizerのトラック対象ではありません。batch.kubernetes.io/job-tracking annotationを持つJobのみがfinalizerによるトラック対象です。付与済みのこのannotationをユーザが消した場合も、control planeによって再度追加されます。また、 `batch.kubernetes.io/job-tracking` annotationは非推奨になりました。v1.27以降では無視されます。新規Jobへのannotation追加もされません。([#113510](https://github.com/kubernetes/kubernetes/pull/113510))
-   `podTopologySpread` プラグインの `NodeInclusionPolicy` がデフォルト有効になりました。([#113500](https://github.com/kubernetes/kubernetes/pull/113500))
-   `PodDisruptionBudget` にAlphaバージョンの `spec.unhealthyPodEvictionPolicy` フィールドが追加されました。api-serverの `PDBUnhealthyPodEvictionPolicy` feature-gate が有効な場合、このフィールドに `"AlwaysAllow"` を設定すると現在のHealthステータスにかかわらず、Ready条件を持たないPodもevictされます。([#113375](https://github.com/kubernetes/kubernetes/pull/113375))
    -   📝 RunnningだけどHelthになるまでちょっと時間がかかるPodを退避したいけど、PDBでブロックされるのでHealth条件無視したいみたいなケースが稀にあるので嬉しい機能ですね。詳しくは [KEP-3017](https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3017-pod-healthy-policy-for-pdb) を参照してください。
-   今後は、利用時にAPIオブジェクトに指定されている `metav1.LabelSelectors` の値が不正な値が含まれていないかバリデーションされます。既存の不正なオブジェクトはアップデート可能ですが、新規作成するオブジェクトは正しいラベルセレクタが必要です。([#113699](https://github.com/kubernetes/kubernetes/pull/113699))
    -   📝 validationしてるコードは[ここ](https://github.com/liggitt/kubernetes/blob/fc69084bf1fd32e55256795a6db7a74d75679d8b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go#L56)です。
-   Aggregated Discoveryがアルファになりました。Featureフラグの `AggregatedDiscoveryEndpoint` から有効にできます。([#113171](https://github.com/kubernetes/kubernetes/pull/113171))
    -   📝 詳しくは[KEP-3352](https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/3352-aggregated-discovery/README.md)参照してください。
-   コードのコメント内でCFS quotaを100msであることを明確化し、Linux kernelに沿うよう `cpuCFSQuotaPeriod` の最小値を1msに設定しました。([#112123](https://github.com/kubernetes/kubernetes/pull/112123))
-   component-baseとclient-goにあるLeaderElectionConfigurationのバリデーションロジックに一貫性をもたせました。([#111758](https://github.com/kubernetes/kubernetes/pull/111758))
-   Horizontal Pod Autoscalerコントローラのworker数を設定できるように `kube-controller-manager` が `--concurrent-horizontal-pod-autoscaler-syncs` フラグをサポートしました。([#108501](https://github.com/kubernetes/kubernetes/pull/108501))
    -   📝 デフォルトworker数として5が設定されています。
-   Priority And Fairnessのv1beta3を導入しました。これに伴い、API仕様に以下の変更を加えます。([#112306](https://github.com/kubernetes/kubernetes/pull/112306))
    -   spec.limited配下のassuredConcurrencySharesを `nominalConcurrencyShares` に名称変更。
    -   flowschemaとprioritylevelconfigurationsの `Conditions` にstrategic merge patchのannotationを適用。
-   Validating Admission PoliciesとCEL expressionによる拡張Admission Control(KEP-3488: CEL for Admission Control)用に `v1alpha1` APIを導入しました。これを利用するには、feature gateの `ValidatingAdmissionPolicy` と `--runtime-config` から `admissionregistration.k8s.io/v1alpha1` APIを有効化してください。([#113314](https://github.com/kubernetes/kubernetes/pull/113314))
    -   📝 CustomResourceにCELでバリデーション機能はすでに提供されていましたが、この機能によりDeploymentなどその他リソースにも(Webhookを実装せずに)手軽にバリデーションを設定できるようになりました。詳しくは[KEP-3488](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/3488-cel-admission-control)を参照してください。使い方については[公式ブログ](https://kubernetes.io/blog/2022/12/20/validating-admission-policies-alpha/)にも記載されています。
-   自動リロード有効時に、KMSの設定で重複する名前が利用されているかのバリデーションが追加されました。APIサーバの `--encryption-provider-config-automatic-reload` フラグによりencryption設定の自動リロードを有効にしている場合、encryption設定内の全てのKMSプロバイダ名(v1 & v2)がユニークである必要があります。([#113697](https://github.com/kubernetes/kubernetes/pull/113697))
-   kubeletの外部credentialプロバイダ機能がGAになりました。Credential Provider Plugin と Credential Provider Config APIsが `v1beta1` から `v1` に変更されています。([#111616](https://github.com/kubernetes/kubernetes/pull/111616))
-   Protobufシリアイゼーションの metav1.MicroTime タイムスタンプ(`Lease` と `Event` API objectで利用されている)がマイクロ秒の精度で切り捨てられるようになりました。これは、ドキュメント上のJSON/YAMLシリアイゼーションの挙動にあわせたものです。既存のデータもetcdから読み込まれる時にマイクロ秒に切り捨てられます。([#111936](https://github.com/kubernetes/kubernetes/pull/111936))
-   feature gateの `EndpointSliceTerminatingCondition` がGAに昇格しました。feature gateからはv1.28で削除予定です。 ([#113351](https://github.com/kubernetes/kubernetes/pull/113351))
-   feature gateから `DynamicKubeletConfig` が削除されました。Dynamic kubelet reconfigurationはこの機能に依存している古いノードでも利用できなくなりました。これは、Kubernetesのversion skewポリシに則ったものです。([#112643](https://github.com/kubernetes/kubernetes/pull/112643))
    -   📝 Kubernetes version skewポリシについては[公式ドキュメント](https://kubernetes.io/ja/docs/setup/release/version-skew-policy/)参照してください。


## ✨ Features (機能追加)

-   `APIServerIdentity` 機能がベータに昇格しました。 `kube-apiserver` はデフォルトで `kube-system` namespaceにLeaseを作るようになります。これらのLeaseオブジェクトはクラスタ内のアクティブなAPIサーバ数の識別に利用できます。将来的にはStorage Version APIに利用される予定です。([#113629](https://github.com/kubernetes/kubernetes/pull/113629))
    -   📝 k8s v1.20で追加された[KEP-1965](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/1965-kube-apiserver-identity)のAPIServerIdentityがベータに昇格しました。この機能は、[KEP-2339](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2339-storageversion-api-for-ha-api-servers)のStorage Version APIのHA構成のAPIサーバ対応に利用される予定です。現在のStorage Versionについては、[そのクラスタ本当にアップグレードして大丈夫？ Storage Version の更新も忘れずにしよう！](https://speakerdeck.com/uesyn/k8s-storage-version-migration) を参照してください。
-   kubeconfigのcluster info設定に `DisableCompression` フラグが追加されました(デフォルトfalse)。 `true` が設定された場合、クライアントはAPIサーバに対する全てのリクエストレスポンスの圧縮を無効化します。この機能は、client-server間の帯域幅が十分(>300MB/s)場合や、serverがCPU制約を受けている場合においてList時のレイテンシを大きく改善します。([#112309](https://github.com/kubernetes/kubernetes/pull/112309))
    -   📝 gzipのレベルとAPIサーバの負荷について検証したドキュメントは[こちら](https://docs.google.com/document/d/1rMlYKOVyujboAEG2epxSYdx7eyevC7dypkD_kUlBxn4/edit#heading=h.4szsdjv6proq)。
-   SLIメトリクスがAPIサーバの `metrics/slis` で公開されました。([#112741](https://github.com/kubernetes/kubernetes/pull/112741))
    -   📝 詳しくは [Kubernetes コンポーネントの Service Level Indicator (SLI) メトリクス - Qiita](https://qiita.com/watawuwu/items/9259782239976825d287#kubernetes-%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE-service-level-indicator-sli--%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9) 参照してください。
-   client-goの `SharedInformerFactory` がシャットダウン中にgoroutineを待つようになりました。([#112200](https://github.com/kubernetes/kubernetes/pull/112200))
-   kube-apiserver: ネットワークの帯域と引き換えに(10-50% higher)、大きなlist呼び出しのレイテンシを改善するため、 `gzip` 圧縮がレベル4から1に変更されました。これにより、ページしていない非常に大きなList呼び出しがリクエストタイムアウトの制限を超えるまでの猶予増えました。([#112299](https://github.com/kubernetes/kubernetes/pull/112299))
-   feature gateの `LegacyServiceAccountTokenNoAutoGeneration` がGAに昇格しました。 ([#112838](https://github.com/kubernetes/kubernetes/pull/112838))
-   feature gateの `LegacyServiceAccountTokenTracking` (alpha) が有効の場合、secretベースのService Accountトークンは最後に利用した時間が `kubernetes.io/legacy-token-last-used` に記録されます。([#108858](https://github.com/kubernetes/kubernetes/pull/108858))


## 🐛 Bug or Regression (バグ修正)

-   `golang.org/x/net` のバージョンが `v0.1.1-0.20221027164007-c63010009c80` に上りました。([#112693](https://github.com/kubernetes/kubernetes/pull/112693))
-   呼び出し元が `DelegatingAuthenticationOptions` の `DisableAnonymous` を使ってAnonymousの認証を無効化できるようになりました。([#112181](https://github.com/kubernetes/kubernetes/pull/112181))
-   Etcdがv3.5.5にアップデートされました。([#112489](https://github.com/kubernetes/kubernetes/pull/112489))
-   Priority and Fairnessにおいて、Service Accountのトークン作成コスト見積りを修正しました。([#113206](https://github.com/kubernetes/kubernetes/pull/113206))
-   Priority and Fairnessにおいて、 `metadata.name` が指定されたListリクエストのコストを修正しました。([#112557](https://github.com/kubernetes/kubernetes/pull/112557))
-   kube-apiserver: Custom Resourceを `--encryption-provider-config` フラグに指定すると、etcdに暗号化して保存できるようになりました。([#113015](https://github.com/kubernetes/kubernetes/pull/113015))
-   kube-apiserver: デフォルトでバックエンドからリダイレクトレスポンスが返されなくなりました。リダイレクトレスポンスの転送するには `--aggregator-reject-forwarding-redirect=false` フラグを設定してください。([#112193](https://github.com/kubernetes/kubernetes/pull/112193))
-   kube-apiserver: Aggregated APIサーバーからの `304 Not Modified` レスポンスを内部エラーとして扱うリグレッションを修正しました。([#112526](https://github.com/kubernetes/kubernetes/pull/112526))
-   削除レスポンスに含まれる `ResourceVersion` は、削除イベントに含まれる `ResourceVersion` と一致するようになりました。([#113369](https://github.com/kubernetes/kubernetes/pull/113369))
-   `kube-scheduler` と `kube-controller-manager` がPodの中断条件の設定にserver-side applyを利用するようになりました。([#113304](https://github.com/kubernetes/kubernetes/pull/113304))
-   `k8s.io/apimachinery/pkg/api/meta` のエラーがwrapされた時も含め `stdlibs` `errors.Is` のマッチングに対応しました。([#111808](https://github.com/kubernetes/kubernetes/pull/111808))
-   CVE-2022-32149の対応のため、 `golang.org/x/text` が `v0.3.8` に更新されました。 ([#112989](https://github.com/kubernetes/kubernetes/pull/112989))
-   CVE-2021-25743の対応のため、 `kubectl` が出力のTerminal特殊文字をエスケープするようになりました。([#112553](https://github.com/kubernetes/kubernetes/pull/112553))


## 🔬 Others (その他修正)

-   feature gateのCEL in Admission Controlが `ValidatingAdmissionPolicy` に名称変更されました。([#113735](https://github.com/kubernetes/kubernetes/pull/113735))
-   in-tree クラウドプロバイダのOpenStack(cinder volumeプロバイダも含む)が削除されました。代わりに、外部のクラウドプロバイダとcsiドライバ([cloud-provider-openstack](https://github.com/kubernetes/cloud-provider-openstack))を利用してください。 ([#67782](https://github.com/kubernetes/kubernetes/pull/67782))