3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes 1.29 SIG Instrumentation の変更内容

Last updated at Posted at 2024-01-16

はじめに(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 となり、healthcheckhealthchecks_total の StabilityLevel も Stable となりました(#120574, @￰logicalhan)

kube-apiserver

  • [ADD] CRDValidationRatcheting フィーチャーゲートの機能であるバリデーション時間を計測するメトリクスが追加されました(#121462, @￰alexzielenski)
    • Histogram: apiextensions_apiserver_validation_ratcheting_seconds
      • Labels: {}
  • [ADD] 次のメトリクスが追加されました(#119385, @￰andrewsykim)
    • Gauge: apiserver_flowcontrol_current_inqueue_seats
      • Labels: {"priority_level", "flow_schema"}
  • [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: {}
  • [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: {}
  • [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"}
  • [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"}
  • [MOD] Prometheus のベストプラクティスに合わせてリネームされました(#120503, @￰dgrisonnet)
    • Histogram: apiserver_request_body_sizes => apiserver_request_body_size_bytes
      • Labels: {"resource", "verb"}

kubelet

  • [ADD] Pod が起動するまでのレイテンシーを記録するメトリクスが追加されました。このレイテンシーはイメージのプルおよび Init コンテナの実行時間が含まれ、Pod の作成タイムスタンプからすべてのコンテナが開始されウォッチによって観測されるまでの時間となります。(#121041, @￰ruiwen-zhao)
    • Histogram: kubelet_pod_start_total_duration_seconds
      • Labels: {}
  • [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: {}
  • [FIX] メトリクスのタイムスタンプにコンテナのスタートタイムを指定していたバグが修正されました(#120518, @￰saschagrunert)
    • Gauge: container_start_time_seconds
      • Labels: {"container", "namespace", "pod"}
  • [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}
  • [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: {}
  • [ADD] ジョブコントローラーによって作成された Pod 数を記録するメトリクスが追加されました(#121481, @￰dejanzele)
    • Gauge: job_controller_job_pods_creation_total
      • Labels: {"reason", "status"}
  • [ADD] JobBackoffLimitPerIndex フィーチャーゲートで利用されるメトリクスが追加されました(#121292, @￰mimowo)
    • Gauge: job_controller_job_finished_indexes_total
      • Labels: {"status", "backoffLimit"}
  • [MOD] バケット設定を変更しました(#120577, @￰alculquicondor)
    • Histogram: job_controller_job_sync_duration_seconds
      • Labels: {"completion_mode", "result", "action"}
      • Buckets: ExponentialBuckets(0.004, 2, 15)

kube-scheduler

  • [ADD] スケジューリングされる Pod の E2E 待ち時間を記録する SLI 用のメトリクスが追加されました。この値には Pod がスケジューリングのキューに入ってから、複数回のスケジューリング試行が行われる可能性があります。(#119049, @￰helayoty)
    • Histogram: scheduler_pod_scheduling_sli_duration_seconds
      • Labels: {"attempts"}
  • [DEPRECATD] SLI に関するメトリクスが追加されたため、以下のメトリクスが非推奨となりました。このメトリクスは v1.31 で削除予定です。(#119049, @￰helayoty)
    • Histogram: scheduler_pod_scheduling_duration_seconds
      • Labels: {"attempts"}

kube-proxy

  • なし

その他

  • [ADD] データ暗号化キー(DEK)のソースキャッシュサイズを記録するメトリクスが追加されました。再起動後の値は KMS プラグインに対して行う復号化 RPC コール回数の概算値となります(#119878, @￰ritazh)
    • Gauge: apiserver_envelope_encryption_dek_source_cache_size
      • Labels: {"provider_name"}

メトリクス以外の変更点

  • 冒頭で説明した KEP-2305: Dynamic Cardinality Enforcement で利用される --allow-metric-labels-manifest フラグが導入されました(#118299, @￰rexagod)
  • kube-scheduler のロギングレベル v3でのパフォーマンス・リグレッションを修正し、構造化ロギングに移行しました(#121715, @￰pohly)
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?