Kubernetes 1.22: SIG-Auth の変更内容

## はじめに

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

大きな点としては、PodSecurityPolicyの置き換えとしてPodSecurityがalpha版で利用できるようになりました。PodSecurityについては、uesynさんの記事が参考になりますので、目を通してみてください。

- https://qiita.com/uesyn/items/cf47e12fba5e5c5ea25f

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

## Changes by Kind

### Deprecation
- in-treeのazureとgcp auth pluginは非推奨になりました。https://github.com/Azure/kubelogin と gcloudコマンドはkubectl/client-go クレデンシャルプラグインメカニズムを介したout-of-treeの代替品として機能します。 ([#102181](https://github.com/kubernetes/kubernetes/pull/102181), [@enj](https://github.com/enj)) [SIG API Machinery and Auth]

### API Change
- NodeResourcesFitプラグインのための新しいスコア拡張で、v1beta2の時点で非推奨(deprecated)とマークされているNodeResourcesLeastAllocated、NodeResourcesMostAllocatedおよびRequestedToCapacityRatioプラグインの機能を統合します。v1beta1では、これら3つのプラグインは引き続き使用可能ですが、NodeResourcesFitのスコア拡張と同時に使用することはできません。([#101822](https://github.com/kubernetes/kubernetes/pull/101822), [@yuzhiquan](https://github.com/yuzhiquan))

    > :pencil:
  > スケジューリングのためのNodeResourceLeastAllocated, NoeResourceMostAllocated, RequestedToCapacityRatioを統合し、NodeResourceFitプラグインのもとに統合されました。
  > NodeResourceFitプラグインではScoringStrategyフィールドが追加されており、LeastAllocated, MostAllocated, RequestedToCapacityRatioとして指定できるようです。
  > 
  > kubescheduler.config.k8s.io/v1beta1では統合前の3つのプラグインを引き続き指定できますが、NodeResourceFitプラグインのScoringStrategyとの併用はできません。
  > kubescheduler.config.k8s.io/v1beta2ではNodeResourceFitのScoringStrategyで指定します。

- Job リソースに .status.uncountedTerminatedPods フィールドを追加しました。このフィールドはJobコントローラが終了したPodをJobステータスカウンターに追加する前に追跡するために使用されます。Jobコントローラーによって作成されたポッドは、finalizer `batch.kubernetes.io/job-tracking`を受け取り、このメカニズムを使って追跡されたジョブは annotation `batch.kubernetes.io/job-tracking`を受け取ります。これは一時的な措置であり、この機能がベータ版に移行してから2リリース後には、Jobにannotationが追加されなくなります。([#98817](https://github.com/kubernetes/kubernetes/pull/98817), [@alculquicondor](https://github.com/alculquicondor))

- Golangのtime.Formatの実装ロジックにより、表示されるタイムゾーンが一貫していません。([#102366](https://github.com/kubernetes/kubernetes/pull/102366), [@cndoit18](https://github.com/cndoit18))

    > :pencil: 
  > 指定されてなかった箇所はUTCを指定

- Ephemeral コンテナは、Pod のものとは異なる securityContext を設定できるようになりました。クラスタ管理者は、クラスタでこの機能を有効にする前に、Security Policyコントローラが EphemeralContainer をサポートしていることを確認する必要があります。 ([#99023](https://github.com/kubernetes/kubernetes/pull/99023), [@verb](https://github.com/verb))

- Execプラグインの作者は、kubeconfigの新しいinteractiveModeフィールドにより、標準入力のデフォルト処理を上書きできます。([#99310](https://github.com/kubernetes/kubernetes/pull/99310), [@ankeesler](https://github.com/ankeesler))

- Kube APIサーバはImpersonate-User, Impersonate-GroupおよびImpersonate-Extraと同様にImpersonate-Uidヘッダを使って偽装するユーザのUIDを指定できます。 ([#99961](https://github.com/kubernetes/kubernetes/pull/99961), [@margocrawf](https://github.com/margocrawf))

    > :pencil:
  > https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation

- kube-apiserver:  `--service-account-issuer`を複数回指定できるようになり、非破壊的な方法でissuerを変更することができます。([#101155](https://github.com/kubernetes/kubernetes/pull/101155), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Node and Testing]

    > :pencil:
  > Tokenの生成には先頭のissuerのみが使われますが、Tokenの検証時には指定された複数のissuerのうちいずれかにマッチすることを確認します。

- CSIServiceAccountTokenがGAに昇格し無条件で有効になりました。([#103001](https://github.com/kubernetes/kubernetes/pull/103001), [@zshihang](https://github.com/zshihang))

- CertificateSigningRequest.certificates.k8s.io APIはオプショナルな `expirationSeconds` フィールドをサポートし、クライアントが発行される証明書の期間を指定できるようになりました。Kubernetesコントローラが提供するデフォルトのsignerの実装は`--cluster-signing-duration`フラグを超えない限り、このフィールドを尊重します。([#99494](https://github.com/kubernetes/kubernetes/pull/99494), [@enj](https://github.com/enj))

    > :pencil:
  > これまではsignerの実装に依存していましたがAPIとしてサポートされたようです。

- Server Side Applyは特定のstructをアトミックに扱います。これはすべてのselectorフィールドが単一のwriterによって管理され、一緒に更新されることを意味します。 ([#100684](https://github.com/kubernetes/kubernetes/pull/100684), [@Jefftree](https://github.com/Jefftree))

- pod/evictionサブリソースがpolicy/v1beta1 evictionリクエストに加えてpolicy/v1 evictionリクエストも受け付けるようになりました。([#100724](https://github.com/kubernetes/kubernetes/pull/100724), [@liggitt](https://github.com/liggitt))

- pods/ephemeralcontainers APIはEphemeralContainersの代わりにPodを返すようになりました。これは以前のalpha-level  APIとの互換性はありません。([#101034](https://github.com/kubernetes/kubernetes/pull/101034), [@verb](https://github.com/verb)) [SIG Apps, Auth, CLI and Testing]

- Jobの完了をstatusやPodのfinalizersを使って追跡し、Pod tombstonesへの依存を取り除きます。 ([#98238](https://github.com/kubernetes/kubernetes/pull/98238), [@alculquicondor](https://github.com/alculquicondor)) [SIG API Machinery, Apps, Auth and Testing]

### Feature

- Kube API サーバーに認証ロジックを委譲する拡張 API で使用される delegated authenticator のメトリクスを追加しました。([#99364](https://github.com/kubernetes/kubernetes/pull/99364), [@p0lyn0mial](https://github.com/p0lyn0mial))

    > :pencil:
  > delegated authn requestの数やレイテンシといったメトリクスが追加されているようです

- 認可ロジックをKube APIサーバに委譲する拡張APIで使用されるdelegation authorizerのメトリクスを追加します。 ([#100339](https://github.com/kubernetes/kubernetes/pull/100339), [@p0lyn0mial](https://github.com/p0lyn0mial))

    > :pencil:
  > delegate authz requestの数やレイテンシといったメトリクスが追加されているようです。#99364は認証、#10039は認可のメトリクス

- kube-apiserver: alphaのPodSecurity featureは`--feature-gate=PodSecurity=true`を渡すことで有効にでき、Namespace labelを使って許可されたPodを制御できます。詳細は https://git.k8s.io/enhancements/keps/sig-auth/2579-psp-replacement  ([#103099](https://github.com/kubernetes/kubernetes/pull/103099), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Auth, Instrumentation, Release, Security and Testing]

    > :pencil:
  > https://qiita.com/uesyn/items/cf47e12fba5e5c5ea25f

- `net.ipv4.ip_unprivileged_port_start`を安全なものとしてsysctlでマークします。([#103326](https://github.com/kubernetes/kubernetes/pull/103326), [@pacoxu](https://github.com/pacoxu))

- NetworkPolicy validation frameworkはwindowsをサポートします。([#98077](https://github.com/kubernetes/kubernetes/pull/98077), [@jayunit100](https://github.com/jayunit100))

- New metrics: `apiserver_kube_aggregator_x509_missing_san_total`と`apiserver_webhooks_x509_missing_san_total`。このメトリックは、Subject Alternative Namesを持たない証明書を使用するwebhooks/aggregated APIサーバーへの接続数を測定します。Golangはサーバーのホスト名検証のためのX.509証明書のSubjectのCommon Nameを非推奨にする予定であるため、値がゼロでないことはこれらの接続が将来的に機能しなくなるという警告です。([#95396](https://github.com/kubernetes/kubernetes/pull/95396), [@stlaz](https://github.com/stlaz)) [SIG API Machinery, Auth and Instrumentation]

    > :pencil:
  > Golang 1.15からX.509証明書のCommon Nameを使ったホスト名検証が無効になり、また暫定的にGODEBUG変数に`x509ignoreCN=0`を設定するこで有効にできるようになっています。
  > これらのメトリクスはこの変更による影響を測定したり、証明書の設定ミスなどを確認するためのものとして利用できます。

- BoundServiceAccountTokenVolumeはGAに昇格し無条件で有効になります。feature gateは1.23で削除されます。([#101992](https://github.com/kubernetes/kubernetes/pull/101992), [@zshihang](https://github.com/zshihang))

- client-go credential pluginはGAになり、デフォルトで有効化されます。([#102890](https://github.com/kubernetes/kubernetes/pull/102890), [@ankeesler](https://github.com/ankeesler))

- pod specsにdeprecatedやknown-badの値が使用されている場合、警告が送られるようになりました。([#101688](https://github.com/kubernetes/kubernetes/pull/101688), [@liggitt](https://github.com/liggitt))

### Documentation
- N/A

### Failing Test
- ECDSA鍵で署名されたServiceAccountトークンを受け入れるため、過度に制限されたconformance testを修正しました。 ([#100680](https://github.com/kubernetes/kubernetes/pull/100680), [@smira](https://github.com/smira)) [SIG Architecture, Auth and Testing]

- “ServiceAccountIssuerDiscovery should support OIDC discovery "のconformance testが、クラスター外のissuerで構成されたクラスターで失敗する問題を解決しました。([#101589](https://github.com/kubernetes/kubernetes/pull/101589), [@mtaufen](https://github.com/mtaufen)) [SIG Auth and Testing]

### Bug or Regression
- デフォルトのview・edit RBAC roleにEndpointSliceの権限を追加しました。([#101203](https://github.com/kubernetes/kubernetes/pull/101203), [@mtougeron](https://github.com/mtougeron))

- Eventのwrite権限をeditとadmin roleに集約します。([#102858](https://github.com/kubernetes/kubernetes/pull/102858), [@tumido](https://github.com/tumido))

- Aggregated roleはEndpointSlicesへのwriteアクセスを含まなくなりました。これは、Kubernetes 1.22サイクルの初期に導入された変更の一部をロールバックするものです。([#103703](https://github.com/kubernetes/kubernetes/pull/103703), [@robscott](https://github.com/robscott))

- 大きなCRDでのupdate・apply操作におけるパフォーマンスの低下を修正 ([#103318](https://github.com/kubernetes/kubernetes/pull/103318), [@jpbetz](https://github.com/jpbetz)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Storage]

- Refresh Tokenが期限切れになったときに、azure authがデバイスコード認証フローへのプロンプトを出すのをブロックする問題を修正しました。([#102063](https://github.com/kubernetes/kubernetes/pull/102063), [@tdihp](https://github.com/tdihp))

- DelegatingAuthenticationOptionsのタイムアウトフィールドの名前をTokenRequestTimeoutに変更し、Token Reviewクライアントにのみタイムアウトを設定するようにしました。以前はWatchにもタイムアウトが適用され、10秒ごとに再接続されていました。 ([#100959](https://github.com/kubernetes/kubernetes/pull/100959), [@p0lyn0mial](https://github.com/p0lyn0mial))

- kubeletはクライアント証明書とサーバー証明書の証明書ローテーションに関して区別したログメッセージを報告するようになり、どちらか一方の問題のデバッグが容易になりました。([#101252](https://github.com/kubernetes/kubernetes/pull/101252), [@smarterclayton](https://github.com/smarterclayton))

- StatefulSetAPIへのAdd PersistentVolumeClaimDeletePolicyの追加を取り消します。([#103747](https://github.com/kubernetes/kubernetes/pull/103747), [@mattcary](https://github.com/mattcary))

- `system:aggregate-to-edit` roleはEndpoints APIへのwrite権限を含まなくなります。新しく作られたKubernetes 1.22クラスタでは、editとadmin roleにはそのアクセス権限は含まれません。これは既存のクラスタを1.22に更新したものには影響しません。新しく作成された1.22クラスタのaggregated edit roleとadmin roleのEndpointsへのwriteアクセスを保持するには、https://github.com/kubernetes/website/pull/29025 を参照してください。 ([#103704](https://github.com/kubernetes/kubernetes/pull/103704), [@robscott](https://github.com/robscott)) [SIG Auth and Network]

### Other (Cleanup or Flake)
- RootCAConfigMap featureは1.21でGAになり無条件で有効になったため、RootCAConfigMap feature-gateが削除されました。([#101579](https://github.com/kubernetes/kubernetes/pull/101579), [@carlory](https://github.com/carlory))

- `golang.org/x/net`を`v0.0.0-20210520170846-37e1c6afe023`に更新しました。([#103176](https://github.com/kubernetes/kubernetes/pull/103176), [@CaoDonghui123](https://github.com/CaoDonghui123)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Node and Storage]