Kubernetes 1.19: SIG-Auth の変更内容


## はじめに

このページではKubernetes v1.19におけるSIG-Authに関連する取り組みをまとめています。
ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.19: 変更点まとめ(後日公開) も合わせて参照してみてください。

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

# k8s 1.19 変更点調査

## Changes by Kind

**Deprecation**


- `authentication.k8s.io/v1beta1` と `authorization.k8s.io/v1beta1`が1.19でdeprecatedになり`v1`をラベルを優先します。非推奨のラベルは1.22で削除されます。  ([#90458](https://github.com/kubernetes/kubernetes/pull/90458), [@deads2k](https://github.com/deads2k)) [SIG API Machinery and Auth]

**API Change**

- CertificateSigningRequest API conditions フィールドが更新されました。([#90191](https://github.com/kubernetes/kubernetes/pull/90191), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps, Auth, CLI and Node]
    - `status` フィールドが追加されました。このフィールドはデフォルト`True`で、`Approved`、`Denied`および`Failed`の条件に対してのみ`True`をセットできます。
    - `lastTransitionTime`フィールドが追加されました。
    - signersが恒久的な失敗を示すことができるようにcondition type として`Failed`が追加されました。このconditionは`certificationsigningrequests/status`サブリソースを介して追加できます。
    - `Approved`と`Denied`は相互排他になりました。 
        - 📝 あるリソースの複数のconditionsレコードでtypeとしてApprovedとDeniedの両方利用されている場合にはvalidationエラーになるようです。
    - CSRから`Approved`、`Denied`、および`Failed`のconditionを削除することはできなくなりました。


    📝 
    > APIVersion v1 に向けて、v1beta1として必要な機能の追加のようです。
    > KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/20190607-certificates-api.md


- kube-controller-managerによって管理されるsignersは異なる証明書と秘密鍵を持つことができるようになりました。`--cluster-signing-[signer-name]-{cert,key}-file`に関するヘルプを参照してください。`--cluster-signing-{cert,key}-file` はデフォルトのままです。([#90822](https://github.com/kubernetes/kubernetes/pull/90822), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Apps and Auth]


    📝 
    > --cluster-signing-{cert,key}-file を指定して共通のものを使うか、--cluster-singing-[singer-name]-{cert,key}-file を指定して、それぞれ異なるものを使うか選べるようになったようです。
    > singersについては https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers


- SeccompのサポートがGAになりました。新しく`seccompProfile`フィールドがpodとcontainerのsecurityContextオブジェクトに追加されました。`seccomp.security.alpha.kubernetes.io/pod`と`container.seccomp.security.alpha.kubernetes.io/…`アノテーションは非推奨になり、v.122で削除されます。([#91381](https://github.com/kubernetes/kubernetes/pull/91381), [@pjbgf](https://github.com/pjbgf)) [SIG Apps, Auth, Node, Release, Scheduling and Testing]


- 非推奨になったアノテーションを新しいAPIフィールドに同期させるために、seccomp profileのpod version skew strategyを追加しました。([#91408](https://github.com/kubernetes/kubernetes/pull/91408), [@saschagrunert](https://github.com/saschagrunert)) [SIG Apps, Auth, CLI and Node]


    📝 


    > 新しいAPIフィールドとアノテーションに同じ値が設定されるようにコピーしたりする仕組みのようです。
    > KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190717-seccomp-ga.md#version-skew-strategy


- alpha版であった`DynamicAuditing`のfeature gateと`auditregistration.k8s.io/v1alpha1` APIは削除され、サポートされなくなりました。([#91502](https://github.com/kubernetes/kubernetes/pull/91502), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Auth and Testing]


    📝 
    > 既存のaudit webhookを使って同じユースケースに対応することができると考えていて、コアの以外の部分で対応するようなことを推奨するようです。
    > 参考 KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0014-dynamic-audit-configuration.md



- カスタムEndpointsはEndpointSliceMirroring controllerによってEndpointSlicesにミラーされるようになりました。 ([#91637](https://github.com/kubernetes/kubernetes/pull/91637), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Cloud Provider, Instrumentation, Network and Testing]


    📝 
    > EndpointからEndpointSliceの変更するKEPの一環として、アプリケーションが場合によってカスタムEndpointを作成しているような場合、EndpointとEndpointSliceの両方をケアする必要がないようにミラーリングするcontrollerが用意されたようです


- CertificateSigningRequest APIがcertificates.k8s.io/v1に昇格し、以下の変更が入りました。 ([#91685](https://github.com/kubernetes/kubernetes/pull/91685), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Architecture, Auth, CLI and Testing]
    - `spec.signerName`が必須になり、`certificates.k8s.io/v1` API経由での`kubernetes.io/legacy-unknown`へのリクエストは許可されなくなりました。
    - `spec.usages`が必須になりました。重複した値は含まず、定義されたusagesの値のみを含まなければいけません。
    - `status.conditions`は重複したtypeを含むことはできません
    - `status.conditions[*].status`が必須になりました。
    - `status.certificate`はPEM-encodedでなければならず、CERTIFICATE blockのみを含みます。


    📝 
    > usage: https://github.com/kubernetes/kubernetes/blob/v1.19.0/pkg/apis/certificates/validation/validation.go#L148-L172
    > https://github.com/kubernetes/kubernetes/blob/v1.19.0/pkg/apis/certificates/types.go#L158-L184


- Scheduler: オプショナルでunbound volumesを持つpodをスケジューリングする前に利用可能なストレージの容量をチェックします。(新しいalphaの`CSIStorageCapacity` feature gateの機能で、CSI driverのみで動作しCSI driver deploymentのサポートに依存します) ([#92387](https://github.com/kubernetes/kubernetes/pull/92387), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, Scheduling, Storage and Testing]


- Go 1.14.4がKubernetesをビルドするために必要な最低バージョンになりました。([#92438](https://github.com/kubernetes/kubernetes/pull/92438), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Storage and Testing]


- 新しいalphaの機能のGeneric ephemeral volumesは、`GenericEphemeralVolume` feature gate で提供される`EmptyDir`の代わりになるより柔軟な機能です。`EmptyDir`と同様に、VolumeはKubernetesによってpod毎に自動的に作成・削除されます。しかし、通常のプロビジョニングプロセス(`PersistentVolumeClaim`)が使われるため、ストレージはサードパーティのストレージベンダーから提供することができ、通常のVolume機能も機能します。Volumeは空にする必要はなく、例えばスナップショットからのリストアもサポートされています。([#92784](https://github.com/kubernetes/kubernetes/pull/92784), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, CLI, Instrumentation, Node, Scheduling, Storage and Testing]


    📝 
    > SIG-Storageのまとめのほうでで詳しく紹介されると思います


- Kubernetes は golang 1.15.0-rc.1 でビルドされるようになりました。
    - X.509 証明書のSubject Alternative Namesが無い場合にCommonNameをホスト名として扱うという非推奨でレガシーな動作がデフォルトで無効になりました。GODEBUG環境変数でx509ignoreCN=0を追加することで一時的に再有効化することができます。([#93264](https://github.com/kubernetes/kubernetes/pull/93264), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Storage and Testing]


    📝 
    > GODEBUG=x509ignoreCN=0はGo 1.16で削除される予定だとして、SANに値をセットしていない環境はGo 1.16(6ヶ月後)までに証明書更新できるのかな…？
    > 
    > c.f. https://github.com/golang/go/issues/39568

**Feature**


- kube-apiserver:  NodeRestriction admission pluginは、kubeletが新しいNodeを作成する際に`--node-lables`でセットすることができるNodeラベルを1.16以上で容認されているパラメータに制限するようになりました。([#90307](https://github.com/kubernetes/kubernetes/pull/90307), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node]


    📝 
    > これまでは、Update時はエラーになっていてCreate時はログに警告が出るようになっていましたが、Create時もエラーになるようになったようです。
    > 
    > kubeletが自身で設定するラベルを許可されたラベル/プリフィックスに制限する、以下のKEPの最後の作業のようです。
    > KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0000-20170814-bounding-self-labeling-kubelets.md
    
- クライアント証明書をローテートするように設定されたkubeletは、`certificate_manager_server_ttl_seconds`ゲージメトリックを公開するようになりました。([#91148](https://github.com/kubernetes/kubernetes/pull/91148), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node]


- kube-controller-manager: `--experimental-cluster-singing-duration`フラグは非推奨になり、v1.22で削除されます。このフラグは`--cluster-singing-duration`に置き換えられました。([#91154](https://github.com/kubernetes/kubernetes/pull/91154), [@liggitt](https://github.com/liggitt)) [SIG Auth and Cloud Provider]


- `certificatesigningrequests/approval` subresourceは patch リクエストをサポートしました。 ([#91558](https://github.com/kubernetes/kubernetes/pull/91558), [@liggitt](https://github.com/liggitt)) [SIG Auth and Testing]


- RotateKubeletClientCertificate feature gateはGAに昇格しました。RotateKubeletClientCertificate パラメータは1.20で削除されます。([#91780](https://github.com/kubernetes/kubernetes/pull/91780), [@liggitt](https://github.com/liggitt)) [SIG Auth and Node]

**Bug or Regression**

- kubectlのAzure認証モジュールがrefresh tokenが失効した後に認証を要求するようになりました。 ([#86481](https://github.com/kubernetes/kubernetes/pull/86481), [@tdihp](https://github.com/tdihp)) [SIG API Machinery and Auth]


- PodにバインドされたService Account TokenがPodのdeletion grace periodの間利用できるようになりました。([#89583](https://github.com/kubernetes/kubernetes/pull/89583), [@liggitt](https://github.com/liggitt)) [SIG Auth]


    📝 
    > 変更前はDeletionTimestampがセットされている場合にToken(JWT)の検証をエラーにしていたものを、DeletionTimestampがGrace Periodを経過してる場合にエラーとするようになったようです。これによってPodはgrace period中もAPIリクエストを行うことができるようになりました。


- Nameに `.` が含まれるService Accountのクレデンシャルのマウントの問題を修正。([#89696](https://github.com/kubernetes/kubernetes/pull/89696), [@nabokihms](https://github.com/nabokihms)) [SIG Auth]


    📝 
    > SAのNameに’.’が含まれている場合、PodがSAトークンのマウントに失敗する問題があったようです。


- kubectl azure authentication:  1.18.0 でkubeconfig ファイルの apiserver-id 設定に "spn:" prefixが予期せず追加されていた問題を修正。([#89706](https://github.com/kubernetes/kubernetes/pull/89706), [@weinong](https://github.com/weinong)) [SIG API Machinery and Auth]


    📝 
    > AzureADを使った認証において、トークンのaudienceを表すresourceパラメータについて、認証APIのバージョンによって”spn:” prefixが付いている場合と付いていない場合があり、挙動の違いを吸収するためのフラグが追加されましたが、その際に混入した不具合のようです。


- OwnerReferencesPermissionEnforcement validation admission pluginが有効がクラスタでEndpointSlice controllerがエラー無しで実行されるように修正。([#89741](https://github.com/kubernetes/kubernetes/pull/89741), [@marun](https://github.com/marun)) [SIG Auth and Network]


    📝 
    > endpointslice-controllerに`service/finalizers`リソースに対する`update`の権限が追加されたようです

 

-  RBAC roleとbindingオブジェクトのガベージコレクションを防ぐリグレッションを修正 ([#90534](https://github.com/kubernetes/kubernetes/pull/90534), [@apelisse](https://github.com/apelisse)) [SIG Auth]


    📝 
    > (Cluster)RoleやRoleBindingのオブジェクトの更新に伴う権限昇格のチェックの中で、オブジェクトのGCに関連するフィールドの更新についてはチェックがskipされていましたが、ManagedFieldsは対象になっておらずエラーになる場合があったようです。


- v1 CSR APIを提供するサーバに対して `kubectl certificate approve/deny` を使用している問題を解決します。 ([#91691](https://github.com/kubernetes/kubernetes/pull/91691), [@liggitt](https://github.com/liggitt)) [SIG Auth and CLI]


    📝 
    > 古いバージョン(1.16-1.18)のkubectlでは、v1beta1のAPIを使うようにする修正のようです。


- bearer token(kubectl --token=…)とexecプラグインが同じコンテキストで設定されている場合の曖昧な挙動を修正しました。bearer tokenが優先されるようになりました。 ([#91745](https://github.com/kubernetes/kubernetes/pull/91745), [@anderseknert](https://github.com/anderseknert)) [SIG API Machinery, Auth and Testing]


- Kubeletに証明書のブートストラップ時にsignalを認識させる。([#92786](https://github.com/kubernetes/kubernetes/pull/92786), [@answer1991](https://github.com/answer1991)) [SIG API Machinery, Auth and Node]