Kubernetes 1.27: SIG-Auth の変更内容

## はじめに

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

v1.27ではKMS v2がベータになり、alphaでは提供されていなかった鍵の自動ローテーションの仕組みも追加されています。alpah→betaで内部での鍵管理の仕組みが変わったりしましたがよりシンプルになっています。

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

## Changes by Kind
### Deprecation
- `SecurityContextDeny` admission pluginは非推奨になり将来のバージョンで削除されます ([#115879](https://github.com/kubernetes/kubernetes/pull/115879))

### API Change
  - API: `resource.k8s.io/v1alpha1.PodScheduling` は `resource.k8s.io/v1alpha2.PodSchedulingContext` にリネームされました ([#116556](https://github.com/kubernetes/kubernetes/pull/116556))
  - `ValidationRule`に`messageExpression`フィールドが追加されました ([#115969](https://github.com/kubernetes/kubernetes/pull/115969))
  - ClusterIP allocatorが追加されました。新しいallocatorは以前のIPv4向けのService CIDR block size limitaionを削除し、IPv6 sizeを/64に制限します ([#115075](https://github.com/kubernetes/kubernetes/pull/115075))
  - alpha APIの追加: ClusterTrustBundle(`certificates.k8s.io/v1alpha1`)。ClusterTrustBundleはクラスタ内のワークロードにX.509のトラストアンカーを配布するために利用できます。([#113218](https://github.com/kubernetes/kubernetes/pull/113218))
    > - :pencil2: 最初のスコープとしてはCSR APIで署名したX.509 証明書のトラストバンドルを配布
    > 最終的にはRootCAConfigMapで配布しているkube-apiserverのサーバ証明書のためのものやBound Service Account Tokenを検証するためのトラストバンドルｍ含まれます
    > - 将来的にはProjected Volumeを使ってPodにマウントできるようです
    > - KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3257-trust-anchor-sets
  - APIサーバのデータ保管時の暗号化設定でリソースのリストにワイルドカードが使用できます。例として全てのリソースを暗号化したり、現在と将来の全てのカスタムリソースを暗号化するなど。([#115149](https://github.com/kubernetes/kubernetes/pull/115149))
    > - :pencil2: 暗号化の設定でのワイルドカード指定
	> - `'*.*'` や `'*.<group>'` のような形でリソースを指定できる
	> - `'*.'` はcoreグループの全リソース
  - `SelfSubjectReview`がベータに昇格しました ([#116274](https://github.com/kubernetes/kubernetes/pull/116274))
  - kms v2 pluginのkey IDがstableの間、APIサーバはデータ暗号化の鍵を再利用するようになりました。データ暗号化の鍵はサーバ起動時にランダムに生成されますが、nonceの衝突を防ぐためにアトミックカウンタが使用されます。([#116115](https://github.com/kubernetes/kubernetes/pull/116155))
  - PodDisruptionBudgetの`spec.unhealthyPodEvictionPolicy`フィールドはbetaになりデフォルトで有効になりました。この機能が有効なサーバでは、このフィールドをAlwaysAllowに設定することで、PodDisruptionBudgetでカバーされているunhealthyなpodsのevictを常に許可できます。([#115363](https://github.com/kubernetes/kubernetes/pull/115363))  
  - KMSv2がベータになりました ([#115123](https://github.com/kubernetes/kubernetes/pull/115123))
      > - :pencil2: v1からの主な変更点
	  >   - Performance改善
	  >     - DEKを使い回す
	  >     - (alphaで導入されたLocal KEKを導入するKey hierarchyデザインは中止)
	  >   - Status API
	  >     - ステータスだけでなくリモートKMS KEKの公開名であるKey IDもレスポンスに含める
	  >     - APIサーバはKey IDの変更を検知することで鍵ローテーションを行う
  	  >   - Key Rotation
	  >     - APIサーバはKey IDの変更を検知したらDEKを再生成してstorage migration
	  >     - APIサーバの再起動は不要
	  >   - EncryptionConfigurationのホットリロード
	  >     - APIサーバの再起動なしに設定を反映
	  >   - Observability
	  >     - Encrypt/Decryptリクエストにリクエスト毎に一意なUIDを含める

      > - :pencil2: pluginの対応状況
	  >   - `GoogleCloudPlatform/k8s-cloudkms-plugin`
	  >     - [Issue](https://github.com/GoogleCloudPlatform/k8s-cloudkms-plugin/issues/23)があるがまだ進んでないように見える
	  >   - `Azure/kubernetes-kms`
	  >     - [PR](https://github.com/Azure/kubernetes-kms/pull/210)が出ていて作業中
	  >   - `aws-encryption-provider`
	  >     - Issue/PR見当たらず
  - コントロールプレーンのコンポーネントで`/metrics/slis`が利用できるようになり、ヘルスチェックメトリクスをスクレイピングできるようになりました。([#114997](https://github.com/kubernetes/kubernetes/pull/114997))
  - `StatefulSetAutoDeletePVC` feature gateがベータに昇格しました ([#116501](https://github.com/kubernetes/kubernetes/pull/116501))
  - `ValidatingAdmissionPolicy`がvalidation expressionのtypeチェックの結果を含むstatusフィールドを提供するようになりました。このtypeチェックは情報提供でありポリシーの動作は変更されません。
  - ValidatingAdmissionPolicy が、検証式の型チェックの結果を含むステータスフィールドを提供するようになりました。この型チェックは完全に情報提供であり、ポリシーの動作は変更されません。([#115668](https://github.com/kubernetes/kubernetes/pull/115668))
  - cacheSize field in EncryptionConfiguration is not supported for KMSv2 provider (#113121, @aramase) [sig/api-machinery,sig/auth,sig/testing]
  - `EncryptionConfiguration`の`cacheSize`はKMSv2 providerではサポートされません ([#113121](https://github.com/kubernetes/kubernetes/pull/113121))
      > - :pencil2: DEKが1つになりそれを起動している間キャッシュするようになったのでsizeパラメータは廃止になった

### Feature
  - kubectl explainに古いopenapiv2の実装を利用するための`--output plaintext-openapiv2`引数を追加しました。([#115480](https://github.com/kubernetes/kubernetes/pull/115480))
  - 不正なkeyIDをStatus RPCが返した回数を計測するための `apiserver_envelope_encryption_invalid_key_id_from_status_total` を追加しました。([#115846](https://github.com/kubernetes/kubernetes/pull/115846))
  - KMSv2のgRPC呼び出しのレイテンシを計測するメトリック`apiserver_envelope_encryption_kms_operations_latency_seconds` を追加しました。([#115649](https://github.com/kubernetes/kubernetes/pull/115649))
  - `apiserver_storage_transformation_operations_total`が`transformer_prefix`ラベルとstatusを含むように更新されました。([#115394](https://github.com/kubernetes/kubernetes/pull/115394))
  - `LegacyServiceAccountTokenTracking` feature gateがベータになりました。自動生成されたSecretベースのServiceAccountトークンを使用すると、デフォルトで警告が表示されるようになり、関連するSecretには最後に使用されたタイムスタンプが表示されます(ラベルのkeyは`kubernetes.io/legacy-token-last-used`)。([#114523](https://github.com/kubernetes/kubernetes/pull/114523))
      > - :pencil2: 警告は[KEP-1693: Warning mechanism for use of deprecated APIs](https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/1693-warnings/README.md) の仕組みで表示される
  - KubeletはPodが`net.ipv4.ip_local_reserved_ports sysctl`を使用することをデフォルトで許可しますが最小のカーネルバージョンは3.16です。Pod Security admissionはv1.27以上のバージョンでbaselineおよびrestrictedのポリシーでこの sysctl を許可します。([#115374]())
  - mainのkube-controller-managerのバイナリでcontextual logginを使うように移行しました ([#116529](https://github.com/kubernetes/kubernetes/pull/116529))
  - service-account controller(kube-controller-manager内)をcontextual loggingを使うように移行しました ([#114918](https://github.com/kubernetes/kubernetes/pull/114918))
  - klogのパフォーマンス改善 ([#115277](https://github.com/kubernetes/kubernetes/pull/115277))
  - kubectlコマンドの`whoami`がGAに昇格しました ([#116510](https://github.com/kubernetes/kubernetes/pull/116510))
  - mount-utils mounterが、同時フォーマット操作の数を制限するオプションを提供するようになりました ([#115379](https://github.com/kubernetes/kubernetes/pull/115379))
  - cAdvisorをv0.47.0に更新しました ([#114883](https://github.com/kubernetes/kubernetes/pull/114883))

### Bug or Regression
  - `OwnerReferencesPermissionEnforcement`admission pluginが有効な場合の`StatefulSetAutoDeletePVC` featureを修正しました ([#114116](https://github.com/kubernetes/kubernetes/pull/114116))
  - CRD Validation Rules (beta)とValidatingAdmissionPolicy (alpha)ですべてのadmission requestが`runtime error: index out of range [3] with length 3 evaluating rule: <rule name> under certain circumstances`エラーという結果になることがある不具合を修正しました ([#114857](https://github.com/kubernetes/kubernetes/pull/114857))
  - `multipleOf`を0したCRDのバリデーションがpanicになる問題を修正しました ([#114869](https://github.com/kubernetes/kubernetes/pull/114869))
  - 強制削除されたPodはコンテナランタイムがエラーを返すとkubeletが再起動するまで終了が失敗することがあります。ランタイム障害のテストを強化しスタティックPod(特に固定UIDを利用するもの)が確実に再起動されるようにより厳格なreconcilationを行います。これらの変更の副作用としてスタティックPodは以前より小さい遅延で再起動し、Podの設定はより早く有効になります。kubeletが追跡しているPodの数を計測する新しいメトリック `kubelet_known_pods`が追加されました。オペレーターはこのメトリックを使用して、完了しない可能性のあるOrphan状態のPodを追跡できます。([#113145](https://gist.github.com/superbrothers/d401e2aa3baa7f1f82d9a7e3e242d8da))
  - `key encipherment` usageのAPIバリデーションを緩和し、kubeletは要求されたusageを適切に利用します。([#111660](https://github.com/kubernetes/kubernetes/pull/111660))
      > - :pencil2: これまではRSAまたは非RSAに限らずkubelt自体またはkubeletのクライアント証明書に設定するkey usageは1種類のみでしたが、暗号化方式により適切な値が設定されるようになります。
e.g. `["key encipherment", "digital signature", "client auth"]` or `["digital signature", "client auth"]`
  - Shared informterは同期されているかどうかを正しく伝搬するようになりました。個々のinformerハンドラは同期されているかどうかをチェックできるようになりました(`HasSynced`)。初期のリスト内のitemについて、コントローラが自身の作業が完了したかどうかを追跡するためのライブラリサポートが追加されました（`AsyncTracker`)。([#113985](https://github.com/kubernetes/kubernetes/pull/113985))
  - KubernetesのAPIサーバは、kubelet認証用のクライアント証明書ファイルがローテーションされている場合に、既存のTLS接続を正しく検出して閉じるようになりました。([#115315](https://github.com/kubernetes/kubernetes/pull/115315))
  - ProgressReporterでTotal test specが利用可能になりました。([#114417](https://github.com/kubernetes/kubernetes/pull/114417))
  - CVE-2022-41723の修正のため `golang.org/x/net` を `v0.7.0` に更新しました ([#115786](https://github.com/kubernetes/kubernetes/pull/115786))
  - KMS v2プラグインからの暗号化応答は、暗号化が実行されるまで待つのではなくDEK生成時の早い段階で検証されるようになりました。([#116877](https://github.com/kubernetes/kubernetes/pull/116877))

### Other (Cleanup or Flake)
  - ClusterRole `system:kubelet-api-admin` から不要なルールの `nodes/spec` を削除しました。([#113267](https://github.com/kubernetes/kubernetes/pull/113267/files))
  - (#107826, @smarterclayton) [SIG API Machinery, Auth, Cloud Provider, Storage and Testing] [sig/storage,sig/api-machinery,sig/auth,sig/testing,sig/cloud-provider]
  - `wait.Poll*`と`wait.ExponentialBackoff*`関数は非推奨になり将来のリリースで削除されます。かわりに`wait.PollUntilContextCancel`、`wait.PollUntilContextTimeout`や`wait.ExponentialBackoffWithContext` を使うことができます。(以下関数の詳細は省略）([#107826](https://github.com/kubernetes/kubernetes/pull/107826))
  - `go-jose`を`v2.6.0`に更新しました ([#115893](https://github.com/kubernetes/kubernetes/pull/115893))