はじめに
このページではKubernetes v1.26におけるSIG-Authに関連する取り組みについて、ChangelogのChanges By Kindの項目から紹介しています。ここに記載されていないものは別のまとめで記載されていると思いますので、 Kubernetes 1.26: 変更点まとめ も合わせて参照してみてください。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
Changes by Kind
Deprecation
- client-goとkubectlから
gcp
とazure
auth pluginが取り除かれました。クラウド固有の変更内容の詳細はkubeloginとKubectl Auth Changes in GKEを参照してください。 (#112341, @enj)
API Change
-
ResourceClaim
API(DynamicResourceAllocation
feature gate のものでresource.k8s.io/v1alpha1
API group)が追加されました。新しいAPIはPodが特別な種類のリソースを要求できるようになり、Nodeやクラスタその他実装したモデルで利用できるようになり、既存のDevice Pluginよりも柔軟になりました。 (#111023, @pohly) -
httpGet
を利用するコンテナのライフサイクルハンドラpreStop
とpostStart
は特定のscheme
とheader
フィールドを尊重します。これによりカスタムヘッダの設定やHTTPS
へのschemeの変更ができ、コンテナの startup/readiness/liveness probe機能と整合性がとれます。以前のリリースとの互換性のため、scheme: HTTPS
で設定されたライフサイクルハンドラでHTTPを使っていることを示すエラーが発生するとHTTPでリクエストするようにフォールバックします。これが起こった場合、LifecycleHTTPFallback
イベントがPodのnamespaceに記録され、kubeletのkubelet_lifecycle_handler_http_fallbacks_total
メトリックが増加するようになりました。クラスタ管理者はkubeletで--feature-gates=ConsistentHTTPGetHandlers=false
を設定することで機能のオプトアウトが可能です。(#86139, @jasimmons) -
PodDisruptionBudget
はalphaのspec.unhealthyPodEvictionPolicy
を追加しました。kube-api-server
でPDBUnhealthyPodEvictionPolicy
feature-gateが有効なときにこのフィールドをAlwaysAllow
に設定すると、PodDisruptionBudget
が有効かどうかにかかわらずready conditionを持たないpodをevictさせることができるようになります。(#113375, @atiratree) -
APIオブジェクトで指定される
metav1.LabelSelectors
は利用時にエラーとなる不正なlabel値を含んでいないことを保証するために検証されます。(#113699, @liggitt) -
自信のsubject attributesを取得するためのauth API(selfsubjectrevies API)を追加しました。対おうするkubectlコマンドは -
kubectl auth whoami
です。(#111333, @nabokihms)
-
Aggregated discoveryはalphaになり、
AggregatedDiscoveryEndpoint
feature flagで切り替えできます。(#113171, @Jefftree) -
"Retriable and non-retriable pod failures for jobs" (PodDisruptionConditions) 機能がbetaになりました。(#113360, @mimowo)
-
admission policiesを検証するv1alpha1 APIを導入し、CEL expression(KEP 3488: CEL for Admission Control)による拡張admission controlを有効にします。使用するには、
ValidatingAdmissionPolicy
feature gate と--runtime-config
でadmissionregistration.k8s.io/v1alpha1
を有効にしてください。(#113314, @cici37)
@uesyn さんが詳しい記事を書いてくれています。 https://qiita.com/uesyn/items/de3343d657bc4d0b0d8f
- KMS: configのauto reloadが有効な場合にkms configの名前の重複を検証します。APIサーバの
--encryption-provider-config-automatic-reload
フラグによりencryption configのauto reloadを有効にしている場合、encryption config内の全てのKMSプロバイダ名(v1 & v2)がユニークである必要があります。(#113697, @aramase)
v1.26では設定ファイルの自動リロードが実装されました.
https://github.com/kubernetes/kubernetes/pull/112050
-
DynamicKubeletConfig
feature gateがAPIサーバから削除されました。Dynamic kubelet reconfigurationは古いノードがこの機能に依存していたとしても利用できなくなります。これは、Kubernetesのversion skewのpolicyに則ったものです。(#112643, @SergeyKanzhelev)
Feature
- Pod Security admission: pod-securityの
warn
levelのデフォルトがenforce
levelの値になりました。(#113491, @tallclair)
enforce levelが設定されており、warn levelが設定されていない場合にenforce levelの値がwarn levelの値になります。enforce-version, warn-versionも同じような挙動と思われます。
https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces
-
DelegateFSGroupToCSIDriver
機能がGAになりました。(#113225, @bertinatto) -
新しい
DisableCompression
フィールド (default=false)がkubeconifgのcluster info配下に追加されました。trueにセットすると、kubeconfigを使用しているクライアントは、apiserverへのすべてのリクエストに対してレスポンス圧縮をオプトアウトします。これはクライアントとサーバのネットワーク帯域に余裕がある(>30MB/s)場合や、サーバがCPU制約がある場合にlist callのレイテンシを大幅に改善することができます。(#112309, @shyamjvs) -
API Server Tracingに様々な新しいspanやspan evnetsが追加されました。 (#113172, @dashpole)
-
API Server tracingのopentelemetryのためのroot span nameをKubernetesAPIからHTTP GETに変更されました。(#112545, @dims)
-
Golangのruntimeに関連した新しいメトリクスをKuberentesコンポーネントに追加しました。(#111910, @tosi3k)
- go_gc_cycles_automatic_gc_cycles_total
- go_gc_cycles_forced_gc_cycles_total
- go_gc_cycles_total_gc_cycles_total
- go_gc_heap_allocs_by_size_bytes
- go_gc_heap_allocs_bytes_total
- go_gc_heap_allocs_objects_total
- go_gc_heap_frees_by_size_bytes
- go_gc_heap_frees_bytes_total
- go_gc_heap_frees_objects_total
- go_gc_heap_goal_bytes
- go_gc_heap_objects_objects
- go_gc_heap_tiny_allocs_objects_total
- go_gc_pauses_seconds
- go_memory_classes_heap_free_bytes
- go_memory_classes_heap_objects_bytes
- go_memory_classes_heap_released_bytes
- go_memory_classes_heap_stacks_bytes
- go_memory_classes_heap_unused_bytes
- go_memory_classes_metadata_mcache_free_bytes
- go_memory_classes_metadata_mcache_inuse_bytes
- go_memory_classes_metadata_mspan_free_bytes
- go_memory_classes_metadata_mspan_inuse_bytes
- go_memory_classes_metadata_other_bytes
- go_memory_classes_os_stacks_bytes
- go_memory_classes_other_bytes
- go_memory_classes_profiling_buckets_bytes
- go_memory_classes_total_bytes
- go_sched_goroutines_goroutines
- go_sched_latencies_seconds
-
apiserverの
metrics/slis
にヘルスチェックのSLIメトリクスを公開しました。(#112741, @logicalhan) -
LegacyServiceAccountTokenNoAutoGeneration
feature gateがGAに昇格しました。(#112838, @zshihang)
v1.24からbetaでデフォルト有効になっていたSecretベースのService Account Tokenの作成機能がGAになりました。
- alphaの
LegacyServiceAccountTokenTracking
を有効にすると、SecretベースのService Account Tokenに最後に使った日付を含むkubernetes.io/legacy-token-last-used
が適用されるようになります。(#108858, @zshihang)
serviceaccount_legacy_tokens_total
と用途が似ている気がするが、metricはSecretベースのTokenを受け取った際にカウントされるもの。今回のものは使う側で最後に使った時刻が記録されるもの。の違いがある気がします。次のバージョンのv1.27でBeta予定。
またv1.27ではLegacyServiceAccountTokenCleanUp
がalphaで提供される予定。
see: KEP-2799: Reduction of Secret-based Service Account Tokens
-
v1.24でGAとなり無条件で有効である
CSRDuration
feature gateはv1.26で削除されます。(#112386, @Shubham82) -
kubectl config view
はdatapolicy tagでマークされたシークレットフィールドを保護するようになりました。(#109189, @mpuckett159)
Documentation
Bug or Regression
-
golang.org/x/net
をv0.1.1-0.20221027164007-c63010009c80
に上げました。(#112693, @aimuz) -
DelegatingAuthenticationOptions
を使っている呼び出し側が呼び出し元がDisableAnonymous
を使ってAnonymous認証を無効化できるようになりました(#112181, @xueqzhan) -
exec authを使っているときにkubectlで大量のオブジェクトを扱うと、適切でない接続管理により引き起こされるエフェメラルポート枯渇の不具合を修正しました。(#112017, @enj)
-
PodDisruptionConditions
feature gateが有効な場合に、NoExecute
でtaintされたノードPodが実行し続けられるようにコードを修正しました。(#112518, @mimowo) -
PodDisruptionConditions
feature gateが有効な場合、2min後にstale disruption conditionの状態を変更するために使われるdisruption controllerを修正しました。(#113580, @mimowo)
権限不足でpodのstatusを更新できなかった問題を修正していました(patch操作の許可)
- kube-apiserverで
--encryption-provider-config
ファイルでカスタムリソースを指定でき、etcdで暗号化できるようになりました。(#113015, @ritazh)
EncryptionConfiguration
を使ったオブジェクト暗号化でカスタムリリースを対象に指定しても暗号化できなかった問題があったようです。If custom resources are added to EncryptionConfiguration and the cluster version is 1.26 or newer, any newly created custom resources mentioned in the EncryptionConfiguration will be encrypted. Any custom resources that existed in etcd prior to that version and configuration will be unencrypted until they are next written to storage. This is the same behavior as built-in resources. See the Ensure all secrets are encrypted section.
https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration
Other (Cleanup or Flake)
- 新しいAPIサーバのflag
--encryption-provider-config-automatic-reload
が追加され、サーバ再起動の必要なく自動的にリロードされるようになりました。リロードが有効な場合すべてのKMS pluginsは/healthz/kms-providers
で単一のhealthzチェックにマージされるようになりました。(#113529, @enj)
例えばローカルでシークレットを管理している場合もローテーション時の再起動が不要になりオペレーション負荷が軽減されるのではないかと思います。シークレットのローテーションする場合、新しいシークレットを末尾に追加(再起動)、新しいシークレットを先頭に変更(再起動)、再暗号化、古いシークレットの削除(再起動)のようなフローで設定変更のたびに再起動が必要でした。
-
test/e2e/framework
をリファクタリングしたことでcore frameworkが小さくなりました。リソース監視、ログサイズ監視、メトリクス収集、デバッグ情報出力などのオプショナルな起動は特定のe2eテストスイートでインポートする必要があります。従来core frameworkにあった機能を再有効化するためのInitパッケージ提供されています。このPRによってコンパイルできなくなったコードがある場合、コミットメッセージのスクリプトを使ってコードを更新することができます。(#112043, @pohly) -
In-TreeのOpenStack cloud provider(とCinder volume provider)は削除されました。cloud-provider-openstackのcloud providerとcsi driverを使ってください。(#67782, @dims)
所感
KMS v2に関する仕様の整理や作業がもう少し進んでいると思いましたが、今バージョンでは設定の自動リロード機能の追加ぐらい(?)でした。
see: https://github.com/orgs/kubernetes/projects/94/views/1
その他にはSecretベースのService Account Tokenの退役についての作業も進んできています。
v1.26現在でSecretベースのToken自動生成はデフォルトで止まっていますが、今バージョンから最終利用時間が記録されるようになりました。今後は記録された最終利用時間から十分に時間が経過したもの(かつPodから参照されていないもの)を削除するような機能がリリースされる予定となっています。