Kubernetes 1.23: SIG-Auth の変更内容

## はじめに

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

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

## Changes by Kind

### Deprecation

N/A

### API Change

- `omitManagedFields` が `audit.Policy`と`audit.PolicyRule`の両方に追加されたので、クラスタオペレータはリクエストとレスポンスのボディのマネージドフィールドがAPI監査ログに書き込まれないように選択できます。 ([#94986](https://github.com/kubernetes/kubernetes/pull/94986), [@tkashem](https://github.com/tkashem))

-  StatefulSet Pod用に自動的に作成されたPVCが自動的に削除さえるfeature gate `StatefulSetAutoDeletePVC`を追加しました。([#99728](https://github.com/kubernetes/kubernetes/pull/99728), [@mattcary](https://github.com/mattcary)) 

- client-go impersonation configで、impersonated uid情報をリクエストで渡すためのUIDを指定できます。 (#104483, @margocrawf)

    > :pencil: v1.22でUser impersonation の仕組みとして、Impersonate-Group、Impersonate-User、Impersonate-Extraと同様にUIDを指定できるようになりました。このPRではclient-goでImpersonated UIDの指定をサポートしたようです。
> 参考: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation

- いくつかのフィールドを変更したv2beta2からHPA v2を作成します。([#102534](https://github.com/kubernetes/kubernetes/pull/102534), [@wangyysde](https://github.com/wangyysde))

- kube-proxyにおけるUDPサービスのリグレッションを修正。これは古い接続を検出するロジックが、エンドポイントが準備できているかどうかを考慮していなかったためです。([#106163](https://github.com/kubernetes/kubernetes/pull/106163), [@aojea](https://github.com/aojea))

- Kubernetesはgo 1.17を使ってビルドされます。 ([#103692](https://github.com/kubernetes/kubernetes/pull/103692), [@justaugustus](https://github.com/justaugustus))

- fieldValidation=[Strict,Warn,Ignore]によるサーバーサイドの厳密なスキーマ検証リクエストを行います。 ([#105916](https://github.com/kubernetes/kubernetes/pull/105916), [@kevindelgado](https://github.com/kevindelgado))

- `IPv6DualStack` featureをstableに昇格します。IPAMコントローラのためのController Managerのフラグに若干に変更があります。([#104691](https://github.com/kubernetes/kubernetes/pull/104691), [@khenidak](https://github.com/khenidak))

   > :pencil: @tkusumi さんの記事にて詳しく紹介されています。
   > 参考: https://qiita.com/tkusumi/items/9516b7955c1c33d31e8e 

- `Generic Ephemeral Volume` featureがGAになり無条件で有効になります。([#105609](https://github.com/kubernetes/kubernetes/pull/105609), [@pohly](https://github.com/pohly))

   > :pencil: @ysakashita さんの記事が参考になります。
   > 参考: https://qiita.com/ysakashita/items/5c54dcf0f51992760e5e#generic-ephemeral-volumes

- `TTLAfterFinished` feature gateがGAになりデフォルトで有効になります。 ([#105219](https://github.com/kubernetes/kubernetes/pull/105219), [@sahilvv](https://github.com/sahilvv))

- LogFormatRegistryのユーザはlogr v1.0.0APIへのアップデートが必要です。JSONログ出力はgo-logr/zaprのフォーマット(エラーメッセージにvフィールドが存在しない、不正な呼び出しへの追加情報)を使用するようになり、いくつかの修正(無効なログ呼び出しに関する警告の正しいソースコードのlocation)が行われました。([#104103](https://github.com/kubernetes/kubernetes/pull/104103), [@pohly](https://github.com/pohly))

- Custom Resource DefinitionのバリデーションルールをOpenAPI v3 schemaのx-kubernetes-validation拡張を使って[CEL expression language](https://github.com/google/cel-spec)で記述できるになりました`CustomResourceValidationExpressions` feature gateで利用できます。 ([#106051](https://github.com/kubernetes/kubernetes/pull/106051), [@jpbetz](https://github.com/jpbetz))


### Feature

- csi-translation-lib で Portworx pluginがサポートされました(Alphaリリース)。マイグレーションにはPortworx CSI driverが必要であり、このPRではCSIMigrationPortWorx feature gateを追加し以下で有効にできます。 ([#103447](https://github.com/kubernetes/kubernetes/pull/103447), [@trierra](https://github.com/trierra)) 
  1. kube-controller-manager にフィーチャーフラグを追加 
     - `--feature-gates=CSIMigrationPortworx=true`
  2. kubelet の設定に、次のフィーチャーフラグを追加: 
      - `featureGates: CSIMigrationPortworx: true`

- client-go: fake client `Reactor`にDeleteOptionsを渡すようになりました。([#102945](https://github.com/kubernetes/kubernetes/pull/102945), [@chenchun](https://github.com/chenchun)) 

- PodSecurity: 1.23+のrestricted policy levelでは、runAsUser=0がセットされたPodとコンテナはadmission-timeで拒否されます。以前はruntimeで拒否されていました。([#105857](https://github.com/kubernetes/kubernetes/pull/105857), [@liggitt](https://github.com/liggitt))

- PodSecurityのadmission processにてexemptionされたPodとPodコントローラは理由に基づいた`pod-security.kubernetes.io/exempt: user/namespace/runtimeClass`(/はorを意味する) アノテーションがマークされるようになりました。
PodSecurityのadmissionでPodを許可または拒否したenforcement levelが`pod-security.kubernetes.io/enfoce-policy`アノテーションによってマークされるようになりました。
監査ポリシー違反について通知するアノテーションが、`pod-security.kubernetes.io/audit` から `pod-security.kubernetes.io/audit-violation` に変更されました。(#105908, @stlaz)

    > :pencil: 
    > 参考: https://kubernetes.io/docs/concepts/security/pod-security-admission/#exemptions
    > KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/2579-psp-replacement/README.md#audit-annotations

- feature flagが有効な場合、`/openapi/v3` エンドポイントにOpenAPI v3が実装されます。 ([#105945](https://github.com/kubernetes/kubernetes/pull/105945), [@Jefftree](https://github.com/Jefftree))

    > :pencil: OpenAPIv3 feature gateはv1.23でalpha版として追加されています
    > 参考: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/

- `PodSecurity` admissionプラグインがbetaになり、デフォルトで有効になります。admission configurationのバージョンは ` pod-security.admission.config.k8s.io/v1beta1` に昇格しました。使い方は https://kubernetes.io/docs/concepts/security/pod-security-admission/ を参照してください。([#106089](https://github.com/kubernetes/kubernetes/pull/106089), [@liggitt](https://github.com/liggitt)) 

- `ServiceAccountIssuerDiscovery` feature gateが削除されました。Kubernetes 1.21でGAになりました。 ([#103685](https://github.com/kubernetes/kubernetes/pull/103685), [@mengjiao-liu](https://github.com/mengjiao-liu)) 

- The constants/variables from k8s.io for STABLE metrics is now supported. (#103654, @coffeepac) [sig/node,sig/auth,sig/instrumentation,sig/testing]

- STABLEメトリックでk8s.ioの定数/変数がサポートされるようになりました。([#103654](https://github.com/kubernetes/kubernetes/issues/81863), [@coffeepac](https://github.com/coffeepac)) 

### Documentation

N/A

### Failing Test

N/A

### Bug or Regression

- ワークロードリソース(deployment, replicaset, など)を検証するエラー(PodSecurity admission)がadmissionをブロックしないようになりました ([#106017](https://github.com/kubernetes/kubernetes/pull/106017), [@tallclair](https://github.com/tallclair))

- PodSecurity admissionのメトリクスである `pod_security_evaluations_total`, `pod_security_exemptions_total`, `pod_security_errors_total` が追加されました。([#105898](https://github.com/kubernetes/kubernetes/pull/105898), [@tallclair](https://github.com/tallclair)) 

- client-goは、生成されたすべてのグループとバージョンに同じHTTPクライアントを使用し、複数のグループのバージョンに対してカスタマイズされたTransportを共有できます。 ([#105490](https://github.com/kubernetes/kubernetes/pull/105490), [@aojea](https://github.com/aojea))

-  証明書をローテーションしていない場合は、kubelet用のカスタムdialerを使用しないようにします。それによりTCP接続を再利用してapiserverとkubeletの間に1つだけ持つことができます。ユーザーがHTTP1.1を使用したstale connectionの問題を実験したい場合、環境変数`DISABLE_HTTP2`を設定することで、以前のkubeletの挙動を強制することができます。([#104844](https://github.com/kubernetes/kubernetes/pull/104844), [@aojea](https://github.com/aojea)) 

- ログをstdoutに出すための `--audit-log-path=-` の設定のリグレッションを修正しました。([#103875](https://github.com/kubernetes/kubernetes/pull/103875/files), [@andrewrynhard](https://github.com/andrewrynhard))

- OSの環境変数をCredential Provider Configファイルで与えられたものに追加していなかったため、クレデンシャルプロバイダーのバイナリの実行に失敗することがある問題を修正しました。 ([#103231](https://github.com/kubernetes/kubernetes/pull/103231), [@n4j](https://github.com/n4j))

    > :pencil: Credential Provider ConfigではOSの環境変数以外にファイル内で追加の環境変数を定義できるようになっていますが、修正前はConfigファイルから与えられた環境変数しかバイナリに渡されていなかったようです。

- controller-manager, kubelet, kube-apiserverまたはclient-goのLRUキャッシュでパニックを引き起こす可能性のあるリグレッションを修正しました。([#104466](https://github.com/kubernetes/kubernetes/pull/104466/files), [@stbenjam](https://github.com/stbenjam))

- kube-apiserverでinjectされるservice account token volumeでセットされるdefaultModeフィールドを持たないv1 Podオブジェクトをadmission webhookが観測できる問題を修正します。([#104523](https://github.com/kubernetes/kubernetes/pull/104523/files), [@liggitt](https://github.com/liggitt))

- 短命な証明書で構成されたクラスタで動作するように、`should support building a client with a CSR` E2Eテストを修正。 ([#105396](https://github.com/kubernetes/kubernetes/pull/105396), [@liggitt](https://github.com/liggitt))

- log出力フォーマットにJSONを使用する場合はkubernetesのオブジェクト参照(=name + namespace)をstructed loggingに移行しました。([#104877](https://github.com/kubernetes/kubernetes/pull/104877), [@pohly](https://github.com/pohly))

- 既存オブジェクトの更新に対してPod SecurityContextのscysctlsのnameパラメータにスラッシュを含むこと、kubeletのsysctl whitelistがスラッシュを含むことをサポートします。([#102393](https://github.com/kubernetes/kubernetes/pull/102393/files), [@mengjiao-liu](https://github.com/mengjiao-liu))

### Other (Cleanup or Flake)

- Parseできないstatus.certificateフィールドを持つCertificateSigningRequestオブジェクトをクリーンアップする際の問題を修正しました。([#103823](https://github.com/kubernetes/kubernetes/pull/103823), [@liggitt](https://github.com/liggitt))

- `BoundServiceAccountTokenVolume` feature gateはv1.22からGAになり無条件で有効なり、`--feature-gates`引数で指定することはできなくなりました。([#104167](https://github.com/kubernetes/kubernetes/pull/104167), [@ialidzhikov](https://github.com/ialidzhikov))

## 所感

v1.23ではPodSecurityの機能がbetaになりましたが、他にはCSIまわりでSIG-Storageの作業と関連したものが最近は多いように思います。
今後について、SIG-Authではv1.24に向けてKMSプラグインの改善などが動いているようなので、どのようなものになるかKEPが提出されたら追いかけたいと思います。