Kubernetes 1.21: SIG-Auth の変更内容

## はじめに

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

今回はBoundServiceAccountVolumeのbeta昇格が個人的なトピックです。詳しく知りたい方は以下の記事を参照してみてください。

- [BoundServiceAccountVolumeを有効にしてみる](https://qiita.com/hiyosi/items/35c22507b2a85892c707)
- [Bound Service Account Tokenとは何か](https://qiita.com/hiyosi/items/e4fb3d9188f8d6e650b2)

PodSecurityPolicyも気になるところですが、もうしばらく様子を見たいと思っています。

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

## Changes by Kind

### Deprecation

- PodSecurityPolicy APIは1.21で非推奨となり、1.25からは提供されなくなります。([#97171](https://github.com/kubernetes/kubernetes/pull/97171), [@deads2k](https://github.com/deads2k))

- export クエリパラメータが完全に削除されました。(APIリソースによる一貫性のないサポート、v1.14で非推奨)。 このクエリパラメータを設定したリクエストは、400ステータスレスポンスを受け取るようになりました。([#98312](https://github.com/kubernetes/kubernetes/pull/98312), [@deads2k](https://github.com/deads2k))

> :pencil: 
> kubectlではv1.19で`--export`フラグ削除済み。REST APIのクエリパラメータとしてはまだ残っていたみたいです。

- `audit.k8s.io/v1beta1`と`audit.k8s.io/v1alpha1`のaudit policyとaudit eventsが非推奨になり、v1.13から利用可能な`audit.k8s.io/v1`を採択します。`--audit-policy-file` でalphaやbetaのポリシー設定を指定している、`--audit-log-version / --audit-webhook-version`でalphaやbetaのaudit eventを明示的にリクエストしているkube-apiserverは、v1.24より前に`audit.k8s.io/v1`を使用し、`audit.k8s.io/v1` のeventを受け付けるように更新する必要があります(MUST)。 (#98858, @carlory) [SIG Auth]

> :pencil: 
> `--audit-policy-file`のPolicyリソースや`--audit-log-version`、`--audit-webhook-version`でalphaやbetaを指定している場合にはv1.24までに`audit.k8s.io/v1`を使うように更新しましょう。

### API Change

- 1. PodAffinityTermは、labelに基づいて的確なNamespaceを選択できるようにするnamespaceSelectorフィールドを含みます。
  2. 新しいCrossNamespacePodAffinity quota scope APIは、namespaceSelectorまたはnamespacesフィールドを介してNamespace跨ぎの参照をするPodAffinityTermを許可するNamespaceを制限できます。([#98582](https://github.com/kubernetes/kubernetes/pull/98582), [@ahg-g](https://github.com/ahg-g)) [SIG API Machinery, Apps, Auth and Testing]

- CSIServiceAccountTokenがBetaに昇格し、デフォルトで有効になりました。([#99298](https://github.com/kubernetes/kubernetes/pull/99298), [@zshihang](https://github.com/zshihang))

> :pencil:
> これまでCSI driver/providerが(Podの)ServiceAccount Tokenを取得する方法としては、filesystemから読み込む方法、またはdriver/provider毎にTokenRequestを使ってtokenを取得する必要がありました(VolumeContextにPod情報やServiceAccount Nameは含まれていた)。
> filesystemから読み込む方法はpermissionの問題やhostPath(/var/lib/kubelt/pods?)が必要な点、automountServiceAccountToken=falseが設定されると使えないなどの問題がありました(この方法を採用していたdriverが存在していたのかは不明)。
> driver/providerがTokenRequestを使ってtokenを発行する方法は、driver/providerに権限を与える必要があることや、それぞれで同じ処理の実装が必要という問題がありました。
> 問題を解決するために、CSIServiceAccountTokenでは、kubeletがTokenRequestを使って発行したtokenがdriverへのNodePublishVolume()リクエストのVolumeContextで渡されます。
> https://github.com/kubernetes/kubernetes/blob/v1.21.0/pkg/volume/csi/csi_mounter.go#L231

- FieldManagerは、オブジェクトが永続化される前にリセットされるフィールドを所有しなくなりました (e.g. "status wiping") ([#99661](https://github.com/kubernetes/kubernetes/pull/99661), [@kevindelgado](https://github.com/kevindelgado)) [SIG API Machinery, Auth and Testing]

- Generic ephemeral volumesがベータになりました。 ([#99643](https://github.com/kubernetes/kubernetes/pull/99643), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, CLI, Node, Storage and Testing]

- PodDisruptionBudget APIオブジェクトがstatusにconditionsを含めることができるようになりました。([#98127](https://github.com/kubernetes/kubernetes/pull/98127), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation]

- GenericEphemeralVolume feature gateが有効な場合、PodSecurityPolicyは許可されたvolume typeとして"Generic"のみを保存します。([#98918](https://github.com/kubernetes/kubernetes/pull/98918), [@pohly](https://github.com/pohly)) [SIG Auth and Security]

- bazelによるKubernetesのビルドのサポートを削除しました。([#99561](https://github.com/kubernetes/kubernetes/pull/99561), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows]

- Storageのキャパシティトラッキング(CSIStorageCapacity feature)がbetaに昇格しデフォルトで有効になりました。`storage.k8s.io/v1alpha1/VolumeAttachment`と`storage.k8s.io/v1alpha1/CSIStorageCapacity`オブジェクトは非推奨です。([#99641](https://github.com/kubernetes/kubernetes/pull/99641), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, Scheduling, Storage and Testing]

- BoundServiceAccountVolume featureがbetaに昇格し、デフォルトで有効になりました。
  - これにより、`/var/run/secrets/kubernetes.io/serviceaccount/token`でコンテナに提供されるtokenが有効期限付き、自動更新、Podが削除されると無効になるように変更されました。クライアントは、有効なトークンを引き続き使用できるように、定期的に（1分に1回を推奨）diskからtokenをリロードする必要があります。 `k8s.io/client-go`の`v11.0.0+`および`v0.15.0+`はtokenを自動的にリロードします。デフォルトでは、挿入されたtokenは有効期間が延長されるため、新しく更新されたtokenが提供された後も有効なままです。`serviceaccount_stale_tokens_total` metricを使って、延長された有効期間に依存し、更新されたtokenがコンテナに提供された後も(古い)tokenを使用し続けるワークロードを監視できます。そのmetiricにて、既存のワークロードが延長された有効期間に依存していないことを示している場合、`--service-account-extend-token-expiration=false`でkube-apiserverを起動することにより、挿入されたtokenの有効期間を1時間に短縮できます。([#95667](https://github.com/kubernetes/kubernetes/pull/95667), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle and Testing]

> :pencil: 
> BoundServiceAccountTokenVolumeがデフォルトで有効になりましたが、現在は有効期間を1年間に延長する措置が入っています。その場合、token自体は本来の有効期間をもとにローテーションされますが、古い方のtokenも(有効期間が延長されているため)しばらくはそのまま(有効期限を持たないレガシーなtokenと同じように)使い続けることが可能です。`serviceaccount_stale_tokens_total`では、そのような本来の有効期間(1時間)を超えてtokenを使っているようなワークロードの存在を監視できます。
> - https://qiita.com/hiyosi/items/35c22507b2a85892c707
> Bound Service Account Tokenへの切り替わりにあたっての確認事項
> - https://qiita.com/hiyosi/private/e24b65c11d9be7de9a97

- EndpointSlice ControllersがGAになりました。EndpointSliceControllerはdeprecatedTopologyフィールドを生成せず、zoneとnodeNameフィールドを通じてのみトポロジー情報を提供します。([#99870](https://github.com/kubernetes/kubernetes/pull/99870), [@swetharepakula](https://github.com/swetharepakula))

- PodDisruptionBudget APIがschema変更無しで`policy/v1`に昇格しました。唯一の機能的な変更点は、空のselector(`{}`)が`policy/v1` PodDisruptionBudgetに書き込まれた際、namespaceの全podを選択します。`policy/v1beta1` APIの動作に変更はありません。([#99290](https://github.com/kubernetes/kubernetes/pull/99290), [@mortent](https://github.com/mortent)) [SIG API Machinery, Apps, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Scheduling and Testing]

- Topology Aware Hintsがalphaで公開され、TopologyAwareHints feature gateで有効にできます。([#99522](https://github.com/kubernetes/kubernetes/pull/99522), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Instrumentation, Network and Testing]

### Feature

- client-goのmetricに`rest_client_exec_plugin_call_total`が追加され、client-goのcredential pluginのコール数の合計をトラッキングできるようになりました。 ([#98892](https://github.com/kubernetes/kubernetes/pull/98892), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery, Auth, Cluster Lifecycle and Instrumentation]

- HSTSヘッダを適切にセットするために、kube-apiserverに`--strict-transport-security-directives`を渡す機能を追加します。このフィールドを設定する前にブラウザへの影響を理解してください。([#96502](https://github.com/kubernetes/kubernetes/pull/96502), [@249043822](https://github.com/249043822)) [SIG Auth]

> :pencil: 
> HTTPSで提供されているkube-apiserverの応答に、HSTSヘッダがセットされていないというエラーが一部のセキュリティスキャナで報告されてようであり、それを回避するための設定とのこと。詳しくないですが、Webブラウザと通信しないような場合でも設定する効果はあるのでしょうか。

- KubernetesがGolang 1.16でビルドされるようになりました。([#98572](https://github.com/kubernetes/kubernetes/pull/98572), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Node, Release and Testing]

- RunAsGroup featureがこのリリースでGAに昇格しました。 ([#94641](https://github.com/kubernetes/kubernetes/pull/94641), [f@krmayankk](https://github.com/krmayankk)) [SIG Auth and Node]

- ServiceAccountIssuerDiscovery featureがGAに昇格し、無条件で有効になりました。ServiceAccountIssuerDiscovery feature-gateは 1.22で削除されます。([#98553](https://github.com/kubernetes/kubernetes/pull/98553), [@mtaufen](https://github.com/mtaufen)) [SIG API Machinery, Auth and Testing]

> :pencil: 
> 参考: https://qiita.com/hiyosi/items/43ddb0ff9b83070d95a8

- TTLAfterFinished feature flagがbetaになり、デフォルトで有効になりました。([#98678](https://github.com/kubernetes/kubernetes/pull/98678), [@ahg-g](https://github.com/ahg-g))

> :pencil: 終了したJobやPod,CustomResourceのTTLを設定することでクリーンアップを簡単にできるメカニズム。
> KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/592-ttl-after-finish


- RootCAConfigMap feature gateがGAに進んだことで、無条件で有効になります。このフラグはv1.22のリリースで削除されます。([#98033](https://github.com/kubernetes/kubernetes/pull/98033), [@zshihang](https://github.com/zshihang))

### Documentation

- N/A

### Failing Test

- N/A

### Bug or Regression

- Client-go exec credential pluginsは、stdin上でinteractive terminalが検出された場合にのみstdinを渡すようになりました。これにより、以前はstdinがinteractive terminalであるかどうかをチェックしていたバグが修正されました。 ([#99654](https://github.com/kubernetes/kubernetes/pull/99654), [@ankeesler](https://github.com/ankeesler))

- CSIMigrationがonになっている場合にAzure file migration e2e testの失敗を修正しました。([#97877](https://github.com/kubernetes/kubernetes/pull/97877), [@andyzhangx](https://github.com/andyzhangx))[SIG Auth, Cloud Provider and Storage]

- alwaysPullImages admission controllerで新しいイメージがないupdate podを無視します。([#96668](https://github.com/kubernetes/kubernetes/pull/96668), [@pacoxu](https://github.com/pacoxu)) [SIG Apps, Auth and Node]

- kubeletのログに含まれる`Failed to list *v1.Secret`または`Failed to list *v1.ConfigMap`という偽のメッセージを修正しました。([#99538](https://github.com/kubernetes/kubernetes/pull/99538), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node]

- kubectlでexec authプラグインを使用していて、同じexec authコンフィグから多数のclient instancesをbuildすることに対する警告が出なくなりました。 ([#97857](https://github.com/kubernetes/kubernetes/pull/97857), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Auth]

### Other (Cleanup or Flake)

- `k8s.io/kubernetes/pkg/kubelet/apis`にあったkubeletのannotationとlabelのAPIが`k8s.io/kubelet/pkg/apis/`の下に移動しました。([#98931](https://github.com/kubernetes/kubernetes/pull/98931), [@michaelbeaumont](https://github.com/michaelbeaumont))

- Kube-apiserver: OIDC authenticatorが、tokenの検証に必要なメタデータの取得を試みる際に、10秒間待つことがなくなりました。([#97693](https://github.com/kubernetes/kubernetes/pull/97693), [@enj](https://github.com/enj)) [SIG API Machinery and Auth]

- v1.17からGAであるCSINodeInfo feature gateが無条件に有効になり、`--feature-gates`引数で指定できなくなりました。([#96561](https://github.com/kubernetes/kubernetes/pull/96561), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Apps, Auth, Scheduling, Storage and Testing]

- デフォルトのdelegating authorization optionsで、healthz, readyz, livezへ未認証でアクセスが可能になりました。authz delegtorに接続する system:masters ユーザはauthzのチェックを行いません。([#98325](https://github.com/kubernetes/kubernetes/pull/98325), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth, Cloud Provider and Scheduling]

### Uncategorized

- N/A