Kubernetes 1.25: SIG-Auth の変更内容

## はじめに

このページではKubernetes v1.25におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの内容から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.25: 変更点まとめの記事も合わせて参照してみてください。

今回はPod SecurityのGAやv1.24の[記事](https://qiita.com/hiyosi/items/b46d8bc62a103179374c)で紹介したKMS v2が早くもalpha機能として追加されたことが注目ポイントです。

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

## Changes By Kind

### Deprecation
- DeprecatedになっていたAPIサーバの `--service-account-api-audiences` フラグが削除されました。`--api-audiences`を代わりに使ってください。 ([#108624](https://github.com/kubernetes/kubernetes/pull/108624))

> :pencil: 
> KubernetesのSA Token認証ではこのフラグで指定された値がTokenの`aud` claimに少なくとも１つ含まれていることを検証します。
> デフォルトは `--service-account-issuer`のURLを含んだ単一のリストです。明示的に指定している場合はflagを移行する必要があります。

- v1.19から非推奨となったalphaのseccompアノテーション `seccomp.security.alpha.kubernetes.io/pod`と`container.seccomp.security.alpha.kubernetes.io`のサポートの一部が削除されました。Kubeletはアノテーションをサポートしなくなり、Static Podでのアノテーションの使用はサポートされなくなました。また、seccompフィールドを持つPodが作成された際にseccompアノテーションが自動入力されなくなりました。アノテーションからのseccompフィールドの自動入力は、1.27 で削除される予定です。Podは、対応するPodまたはコンテナーの`securityContext.seccompProfile`フィールドを代わりに使用する必要があります。([#109819](https://github.com/kubernetes/kubernetes/pull/109819))

- gcpとazure auth pluginはclient-goとkubectlから削除されました。https://github.com/Azure/kubelogin と https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke を確認してください。([#110013](https://github.com/kubernetes/kubernetes/pull/110013))

- 1.21から非推奨となっていたbetaのPodSecurityPolicy admission pluginが削除されました。https://kubernetes.io/docs/tasks/configure-pod-container/migrate-from-psp/ の指示に従い組み込みのPodSecurity admission plugin(または別のサードパーティのwebhook)に移行してからv1.25にアップグレードしてください。([#109798](https://github.com/kubernetes/kubernetes/pull/109798))


### API Change

- KMS v2alpha1のサポートが追加されました ([#111126](https://github.com/kubernetes/kubernetes/pull/111126))

> :pencil:
> KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3299-kms-v2-improvements
> KEPでは複数の問題に対する改善が提案されています。
> - Performance
>   - Key Hierarchyの修正。v2ではDEKはPluginが持つLocal KEKで暗号され、Local KEKはKMSのRemote KEKで暗号化されます。
>   - これによりAPI Server再起動後などキャッシュが無い状態において大量のリクエストが発行される問題が改善されます
> - Rotation
>   - 下記のStatus APIから最新のKEKのKey IDを返却することでAPI Serverがローテーションに気づけるようになります
>   - v1.20からalphaになっている`StorageVersion API`の機能を使う感じ？
>   - 実装については次バージョンのv1.26が予定されています。
>   - Rotation部分の詳細は→のPRを参照してください https://github.com/kubernetes/enhancements/pull/3486
> - HealthCheck, Stauts
>   - 新しく追加されたStatus APIではLatest Key IDの検知の他にHealth状態も応答します。
> - Observebility
>   - 暗号化・複合化のリクエストにUIDフィールドが追加されました
>

- v1.25で、PodSecurity restricted levelは、Podに`.spec.os.name="windows"`を設定するPodにLinux固有のsecurityContextフィールドをセットする必要がなくなりました。1.25+のクラスタにv1.23以前のout-of-skewのノードが存在し、かつLinux固有のsecurityContextフィールドを引き続き必須としたい場合、Namespaceにラベル(e.g. `pod-security.kubernetes.io/enforce-version: v1.24`)を付与してv1.25以前の restricted バージョンが選択されるように設定してください。([#105919](https://github.com/kubernetes/kubernetes/pull/105919))

- PersistentVolumeの`spec.claimRef`の所有権のセマンティクスをatomicからgranularに変更しました。([#110495](https://github.com/kubernetes/kubernetes/pull/110495))

- 複数のClusterCIDRをサポートするNodeIPAMの導入(#2593)をalpha featureとして導入しました。 ([#109090](https://github.com/kubernetes/kubernetes/pull/109090))
  - feature gate `MultiCIDRRangeAllocator=true`を設定するとMultiCIDRRangeAllocatorコントローラを使用できるかどうかが決まり、下記のkube-controller-managerフラグはアクティブなコントローラを選択します。 
  - kube-controller-managerで`--cidr-allocator-type=MultiCIDRRangeAllocator`フラグを設定してMultiCIDRRangeAllocatorを有効化します。

- 設定されたpod failure policy rulesに従ってpod障害を処理するためのサポートを導入しました。([#111113](https://github.com/kubernetes/kubernetes/pull/111113))

- `DisruptionTarget` pod condition typeが導入されます. `reason` フィールドはpod停止の理由を示します: ([#110959](https://github.com/kubernetes/kubernetes/pull/110959))
  - PreemptionByKubeScheduler: kube-schedulerによるPodのpreempt
  - DeletionByTaintManager: NoExecute taintに起因するtaint managerによるPodの削除
  - EvictionByEvictionAPI: Eviction APIによるPodのevict
  - DeletionByPodGC: PodGCによる取り残されたPodの削除  

- PodSecurity admission pluginはGAになりデフォルト有効になりました。admission設定のバージョンが`security.admission.config.k8s.io/v1`に昇格しました。([#110459](https://github.com/kubernetes/kubernetes/pull/110459))

- `metadata.clusterName`フィールドは完全に削除されました。これはユーザに対して目に見える影響はないはずです。([#109602](https://github.com/kubernetes/kubernetes/pull/109602))

### Feature

- KMS v2alpha1 APIが追加されました。([#110201](https://github.com/kubernetes/kubernetes/pull/110201))

- Feature gate `CSIMigration`GAになりenabledに固定されました。feature gateはv1.27で削除されます。([#110410](https://github.com/kubernetes/kubernetes/pull/110410))

- `ServerSideFieldValidation`はbetaになりました。スキーマのバリデーションはサーバーサイドで行われ、デフォルトでは無効なフィールドや未知のフィールドがあると警告を受け取ります。([#110178](https://github.com/kubernetes/kubernetes/pull/110178))

- `PodSecurityContext`と`PodSecurityPolicy`はsysctlのセパレータとしてスラッシュをサポートします。([#106834](https://github.com/kubernetes/kubernetes/pull/106834))

- gcpとazure auth pluginはサポート範囲のkubectlのマイナーバージョンで https://issue.k8s.io/111911 が解決するまでclient-goとkubectlに対してリストアされました。([#111918](https://github.com/kubernetes/kubernetes/pull/111918))

> :pencil:
> #110013 で削除されたけどこのPRで元に戻された

### Documentation

- N/A

### Failing Test

- N/A

### Bug or Regression

- GCEの最新のファイアウォール機能であるpinhole firewallを追加し、ingress firewall-rulesにdestination-rangesを導入しました。ILBまたはNetLB経由のトラフィックのみを許可しバックエンドのIPへのアクセスを制限します。この変更は、既存のILBまたはNetLBの挙動を変更するものではありません。 ([#109510](https://github.com/kubernetes/kubernetes/pull/109510))

- AuthenticatedGroupAdderとキャッシュされたtoken authenticatorの間の認証時のdata競合の問題を修正([#109969](https://github.com/kubernetes/kubernetes/pull/109969))

- `--audit-log-path`で指定されたファイルの親ディレクトリが存在しない場合、Kuberentesはそのディレクトリを作成します。([#110813](https://github.com/kubernetes/kubernetes/pull/110813))

- APIのバリデーションでkey enciphermentのusageをオプショナルにしました。([#111061](https://github.com/kubernetes/kubernetes/pull/111061))

> :pencil:
> CSR APIでKey Enciphermentが必須なパラメータとして扱われていましたがkubeletが利用する鍵の種類によって(RSAor非RSA)で必須パラメータが区別されるようになります。v1.25ではこの区別はオプショナル扱いであり非RSA鍵の利用でEnciphermentを含んでいてもエラーになりませんが、v1.26からはエラーとして扱われるようです。
> 参考: https://github.com/golang/go/issues/36499

- Namespaceのeditorとadminが`leases.coordination.k8s.io`を作成できるようになりました。leaderelectionでは、configmapの代わりにleasesを利用してください。([#111472](https://github.com/kubernetes/kubernetes/pull/111472))

- https://github.com/kubernetes-sigs/kustomize/releases/tag/kustomize%2Fv4.5.7 で説明されているように、kubectl kustomize の機能をアップグレードしました。([#111606](https://github.com/kubernetes/kubernetes/pull/111606))

### Other (Cleanup or Flake)

- kube-controller-managersの非推奨であった`--experimental-cluster-signing-duration`フラグが削除されました。v1.19から利用可能になった`--cluster-signing-duration`フラグを使用するように適合させました。([#108476](https://github.com/kubernetes/kubernetes/pull/108476))