Kubernetes 1.28: SIG-Auth の変更内容

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

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

## Changes by Kind

### Deprecation

- `KMS v1` は非推奨になり、今後はセキュリティ更新のみを受け取ります。かわりに`KMS v2`を使ってください。将来のリリースでは、`--feature-gates=KMSv1=true`をセットして非推奨のKMSv1の機能を使います。([#119007](https://github.com/kubernetes/kubernetes/pull/119007))

### API Change

- アルファ版の機能である`CRDValidationRatcheting`を追加しました。PATCHまたはUPDATEのValidation RatchetingはほとんどのOpenAPIスキーマのバリデーションでリソースの変更されていない部分から投げられたエラーを破棄します。([#118990](https://github.com/kubernetes/kubernetes/pull/118990))
- KMS v2のデータ暗号化鍵の生成方法を変更しました。`KMSv2KDF` feature gateを有効にすると(デフォルトはoff)、KMS v2は秘密のseedといくつかのランダムなデータを組み合わせて単一のデータ暗号化鍵を生成する鍵導出関数を使用します。これにより AES-GCMの12バイトのnonceの衝突を回避し、カウンタベースのnonceの必要性を排除します。([#118828](https://github.com/kubernetes/kubernetes/pull/118828))
	- :pencil: https://hackmd.io/@enj/SyiXCABZn
    	- どうやってnonce衝突の問題の回避するかの話。
    	- v1.27ではAES-GCMで使う12バイトのnonceを一意にするためにランダムな値ではなく、8バイトのアトミックカウンタを介して設定された値+4バイトのランダムな値を使っていました。
    		- https://github.com/kubernetes/kubernetes/pull/116155
    	- v1.28ではHKDFを使って算出した12バイトの値をnonceに使うようになり、より一般的な制限のない実装になったようです。
	
- PersistentVolumesはボリュームが最後にフェーズを遷移した時のタイムスタンプを保持する新しいフィールド`LastPhaseTransitionTime`を持ちます ([#116469](https://github.com/kubernetes/kubernetes/pull/116469))
- `ValidtaingAdmissionPolicy`はbetaに昇格し、デフォルトではオフにしています。([#119409](https://github.com/kubernetes/kubernetes/pull/119409))
- `pvc.Status`から`resizeStatus` numが取り除かれ、`AllocatedResourceStatus`に置き換えられました。([#116335](https://github.com/kubernetes/kubernetes/pull/116335))
- Feature gateの`WindowsHostProcessContainers` は削除されました。([#117570](https://github.com/kubernetes/kubernetes/pull/117570))
- ローカルのapiserverがバージョンスキューのためにサービスを提供できない場合や、リクエストされたAPIがローカルAPIサーバで無効になっている場合、ピアのkube-apiserverへのリクエストのプロキシする機能をサポートしました。([#117740](https://github.com/kubernetes/kubernetes/pull/117740))
- `SelfSubjectReview` APIが`authentication.k8s.io/v1`に昇格し、`kubectl auth whoami`コマンドがGAになりました。([#117713](https://github.com/kubernetes/kubernetes/pull/117713))
- ResourceClaimTemplateから生成されるResourceClaimの名前が生成されるようになった。ベースとなる名前は `<pod>-<claim name>` のままですが、ランダムな接尾辞を付けることで名前の衝突を避けることができます。([#117351](https://github.com/kubernetes/kubernetes/pull/117351))
- `kube-controller-manager`: `LegacyServiceAccountTokenCleanUp` feature gateがalpha版で利用可能になりました(デフォルトはoff)。有効にすると、`legacy-service-account-token-cleaner` controller loopは`--legacy-service-account-token-clean-up-period` (デフォルトは1年)で指定した期間に使われていない & ServiceAccountオブジェクトの`.secrets`リストから**参照されている** & Podから**参照されていない**、サービスアカウントトークンのSecretを削除します。([#115554](https://github.com/kubernetes/kubernetes/pull/115554))
	- :pencil:  これまでの流れ
    	- `LegacyServiceAccountTokenNoAutoGeneration` でSecretベースのSA Tokenの自動生成停止 (v1.26でGA)
    	- `LegacyServiceAccountTokenTracking` でSecretベースのSA Tokenの使用をトラッキング (v1.28でGA)
    	- `LegacyServiceAccountTokenCleanUp` で指定された期間使用されていないSecretベースのSA Tokenを削除

### Feature

- `LegacyServiceAccountTokenTracking` feature gateがGAになりました。自動生成されたSecretベースのサービスアカウントトークンを使用すると警告が出され、関連するSecretには最終使用時刻のタイムスタンプがラベルされます。(labelのキーは`kubernetes.io/legacy-token-last-used`)([#117591](https://github.com/kubernetes/kubernetes/pull/117591))
- ログにおけるKeyIDのハッシュ化。このリリースではログにおける`KeyID`の値をハッシュ化する機能を追加します。`KeyID`値はセンシティブな情報でログに生のテキストで出力すべきではありません。`KeyID`値をハッシュ化することで、データの機密性を守りながら必要な情報を記録することができます。([#118988](https://github.com/kubernetes/kubernetes/pull/118988))
- Kube-controller-manager: dynamic resource controllerはスケジューラがポッドを無視するようにポッドが作られたときに介入し、遅延リソースのクレーム割り当てをトリガーしたり、ポッドのクレームを予約したりします。([#118209](https://github.com/kubernetes/kubernetes/pull/118209))
- Kubelet: ノードのアクセスをノードで必要なオブジェクトに限定することで、動的なリソース割り当てのセキュリティを強化しました。([#116254](https://github.com/kubernetes/kubernetes/pull/116254))
- KuberentesはGo `1.20.5` でビルドされます。 ([#118507](https://github.com/kubernetes/kubernetes/pull/118507))
- KubernetesはGo `1.20.6`でビルドされます。([#119324](https://github.com/kubernetes/kubernetes/pull/119324))
- `pod-security-admission`を[contextual logging](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)を使うように移行しました。([#114471](https://github.com/kubernetes/kubernetes/pull/114471))
- certificate controller(`kube-controller-manager`内の)を[contextual logging](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)を使うように移行しました。([#113994](https://github.com/kubernetes/kubernetes/pull/113994))
- Encryption Configuration Controllerに新しいメトリクスを追加しました。このリリースでは、暗号化設定の自動リロードを監視するのに役立つ新しいメトリクスが追加されました。新しいメトリクスには以下が含まれます。これらのメトリクスはEncryption Configuration Controllerのヘルスモニターと暗号化設定の自動リロード中に発生する可能性のあるトラブルシューティングに使用できます。([#119008](https://github.com/kubernetes/kubernetes/pull/119008))
  `apiserver_encryption_config_controller_automatic_reload_failures_total`: 暗号化設定の自動リロードに失敗した回数の合計。
  `apiserver_encryption_config_controller_automatic_reload_success_total`: 暗号化設定の自動リロードに成功した回数の合計。
  `apiserver_encryption_config_controller_automatic_reload_last_timestamp_seconds`: 暗号化設定の自動リロードが最期に成功または失敗したときのタイムスタンプ。
	- :pencil: 自動リロードの成功・失敗に関するメトリクスが追加されたことでより安心して利用できるようになったように思います。
- Webhook authorizersに送られるSubjectAccessReview requestの`spec.resourceAttributes.version` が空の場合にデフォルトで`*`をセットします。([#116937](https://github.com/kubernetes/kubernetes/pull/116937))
- `v1.12`でGA(無条件で有効)になった`AdvancedAuditing` feature gateが削除されました。([#118763](https://github.com/kubernetes/kubernetes/pull/118763))
- Podが終了するか実行されなくなると、そのPodの`ResourceClaim`は他のPodに再利用されるか削除されます。([#118817](https://github.com/kubernetes/kubernetes/pull/118817))
- `klog`のテキスト出力でstructs, maps、slicesのエンコーディングにJSONを使用するように鳴りました。([#117687](https://github.com/kubernetes/kubernetes/pull/117687))
- kubeadm: 現在のシステム時刻に対して5分過去にオフセットされた開始時刻を持つCA証明書を生成し、クロックの非同期を回避します。([#118922](https://github.com/kubernetes/kubernetes/pull/118922))

### Documentation

N/A

### Failing Test

N/A

### Bug or Regression

- `OpenAPI`コンテンツを提供する際のレースコンディションを修正しました。([#117705](https://github.com/kubernetes/kubernetes/pull/117705))
- APIサーバが認証webhookにImpersonated UIDを送信しない問題を修正しました。([#116681](https://github.com/kubernetes/kubernetes/pull/116681))
- タイミングトレースを記録する際にレースコンディションがありました。実際には影響は少ないと思われます。([#117139](https://github.com/kubernetes/kubernetes/pull/117139))
-  OpenAPI V2にクライアントがアクセスしない場合、`kube-apiserver`のCPUとメモリの消費量を削減しました。また、多数のCRDをインストールした場合のapiserverのパフォーマンスを改善しました。 ([#118212](https://github.com/kubernetes/kubernetes/pull/118212))


### Other (Cleanup or Flake)

- `genericclioptions.IOStreams`を非推奨にして`genericiooptions.IOStreams`を使用します。([#117102](https://github.com/kubernetes/kubernetes/pull/117102))
- OpenAPI protoのデシリアライゼーションはgnosticライブラリの代わりに`gnostic-models`を使うべきです。([#118384](https://github.com/kubernetes/kubernetes/pull/118384))
- 特にCPUリソースの消費を少なくするために`OpenAPI v2` specを50%以上縮小しました。([#118204](https://github.com/kubernetes/kubernetes/pull/118204))
- `kube-apiserver`は認可webhookへのリクエストを結果ごとに分割して監視できる2つの新しいメトリクス`authorization_attempts_total` と `authorization_duration_seconds` を追加しました。([#117211](https://github.com/kubernetes/kubernetes/pull/117211))