Kubernetes 1.26: SIG-Auth の変更内容

## はじめに

このページではKubernetes v1.26におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 [Kubernetes 1.26: 変更点まとめ](https://qiita.com/uesyn/items/d663d1ad7a61706be0d0) も合わせて参照してみてください。

:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

## Changes by Kind
### Deprecation

- client-goとkubectlから`gcp`と`azure` auth pluginが取り除かれました。クラウド固有の変更内容の詳細は[kubelogin](https://github.com/Azure/kubelogin)と[Kubectl Auth Changes in GKE](https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke?hl=en)を参照してください。 ([#112341](https://github.com/kubernetes/kubernetes/pull/112341), [@enj](https://github.com/enj))

### API Change

- `ResourceClaim` API(`DynamicResourceAllocation` feature gate のもので `resource.k8s.io/v1alpha1` API group)が追加されました。新しいAPIはPodが特別な種類のリソースを要求できるようになり、Nodeやクラスタその他実装したモデルで利用できるようになり、既存のDevice Pluginよりも柔軟になりました。 ([#111023](https://github.com/kubernetes/kubernetes/pull/111023), [@pohly](https://github.com/pohly)) 

- `httpGet`を利用するコンテナのライフサイクルハンドラ `preStop`と`postStart`は特定の`scheme`と`header`フィールドを尊重します。これによりカスタムヘッダの設定や`HTTPS`へのschemeの変更ができ、コンテナの startup/readiness/liveness probe機能と整合性がとれます。以前のリリースとの互換性のため、`scheme: HTTPS`で設定されたライフサイクルハンドラでHTTPを使っていることを示すエラーが発生するとHTTPでリクエストするようにフォールバックします。これが起こった場合、`LifecycleHTTPFallback` イベントがPodのnamespaceに記録され、kubeletの`kubelet_lifecycle_handler_http_fallbacks_total` メトリックが増加するようになりました。クラスタ管理者はkubeletで`--feature-gates=ConsistentHTTPGetHandlers=false`を設定することで機能のオプトアウトが可能です。([#86139](https://github.com/kubernetes/kubernetes/pull/86139), [@jasimmons](https://github.com/jasimmons)) 

- `PodDisruptionBudget`はalphaの`spec.unhealthyPodEvictionPolicy`を追加しました。`kube-api-server`で`PDBUnhealthyPodEvictionPolicy` feature-gateが有効なときにこのフィールドを`AlwaysAllow`に設定すると、`PodDisruptionBudget`が有効かどうかにかかわらずready conditionを持たないpodをevictさせることができるようになります。([#113375](https://github.com/kubernetes/kubernetes/pull/113375), [@atiratree](https://github.com/atiratree))

- APIオブジェクトで指定される`metav1.LabelSelectors`は利用時にエラーとなる不正なlabel値を含んでいないことを保証するために検証されます。([#113699](https://github.com/kubernetes/kubernetes/pull/113699), [@liggitt](https://github.com/liggitt))

- 自信のsubject attributesを取得するためのauth API(selfsubjectrevies API)を追加しました。対おうするkubectlコマンドは - `kubectl auth whoami` です。([#111333](https://github.com/kubernetes/kubernetes/pull/111333), [@nabokihms](https://github.com/nabokihms)) 

> :pencil2: [KEP-3325: Auth API to get self user attributes](https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3325-self-subject-attributes-review-api)

- Aggregated discoveryはalphaになり、`AggregatedDiscoveryEndpoint` feature flagで切り替えできます。([#113171](https://github.com/kubernetes/kubernetes/pull/113171), [@Jefftree](https://github.com/Jefftree))

- "Retriable and non-retriable pod failures for jobs" (PodDisruptionConditions) 機能がbetaになりました。([#113360](https://github.com/kubernetes/kubernetes/pull/113360), [@mimowo](https://github.com/mimowo)) 

- admission policiesを検証するv1alpha1 APIを導入し、CEL expression(KEP 3488: CEL for Admission Control)による拡張admission controlを有効にします。使用するには、`ValidatingAdmissionPolicy` feature gate と`--runtime-config`で`admissionregistration.k8s.io/v1alpha1`を有効にしてください。([#113314](https://github.com/kubernetes/kubernetes/pull/113314), [@cici37](https://github.com/cici37)) 

> :pencil2: @uesyn さんが詳しい記事を書いてくれています。 https://qiita.com/uesyn/items/de3343d657bc4d0b0d8f 

- KMS: configのauto reloadが有効な場合にkms configの名前の重複を検証します。APIサーバの `--encryption-provider-config-automatic-reload` フラグによりencryption configのauto reloadを有効にしている場合、encryption config内の全てのKMSプロバイダ名(v1 & v2)がユニークである必要があります。([#113697](https://github.com/kubernetes/kubernetes/pull/113697), [@aramase](https://github.com/aramase))

> :pencil2: v1.26では設定ファイルの自動リロードが実装されました.
> https://github.com/kubernetes/kubernetes/pull/112050

- `DynamicKubeletConfig` feature gateがAPIサーバから削除されました。Dynamic kubelet reconfigurationは古いノードがこの機能に依存していたとしても利用できなくなります。これは、Kubernetesのversion skewのpolicyに則ったものです。([#112643](https://github.com/kubernetes/kubernetes/pull/109525), [@SergeyKanzhelev](https://github.com/jonyhy96)) 

### Feature

- Pod Security admission: pod-securityの`warn` levelのデフォルトが`enforce` levelの値になりました。([#113491](https://github.com/kubernetes/kubernetes/pull/113491), [@tallclair](https://github.com/tallclair)) 

> :pencil2: enforce levelが設定されており、warn levelが設定されていない場合にenforce levelの値がwarn levelの値になります。enforce-version, warn-versionも同じような挙動と思われます。
> https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces

- `DelegateFSGroupToCSIDriver` 機能がGAになりました。([#113225](https://github.com/kubernetes/kubernetes/pull/113225), [@bertinatto](https://github.com/bertinatto)) 

- 新しい `DisableCompression` フィールド (default=false)がkubeconifgのcluster info配下に追加されました。trueにセットすると、kubeconfigを使用しているクライアントは、apiserverへのすべてのリクエストに対してレスポンス圧縮をオプトアウトします。これはクライアントとサーバのネットワーク帯域に余裕がある(>30MB/s)場合や、サーバがCPU制約がある場合にlist callのレイテンシを大幅に改善することができます。([#112309](https://github.com/kubernetes/kubernetes/pull/112309), [@shyamjvs](https://github.com/shyamjvs))

- API Server Tracingに様々な新しいspanやspan evnetsが追加されました。 ([#113172](https://github.com/kubernetes/kubernetes/pull/113172), [@dashpole](https://github.com/dashpole))

- API Server tracingのopentelemetryのためのroot span nameをKubernetesAPIからHTTP GETに変更されました。([#112545](https://github.com/kubernetes/kubernetes/pull/112545), [@dims](https://github.com/dims)) 

- Golangのruntimeに関連した新しいメトリクスをKuberentesコンポーネントに追加しました。([#111910](https://github.com/kubernetes/kubernetes/pull/111910), [@tosi3k](https://github.com/tosi3k))
  - go_gc_cycles_automatic_gc_cycles_total
  - go_gc_cycles_forced_gc_cycles_total
  - go_gc_cycles_total_gc_cycles_total
  - go_gc_heap_allocs_by_size_bytes
  - go_gc_heap_allocs_bytes_total
  - go_gc_heap_allocs_objects_total
  - go_gc_heap_frees_by_size_bytes
  - go_gc_heap_frees_bytes_total
  - go_gc_heap_frees_objects_total
  - go_gc_heap_goal_bytes
  - go_gc_heap_objects_objects
  - go_gc_heap_tiny_allocs_objects_total
  - go_gc_pauses_seconds
  - go_memory_classes_heap_free_bytes
  - go_memory_classes_heap_objects_bytes
  - go_memory_classes_heap_released_bytes
  - go_memory_classes_heap_stacks_bytes
  - go_memory_classes_heap_unused_bytes
  - go_memory_classes_metadata_mcache_free_bytes
  - go_memory_classes_metadata_mcache_inuse_bytes
  - go_memory_classes_metadata_mspan_free_bytes
  - go_memory_classes_metadata_mspan_inuse_bytes
  - go_memory_classes_metadata_other_bytes
  - go_memory_classes_os_stacks_bytes
  - go_memory_classes_other_bytes
  - go_memory_classes_profiling_buckets_bytes
  - go_memory_classes_total_bytes
  - go_sched_goroutines_goroutines
  - go_sched_latencies_seconds

- apiserverの`metrics/slis`にヘルスチェックのSLIメトリクスを公開しました。([#112741](https://github.com/kubernetes/kubernetes/pull/112741), [@logicalhan](https://github.com/logicalhan))

- `LegacyServiceAccountTokenNoAutoGeneration` feature gateがGAに昇格しました。([#112838](https://github.com/kubernetes/kubernetes/pull/112838), [@zshihang](https://github.com/zshihang)) 

> :pencil2: v1.24からbetaでデフォルト有効になっていたSecretベースのService Account Tokenの作成機能がGAになりました。

- alphaの`LegacyServiceAccountTokenTracking`を有効にすると、SecretベースのService Account Tokenに最後に使った日付を含む`kubernetes.io/legacy-token-last-used`が適用されるようになります。([#108858](https://github.com/kubernetes/kubernetes/pull/108858), [@zshihang](https://github.com/zshihang)) 

> :pencil2: `serviceaccount_legacy_tokens_total`と用途が似ている気がするが、metricはSecretベースのTokenを受け取った際にカウントされるもの。今回のものは使う側で最後に使った時刻が記録されるもの。の違いがある気がします。
> 
> 次のバージョンのv1.27でBeta予定。
> またv1.27では`LegacyServiceAccountTokenCleanUp`がalphaで提供される予定。
> see: [KEP-2799: Reduction of Secret-based Service Account Tokens](https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/2799-reduction-of-secret-based-service-account-token#legacyserviceaccounttokennoautogeneration)

- v1.24でGAとなり無条件で有効である`CSRDuration` feature gateはv1.26で削除されます。([#112386](https://github.com/kubernetes/kubernetes/pull/112386), [@Shubham82](https://github.com/Shubham82)) 

- `kubectl config view`はdatapolicy tagでマークされたシークレットフィールドを保護するようになりました。([#109189](https://github.com/kubernetes/kubernetes/pull/109189), [@mpuckett159](https://github.com/mpuckett159)) 

### Documentation

### Bug or Regression

- `golang.org/x/net`を`v0.1.1-0.20221027164007-c63010009c80`に上げました。([#112693](https://github.com/kubernetes/kubernetes/pull/112693), [@aimuz](https://github.com/aimuz)) 

- `DelegatingAuthenticationOptions`を使っている呼び出し側が呼び出し元が`DisableAnonymous`を使ってAnonymous認証を無効化できるようになりました([#112181](https://github.com/kubernetes/kubernetes/pull/112181), [@xueqzhan](https://github.com/kubernetes/kubernetes/pull/112181))

- exec authを使っているときにkubectlで大量のオブジェクトを扱うと、適切でない接続管理により引き起こされるエフェメラルポート枯渇の不具合を修正しました。([#112017](https://github.com/kubernetes/kubernetes/pull/112017), [@enj](https://github.com/enj))

- `PodDisruptionConditions` feature gateが有効な場合に、`NoExecute`でtaintされたノードPodが実行し続けられるようにコードを修正しました。([#112518](https://github.com/kubernetes/kubernetes/pull/112518), [@mimowo](https://github.com/mimowo)) 

- `PodDisruptionConditions` feature gateが有効な場合、2min後にstale disruption conditionの状態を変更するために使われるdisruption controllerを修正しました。([#113580](https://github.com/kubernetes/kubernetes/pull/113580), [@mimowo](https://github.com/mimowo)) 

> :pencil2: 権限不足でpodのstatusを更新できなかった問題を修正していました(patch操作の許可)

- kube-apiserverで`--encryption-provider-config`ファイルでカスタムリソースを指定でき、etcdで暗号化できるようになりました。([#113015](https://github.com/kubernetes/kubernetes/pull/113015), [@ritazh](https://github.com/ritazh))

> :pencil2: `EncryptionConfiguration`を使ったオブジェクト暗号化でカスタムリリースを対象に指定しても暗号化できなかった問題があったようです。
> 
> If custom resources are added to EncryptionConfiguration and the cluster version is 1.26 or newer, any newly created custom resources mentioned in the EncryptionConfiguration will be encrypted. Any custom resources that existed in etcd prior to that version and configuration will be unencrypted until they are next written to storage. This is the same behavior as built-in resources. See the Ensure all secrets are encrypted section.
> https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration

- CVE-2022-32149に対する修正で`golang.org/x/text`を`v0.3.8`に更新しました。 ([#112989](https://github.com/kubernetes/kubernetes/pull/112989), [@ameukam](https://github.com/ameukam)) 

### Other (Cleanup or Flake)

- 新しいAPIサーバのflag`--encryption-provider-config-automatic-reload`が追加され、サーバ再起動の必要なく自動的にリロードされるようになりました。リロードが有効な場合すべてのKMS pluginsは`/healthz/kms-providers`で単一のhealthzチェックにマージされるようになりました。([#113529](https://github.com/kubernetes/kubernetes/pull/113529), [@enj](https://github.com/enj)) 

> :pencil2: 例えばローカルでシークレットを管理している場合もローテーション時の再起動が不要になりオペレーション負荷が軽減されるのではないかと思います。シークレットのローテーションする場合、新しいシークレットを末尾に追加(再起動)、新しいシークレットを先頭に変更(再起動)、再暗号化、古いシークレットの削除(再起動)のようなフローで設定変更のたびに再起動が必要でした。

- `test/e2e/framework`をリファクタリングしたことでcore frameworkが小さくなりました。リソース監視、ログサイズ監視、メトリクス収集、デバッグ情報出力などのオプショナルな起動は特定のe2eテストスイートでインポートする必要があります。従来core frameworkにあった機能を再有効化するためのInitパッケージ提供されています。このPRによってコンパイルできなくなったコードがある場合、コミットメッセージのスクリプトを使ってコードを更新することができます。([#112043](https://github.com/kubernetes/kubernetes/pull/112043), [@pohly](https://github.com/pohly)) 

- In-TreeのOpenStack cloud provider(とCinder volume provider)は削除されました。[cloud-provider-openstack](https://github.com/kubernetes/cloud-provider-openstack)のcloud providerとcsi driverを使ってください。([#67782](https://github.com/kubernetes/kubernetes/pull/67782), [@dims](https://github.com/dims))

## 所感

KMS v2に関する仕様の整理や作業がもう少し進んでいると思いましたが、今バージョンでは設定の自動リロード機能の追加ぐらい(?)でした。
see: https://github.com/orgs/kubernetes/projects/94/views/1

その他にはSecretベースのService Account Tokenの退役についての作業も進んできています。
v1.26現在でSecretベースのToken自動生成はデフォルトで止まっていますが、今バージョンから最終利用時間が記録されるようになりました。今後は記録された最終利用時間から十分に時間が経過したもの(かつPodから参照されていないもの)を削除するような機能がリリースされる予定となっています。