はじめに(What’s New の内容含む)
ここでは、Kubernetes 1.29 の Changelog からメトリクスの変更と SIG Instrumentation の取り組みについてまとめています。
Kubernetes v1.29 で SIG Instrumentation が扱う主要なテーマはありませんが、SIG Instrumentation に関連した施策があるため記載します。
KEP-3077: Contextual Logging
Kubernetes v1.29 での構造化ロギングについては上記の公式ブログで紹介されています。
v1.24 から開始された構造化ロギングも、v1.29 では多くのコンポーネントが移行を完了しました。
マイルストーンはアルファのままですが、スケジューラコンポーネントで懸念されていたパフォーマンスもプロダクション環境で利用するログレベル(-v3 以下)では影響はないという調査結果となったため、現在 v1.30 でベータに移行する話が進んでいます。
KEP-2305: Dynamic Cardinality Enforcement
この KEP v1.29 で Beta に移行となり、こちらの実装が入りました。この KEP は以下の問題の解決を目指しています。
現在、Kubernetes のコンポーネントで提供されているメトリクスは、導入する際に制約がありません。そのためラベル値のカーディナリティが高いメトリクスが意図せずに追加されてしまうと、Prometheus などの計測するコンポーネントでメモリリークを引き起こす問題があります。この問題を解消するために、メトリクスのラベル値を許可リストにより制限する方法が検討されています。
過去に計測側のコンポーネントでメモリリークが発生した際は、修正・対応するために Kubernetes のバイナリ全体を再リリースする必要があった点も課題でした。そのため、この許可リストを動的に参照させる点もモチベーションになっています。
実装を見ると特にフィーチャーゲートは必要なく allow-metric-labels-manifest
フラグで設定ファイルを指定できるようになっています。 v1.21 では直接パラメータを指定できる allow-metric-labels
フラグも実装されています。
metricName,labelName=labelValue,labelValue,...
許可リストにないラベル値は、cardinality_enforcement_unexpected_categorizations_total
メトリクスによってカウントされます。
それでは、メトリクスの変更について説明していきます。
こちらは、私が全ての変更点からメトリクスに関連するものを抜粋した内容となります。
メトリクスの変更
component-base
- [MOD]
ComponentSLIs
フィーチャーゲートが GA となり、healthcheck
とhealthchecks_total
の StabilityLevel も Stable となりました(#120574, @logicalhan)
kube-apiserver
- [ADD]
CRDValidationRatcheting
フィーチャーゲートの機能であるバリデーション時間を計測するメトリクスが追加されました(#121462, @alexzielenski)- Histogram:
apiextensions_apiserver_validation_ratcheting_seconds
- Labels: {}
- Histogram:
- [ADD] Watch リクエストのレスポンス待ち時間を計測するメトリクスが追加されました。これは KEP-3157: allow informers for getting a stream of data instead of chunking に関連したもので処理性能の低下をモニタリングするために追加されました(#120490, @p0lyn0mial)
- Histogram:
apiserver_watch_list_duration_seconds
- Labels: {"group", "version", "resource", "scope"}
- Histogram:
- [ADD] 次のメトリクスが追加されました(#119385, @andrewsykim)
- Gauge:
apiserver_flowcontrol_current_inqueue_seats
- Labels: {"priority_level", "flow_schema"}
- Gauge:
- [ADD] clusterIP と nodePort の割当処理時に発生したエラー回数を計測するメトリクスが追加されました(#120843, @aojea)
- Counter:
apiserver_clusterip_repair_ip_errors_total
- Labels: {"type"}
- Counter:
apiserver_clusterip_repair_reconcile_errors_total
- Labels: {}
- Counter:
apiserver_nodeport_repair_port_errors_total
- Labels: {"type"}
- Counter:
apiserver_nodeport_repair_reconcile_errors_total
- Labels: {}
- Counter:
- [ADD] リクエストボディサイズを記録するメトリクスが公開されました。今までも実装はされていたようですが登録漏れだったようです(#120474, @YaoC)
-
apiserver_request_body_size_bytes
- Labels: {"resource", "verb"}
-
- [ADD] シークレットベースのサービスアカウントトークンを使用すると、使用されたシークレットの名前を含む
authentication.k8s.io/legacy-token-autogenerated-secret
またはauthentication.k8s.io/legacy-token-manual-secret
アノテーションが追加され、メトリクスにも計測されるようになりました(#118598, @yuanchen8911)- Counter:
serviceaccount_legacy_manual_token_uses_total
- Labels: {}
- Counter:
serviceaccount_legacy_auto_token_uses_total
- Labels: {}
- Counter:
- [FIX] KMS V2:
apiserver_id_hash
ラベルが追加されバグが修正されました(#120438, @ritazh)- Counter:
apiserver_encryption_config_controller_automatic_reload_failures_total
- Labels: {"apiserver_id_hash"}
- Histogram:
apiserver_encryption_config_controller_automatic_reload_last_timestamp_seconds
- Labels: "status", "apiserver_id_hash"}
- Counter:
apiserver_encryption_config_controller_automatic_reload_success_total
- Labels: {"apiserver_id_hash"}
- Counter:
- [MOD] KMS V2:
apiserver_id_hash
ラベルが追加されました#120438, @ritazh)- Counter:
apiserver_envelope_encryption_key_id_hash_total
- Labels: {"transformation_type", "provider_name", "key_id_hash", "apiserver_id_hash"}
- Histogram:
apiserver_envelope_encryption_key_id_hash_last_timestamp_seconds
- Labels: {"transformation_type", "provider_name", "key_id_hash", "apiserver_id_hash"}
- Histogram:
apiserver_envelope_encryption_key_id_hash_status_last_timestamp_seconds
- Labels: {"provider_name", "key_id_hash", "apiserver_id_hash"}
- Counter:
apiserver_encryption_config_controller_automatic_reload_failures_total
- Labels: {"apiserver_id_hash"}
- Counter:
apiserver_encryption_config_controller_automatic_reload_success_total
- Labels: {"apiserver_id_hash"}
- Histogram:
apiserver_encryption_config_controller_automatic_reload_last_timestamp_seconds
- Labels: {"status", "apiserver_id_hash"}
- Counter:
- [MOD] Prometheus のベストプラクティスに合わせてリネームされました(#120503, @dgrisonnet)
- Histogram:
apiserver_request_body_sizes
=>apiserver_request_body_size_bytes
- Labels: {"resource", "verb"}
- Histogram:
kubelet
- [ADD] Pod が起動するまでのレイテンシーを記録するメトリクスが追加されました。このレイテンシーはイメージのプルおよび Init コンテナの実行時間が含まれ、Pod の作成タイムスタンプからすべてのコンテナが開始されウォッチによって観測されるまでの時間となります。(#121041, @ruiwen-zhao)
- Histogram:
kubelet_pod_start_total_duration_seconds
- Labels: {}
- Histogram:
- [ADD] さまざまなステージのノード起動時間を記録するメトリクスが追加されました(#118568, @qiutongs)
- Gauge:
kubelet_node_startup_pre_kubelet_duration_seconds
- Labels: {}
- Gauge:
kubelet_node_startup_pre_registration_duration_seconds
- Labels: {}
- Gauge:
kubelet_node_startup_registration_duration_seconds
- Labels: {}
- Gauge:
kubelet_node_startup_post_registration_duration_seconds
- Labels: {}
- Gauge:
kubelet_node_startup_duration_seconds
- Labels: {}
- Gauge:
- [FIX] メトリクスのタイムスタンプにコンテナのスタートタイムを指定していたバグが修正されました(#120518, @saschagrunert)
- Gauge:
container_start_time_seconds
- Labels: {"container", "namespace", "pod"}
- Gauge:
- [MOD] バケット設定を変更しました(#120680, @ruiwen-zhao)
- Histogram:
kubelet_pod_start_duration_seconds
- Labels: {}
- Buckets: {0.5, 1, 2, 3, 4, 5, 6, 8, 10, 20, 30, 45, 60, 120, 180, 240, 300, 360, 480, 600, 900, 1200, 1800, 2700, 3600}
- Histogram:
- [MOD] StabilityLevel が Stable となりました(#116897, @Richabanker)
container_cpu_usage_seconds_total
container_memory_working_set_bytes
container_start_time_seconds
node_cpu_usage_seconds_total
node_memory_working_set_bytes
pod_cpu_usage_seconds_total
pod_memory_working_set_bytes
resource_scrape_error
- [DEPRECATED]
scrape_error
が非推奨となりました。代わりにresource_scrape_error
を利用してください。(#116897, @Richabanker)
kube-controller-manager
- [ADD] KEP-3902: TaintEvictionController が削除した Pod 数と Taint が付与されてから、TaintEvictionController によって削除されるまでの待ち時間を記録するメトリクスが追加されました(#119208, @atosatto)
- Counter:
taint_eviction_controller_pod_deletions_total
- Labels: {}
- Histogram:
taint_eviction_controller_pod_deletion_duration_seconds
- Labels: {}
- Counter:
- [ADD] ジョブコントローラーによって作成された Pod 数を記録するメトリクスが追加されました(#121481, @dejanzele)
- Gauge:
job_controller_job_pods_creation_total
- Labels: {"reason", "status"}
- Gauge:
- [ADD]
JobBackoffLimitPerIndex
フィーチャーゲートで利用されるメトリクスが追加されました(#121292, @mimowo)- Gauge:
job_controller_job_finished_indexes_total
- Labels: {"status", "backoffLimit"}
- Gauge:
- [MOD] バケット設定を変更しました(#120577, @alculquicondor)
- Histogram:
job_controller_job_sync_duration_seconds
- Labels: {"completion_mode", "result", "action"}
- Buckets: ExponentialBuckets(0.004, 2, 15)
- Histogram:
kube-scheduler
- [ADD] スケジューリングされる Pod の E2E 待ち時間を記録する SLI 用のメトリクスが追加されました。この値には Pod がスケジューリングのキューに入ってから、複数回のスケジューリング試行が行われる可能性があります。(#119049, @helayoty)
- Histogram:
scheduler_pod_scheduling_sli_duration_seconds
- Labels: {"attempts"}
- Histogram:
- [DEPRECATD] SLI に関するメトリクスが追加されたため、以下のメトリクスが非推奨となりました。このメトリクスは v1.31 で削除予定です。(#119049, @helayoty)
- Histogram:
scheduler_pod_scheduling_duration_seconds
- Labels: {"attempts"}
- Histogram:
kube-proxy
- なし
その他
- [ADD] データ暗号化キー(DEK)のソースキャッシュサイズを記録するメトリクスが追加されました。再起動後の値は KMS プラグインに対して行う復号化 RPC コール回数の概算値となります(#119878, @ritazh)
- Gauge:
apiserver_envelope_encryption_dek_source_cache_size
- Labels: {"provider_name"}
- Gauge:
メトリクス以外の変更点
- 冒頭で説明した KEP-2305: Dynamic Cardinality Enforcement で利用される
--allow-metric-labels-manifest
フラグが導入されました(#118299, @rexagod)
-
nodevolumelimits
スケジューラープラグインが構造化ロギングに移行しました(#116884, @mengjiao-liu)
-
volumebinding
スケジューラープラグインが構造化ロギングに移行しました(#116803, @mengjiao-liu)
- kube-scheduler を構造化ロギングに移行しました(#120933, @mengjiao-liu)