Kubernetes 1.24: SIG-Auth の変更内容

## はじめに

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

v1.24からは`LegacyServiceAccountTokenNoAutoGeneration`がデフォルトで有効になり、SecretベースのService Account Tokenが作成されなくなります。
詳細は[アップグレード時の注意事項](https://qiita.com/uesyn/items/90ca3789ce88cb9ea7a4#%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85)を参照してください。


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

## Changes by Kind

### Deprecation

- `client.authentication.k8s.io/v1alpha1` ExecCredential は削除されました。v1alpha1 APIに依存するclient-go credential pluginを使用している場合、v1 APIへの移行方法についてはプラグインの配布元に問い合わせてください。([#108616](https://github.com/kubernetes/kubernetes/pull/108616), [@margocrawf](https://github.com/margocrawf)) 

  > :pencil: v1.22でGAに昇格し`client.authentication.k8s.io/v1`が提供されています。
  > KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/541-external-credential-providers

- in-treeのAzure Pluginはdeprecatedになりました。Azure kubelogin pluginがkubectl/client-goのcredential pluginの機能を使ったout-of-treeの代替として提供されます。このdeprecationに関する警告をログに表示します。([#107904](https://github.com/kubernetes/kubernetes/pull/107904), [@sabbey37](https://github.com/sabbey37))

  > :pencil: ↑と同じKEPの流れ

- metadata.clusterName fieldはdeprecatedになりました。このfieldは常に書き込み不可で空白で紛らわしい存在であったため、次のリリースで削除します。慎重を期して、削除前にこのリリースでは不意に利用しているclientを発見するためにgo構造体の名前を変更しています。([#108717](https://github.com/kubernetes/kubernetes/pull/107904), [@lavalamp](https://github.com/kubernetes/kubernetes/pull/108717))


### API Change

- CSIStorageCapacity.storage.k8s.io: このAPIはv1になりv1beta1バージョンはdeprecatedになり、v1.27で削除されます。CSI driverがstorage capacity trackingをサポートしている場合、v1 API をサポートする external-provisioner とデプロイされる必要があります。([#108445[(https://github.com/kubernetes/kubernetes/pull/108445), [@pohly](https://github.com/pohly)) 

- v1beta1のPodDisruptionBudgetがselector fieldに対するstrategic merge patch type APIリクエスト処理の不具合を修正。1.21以前は、これらのリクエストはmatchLabelsコンテンツをマージ、matchExpressionsコンテンツをリプレースしていた。1.21では、selectorフィールドに関するpatchリクエストはselector全体を置き換えル用になりました。これは、server side applyとv1のPodDisruptionBudgetの動作と一致していますが、v1beta1では変更されるべきではありませんでした。([#108138](https://github.com/kubernetes/kubernetes/pull/108138), [@liggitt](https://github.com/liggitt))

- kubectlのhelpコマンドの可読性を改善しました。([#104736](https://github.com/kubernetes/kubernetes/pull/104736), [@lauchokyip](https://github.com/lauchokyip)) 

- ClusterCIDRConfigにv1alpha1 networking APIを導入しました。 ([#108290](https://github.com/kubernetes/kubernetes/pull/108290), [@sarveshr7](https://github.com/sarveshr7))

- 新しい `sync_proxy_rules_no_local_endpoints_total` proxy metricを導入しました。このmetricはinternal endpointを持たないserviceの数を表します。`traffic_policy` labelにはinternalまたはexternalが含まれます。([#108930](https://github.com/kubernetes/kubernetes/pull/108930), [@MaxRenaud](https://github.com/MaxRenaud))

- kube-apiserver: `--audit-log-version` と `--audit-webhook-version` はデフォルト値の `audit.k8s.io/v1`のみをサポートします。1.13からdeprecatedになっていたv1alpha1とv1beta1 audit log versionは削除されました。([#108092](https://github.com/kubernetes/kubernetes/pull/108092), [@carlory](https://github.com/carlory))

- kube-apiserver: `metadata.selflink` fieldはkube-apiserverによって追加されなくなります。1.16でdeprecatedになり1.20以降はデフォルトで追加されていません。 ([#107527](https://github.com/kubernetes/kubernetes/pull/107527), [@wojtek-t](https://github.com/wojtek-t))

- https://git.k8s.io/kubernetes/api/openapi-spec でキャプチャされている静的なopenapiファイルからenum宣言を取り除きました。このファイルはAPI clientを生成するために使われており、生成されたclientでenumを使用するとそれらのfieldに将来追加される値との前方互換性が壊れる可能性があります。詳細は https://issue.k8s.io/109177。([#109178](https://github.com/kubernetes/kubernetes/pull/109178), [@liggitt](https://github.com/liggitt))

- OpenAPI V3がデフォルトonになりました。([#109031](https://github.com/kubernetes/kubernetes/pull/109031), [@Jefftree](https://github.com/Jefftree))

- ClusterCIDRConfigのv1alpha1 networking APIが削除されました。([#109436](https://github.com/kubernetes/kubernetes/pull/109436), [@JamesLaverack](https://github.com/JamesLaverack))

- `evictions_number` metricsは`evictions_total`にリネームし安定版となりました。元の`evictions_number`のメトリクス名は1.23でdeprecatedとなり、削除されます。([#106366](https://github.com/kubernetes/kubernetes/pull/106366), [@cyclinder](https://github.com/cyclinder))

- CertificateSigningRequestの`spec.expirationSeconds` API fieldがGAになりました。`CSRDuration` future gateは無条件で有効となり1.26で削除されます。 ([#108782](https://github.com/kubernetes/kubernetes/pull/108782), [@cfryanr](https://github.com/cfryanr)) 

- kubeletから`DynamicKubeletConfig` featureが削除されました。([#106932](https://github.com/kubernetes/kubernetes/pull/106932), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev))

  > :pencil: v1.22でdeprecated & default disableになっていました

- contextual loggingのインフラが完備されました (feature gateの実装、JSONバックエンドの用意) ([#108995](https://github.com/kubernetes/kubernetes/pull/108995), [@pohly](https://github.com/pohly))

### Feature

- x-kubernetes-valiation ルールのCELの正規表現パターンは定数文字列として与えられている場合にCRDのcreate/update時にコンパイルされます。正規表現のコンパイルエラーはCRDのvalidation errorとしてレポートされます。([#108617](https://github.com/kubernetes/kubernetes/pull/108312), [@jpbetz](https://github.com/jpbetz)) 

- テキスト形式で、これまで複数行の出力を防ぐために引用符を使っていたログメッセージ（例えば、text="some "quotation", anline break"）が、エスケープシーケンスなしでより読みやすい複数行で出力されるようになりました。([#107103](https://github.com/kubernetes/kubernetes/pull/107103), [@pohly](https://github.com/pohly))

- HPAが`external.metrics.k8s.io` APIグループを消費することを許可するポリシーを導入します。([#104244](https://github.com/kubernetes/kubernetes/pull/104244), [@dgrisonnet](https://github.com/dgrisonnet))

- kube-apiserver: statusやscaleのようなsubresourceが表形式の出力をサポートするようになりました。([#103516](https://github.com/kubernetes/kubernetes/pull/103516), [@ykakarap](https://github.com/ykakarap)) 

- kube-apiserver: リストをマージするとき、Server Side Apply は既存の永続化されたオブジェクトではなく、送信されたリクエストの順序を優先するようになりました。([f#107565](https://github.com/kubernetes/kubernetes/pull/107565), [@jiahuif](https://github.com/jiahuif)) 

- Kubernetesはgo1.18rc1でビルドされるようになりました。 ([#107105](https://github.com/kubernetes/kubernetes/pull/107105), [@justaugustus](https://github.com/justaugustus)) 

- volume expantion featureがGAになりました。([#108929](https://github.com/kubernetes/kubernetes/pull/108929), [@gnufied](https://github.com/gnufied))

- `golang.org/x/net`が`v0.0.0-20211209124913-491a49abca63`に更新されました。([#106949](https://github.com/kubernetes/kubernetes/pull/106949), [@cpanato](https://github.com/cpanato))

- `kubectl create token`でservice account tokenをリクエストできるようになり、service account tokenを要求する権限がeditとadminのRBACロールに追加されました。([#107880](https://github.com/kubernetes/kubernetes/pull/107880), [@liggitt](https://github.com/liggitt))

### Bug or Regression

- gRPC modeでegress selectorを使った際のkube-apiserverのgoroutineのリークを修正するために`sigs.k8s.io/apiserver-network-proxy/konnectivity-client@v0.0.30`に更新。([#108437](https://github.com/kubernetes/kubernetes/pull/108437), [@andrewsykim](https://github.com/andrewsykim))

- exec pluginの認証情報がkubeconfigに設定された証明書情報を上書きしてしまう不具合を修正しました。([#107410](https://github.com/kubernetes/kubernetes/pull/107410), [@margocrawf](https://github.com/margocrawf))

- basic-authとsshのsecretのvalidationエラーメッセージの不具合を修正しました。([#106179](https://github.com/kubernetes/kubernetes/pull/106179), [@vivek-koppuru](https://github.com/vivek-koppuru))

- kube-apiserver: Server Side Apply mergeの順序は http://issue.k8s.io/104641 が解決されるまで v1.22 の動作と一致するように戻されます。([#106660](https://github.com/kubernetes/kubernetes/pull/106660), [@liggitt](https://github.com/liggitt))

- 冗長度の高いdebugメッセージであるにもかかわらず、JSON出力で "v":0と記録されていたログメッセージを修正しました。 ([#106978](https://github.com/kubernetes/kubernetes/pull/106978), [@pohly](https://github.com/pohly)) 


- NodeRestriction admission: RecoverVolumeExpansionFailure featureが有効な場合に、nodeが PersistentVolumeClaim のstatusフィールド resizeStatus と allocatedResources を更新することができるようになりました。([#107686](https://github.com/kubernetes/kubernetes/pull/107686), [@gnufied](https://github.com/gnufied))

- `--service-account-extend-token-expiration` が true で、かつ要求されたtoken audienceが空か`--api-audiences`のすべての値と正確に一致するときのみ、token lifetimeを延長します。

  > :pencil: `--service-account-extend-token-expiration` はBound Service Account Tokenへのマイグレーションにあたり、一時的に長期間のBound Service Account Tokenが発行されるようにするフラグです。
  > これが有効な状態において、別途ProjectedVolumeを使ってPodに渡したSA Tokenの有効期限がspecで指定したexpirationSecondsの値ではなく1yが設定されてしまう問題があったようです
  > audienceをチェックしてkube-apiserver向けに限定されたtokenの有効期限のみを1yに上書きするように修正されたようですが、ユーザが明示的に指定した場合はそのままその値を使ったほうがわかりやすい気がしましたが難しいのかな。

- AppArmor profileがローカルノードにロードされている場合の検証を削除しました。これは、コンテナランタイムによって処理されるべきです。([#97966](https://github.com/kubernetes/kubernetes/pull/97966), [@saschagrunert](https://github.com/saschagrunert))

### Other (Cleanup or Flake)

- `k8s.io/apimachinery/util/clock` typeはdeprecatedになりました。`k8s.io/utils/clock`を代わりに使ってください。([#106850](https://github.com/kubernetes/kubernetes/pull/106850), [@MadhavJivrajani](https://github.com/MadhavJivrajani))

- [k8s.io/utils/clock]: IntervalClockはSimpleIntervalClockによりdeprecatedになりました。([#108059](https://github.com/kubernetes/kubernetes/pull/108059), [@RaghavRoy145](https://github.com/RaghavRoy145))
 

## 所感

v1.24では特に目新しい機能の追加などは無さそうでしたが、いくつか新しいKEPが作られており、特にKMS v2については鍵のローテーションの課題(手動オペレーションが必要)についても解消を目指しているようで詳しく読んでみたいと思いました。

- [KEP-3299: KMS v2 Improvements](https://github.com/kubernetes/enhancements/pull/3302)
- [KEP-3257: Trust Anchor Set](https://github.com/kubernetes/enhancements/pull/3258)

その他、次のv1.25ではPodSecurityがGAになる予定です。