Kubernetes 1.30 SIG Instrumentation の変更内容

- [Kubernetes 1.28 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/7c14a68db116fed2847f)
- [Kubernetes 1.29 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/d6c63744ba8b65cea748)

## はじめに

ここでは Kubernetes v1.30 の [Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md) からメトリクスの変更と SIG Instrumentation の取り組みについてまとめました。

Kubernetes v1.30 では以下の KEP が Beta となりました。

### [KEP-3077: Contextual Logging](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/3077-contextual-logging)

前回の v1.29 がリリースされた時に公式からブログが公開されていますので、詳細はこちらの記事を参照してください。

- [Contextual logging in Kubernetes 1.29: Better troubleshooting and enhanced logging | Kubernetes](https://kubernetes.io/blog/2023/12/20/contextual-logging-in-kubernetes-1-29/)

その他にも以下の KEP が Stable となりました。

- [KEP-2305: Dynamic Cardinality Enforcement](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2305-metrics-cardinality-enforcement)
  - [Kubernetes 1.29 SIG Instrumentation の変更内容 KEP-2305: Dynamic Cardinality Enforcement](https://qiita.com/watawuwu/items/d6c63744ba8b65cea748#kep-2305-dynamic-cardinality-enforcement)
- [KEP-647: APIServer Tracing](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/647-apiserver-tracing)
  - [Alpha in Kubernetes v1.22: API Server Tracing | Kubernetes](https://kubernetes.io/blog/2021/09/03/api-server-tracing/)

## メトリクスの変更

### component-base

<!-- - Added `process_start_time_seconds` to `/metrics/slis` endpoint of all components.([#122750](https://github.com/kubernetes/kubernetes/pull/122750), [@&#xFFF0;richabanker](https://github.com/richabanker)) -->
- :new: すべてのコンポーネントの `/metrics/slis` エンドポイントにプロセスの開始時間を記録するメトリクスが追加されました([#122750](https://github.com/kubernetes/kubernetes/pull/122750), [@&#xFFF0;richabanker](https://github.com/richabanker))
  - Gauge: `process_start_time_seconds`
    - Labels: {}

### kube-apiserver

<!-- - Added the `apiserver_watch_cache_read_wait` metric to measure the watch cache impact on request latency.([#123190](https://github.com/kubernetes/kubernetes/pull/123190), [@&#xFFF0;padlar](https://github.com/padlar)) -->
- :new: ウォッチのキャッシュが新しくなるまでの待ち時間を測定するメトリクスが追加されました([#123190](https://github.com/kubernetes/kubernetes/pull/123190), [@&#xFFF0;padlar](https://github.com/padlar))
    - Histogram: `apiserver_watch_cache_read_wait`
      - Labels: {"resource"}
<!-- - kube-apiserver now reloads the `--authorization-config` file when it changes. Reloads increment the `apiserver_authorization_config_controller_automatic_reload_last_timestamp_seconds` timestamp metric, with `status="success"` for successful reloads and `status="failed"` for failed reloads. Failed reloads keep using the previously loaded authorization configuration.([#121946](https://github.com/kubernetes/kubernetes/pull/121946), [@&#xFFF0;liggitt](https://github.com/liggitt)) -->
- :new: `--authorization-config` で指定されたファイルが更新されるとリロードし、メトリクスに記録されるようになりました。リロードに成功した場合は `status="success"` 、失敗した場合は `status="failed"` が記録されます([#121946](https://github.com/kubernetes/kubernetes/pull/121946), [@&#xFFF0;liggitt](https://github.com/liggitt))
  - Gauge: `apiserver_authorization_config_controller_automatic_reload_last_timestamp_seconds`
    - Labels: {"status", "apiserver_id_hash"}
<!-- - kube-apiserver now reported the following metrics for authorization webhook match conditions: - `apiserver_authorization_match_condition_evaluation_errors_total` counter metric labeled by authorizer type and name - `apiserver_authorization_match_condition_exclusions_total` counter metric labeled by authorizer type and name - `apiserver_authorization_match_condition_evaluation_seconds` histogram metric labeled by authorizer type and name.([#123611](https://github.com/kubernetes/kubernetes/pull/123611), [@&#xFFF0;ritazh](https://github.com/ritazh)) -->
- :new: Authorization Webhook のマッチ条件について以下のメトリクスが記録されるようになりました([#123611](https://github.com/kubernetes/kubernetes/pull/123611), [@&#xFFF0;ritazh](https://github.com/ritazh))
  - Counter: `apiserver_authorization_match_condition_evaluation_errors_total`
    - Labels: {"type", "name"}
  - Counter: `apiserver_authorization_match_condition_exclusions_total`
    - Labels: {"type", "name"}
  - Histogram: `apiserver_authorization_match_condition_evaluation_seconds`
    - Labels: {"type", "name"}
<!-- - kube-apiserver: JWT authenticator now reports the following metrics: - apiserver_authentication_config_controller_automatic_reloads_total - apiserver_authentication_config_controller_automatic_reload_last_timestamp_seconds([#123793](https://github.com/kubernetes/kubernetes/pull/123793), [@&#xFFF0;aramase](https://github.com/aramase)) -->
- :new: JWT Authenticator で以下のメトリクスが記録されるようになりました([#123793](https://github.com/kubernetes/kubernetes/pull/123793), [@&#xFFF0;aramase](https://github.com/aramase))
  - Histogram: `apiserver_authentication_config_controller_automatic_reloads_total`
    - Labels: {"status", "apiserver_id_hash"}
  - Histogram: `apiserver_authentication_config_controller_automatic_reload_last_timestamp_seconds`
    - Labels: {"status", "apiserver_id_hash"}
<!-- - Added a new metric `apiserver_encryption_config_controller_automatic_reloads_total` to measure the total number of API server encryption configuration reload successes and failures.  This metric now contains the `status` label with a value that is either `success` or `failure`. Deprecated the metrics `apiserver_encryption_config_controller_automatic_reload_success_total` and `apiserver_encryption_config_controller_automatic_reload_failure_total`. Please use `apiserver_encryption_config_controller_automatic_reloads_total` instead.([123179](https://github.com/kubernetes/kubernetes/pull/123179), [@&#xFFF0;aramase](https://github.com/aramase)) -->
- :new: API サーバーの暗号化設定のリロード回数を記録するメトリクスが追加されました。このメトリクスは、`success` または `failure` を値とする `status` ラベルを持ちます([#123179](https://github.com/kubernetes/kubernetes/pull/123179), [@&#xFFF0;aramase](https://github.com/aramase))
  - Counter: `apiserver_encryption_config_controller_automatic_reloads_total`
    - Labels: {"status", "apiserver_id_hash"}
  - :warning: この変更にともない以下のメトリクスが非推奨となりました
    - `apiserver_encryption_config_controller_automatic_reload_success_total`
    - `apiserver_encryption_config_controller_automatic_reload_failure_total`
    - 代わりに上記で追加された `apiserver_encryption_config_controller_automatic_reloads_total` を利用してください
<!-- - Kube-apiserver now reports latency metric for JWT authenticator authenticate token decisions in the `apiserver_authentication_jwt_authenticator_latency_seconds` metric, labeled by jwtIssuer hash and result. ([#123225](https://github.com/kubernetes/kubernetes/pull/123225), [@&#xFFF0;aramase](https://github.com/aramase)) -->
- :new: JWT Authenticator のトークン認証のレイテンシを記録するメトリクスが追加されました([#123225](https://github.com/kubernetes/kubernetes/pull/123225), [@&#xFFF0;aramase](https://github.com/aramase))
  - Histogram: `apiserver_authentication_jwt_authenticator_latency_seconds`
    - Labels: {"result", "jwt_issuer_hash"}
<!-- - Kube-apiserver now reports metrics for authorization decisions in the `apiserver_authorization_decisions_total` metric, labeled by authorizer type, name, and decision. ([#123333](https://github.com/kubernetes/kubernetes/pull/123333), [@&#xFFF0;liggitt](https://github.com/liggitt)) -->
- :new: 認可の結果を `decision` ラベルに `allowed` と `denied` で記録するメトリクスが追加されました([#123333](https://github.com/kubernetes/kubernetes/pull/123333), [@&#xFFF0;liggitt](https://github.com/liggitt))
  - Counter: `apiserver_authorization_decisions_total`
    - Labels: {"type", "name", "decision"}
<!-- - Kube-apiserver: Authorization webhooks now report the following metrics: -->
<!--   - apiserver_authorization_webhook_evaluations_total -->
<!--   - apiserver_authorization_webhook_duration_seconds -->
<!--   - apiserver_authorization_webhook_evaluations_fail_open_total ([#123639](https://github.com/kubernetes/kubernetes/pull/123639), [@&#xFFF0;liggitt](https://github.com/liggitt)) -->
- :new: Authorization Webhook で次のメトリクスを記録するようになりました([#123639](https://github.com/kubernetes/kubernetes/pull/123639), [@&#xFFF0;liggitt](https://github.com/liggitt))
  - Counter: `apiserver_authorization_webhook_evaluations_total`
    - Labels: {"name", "result"}
  - Histogram: `apiserver_authorization_webhook_duration_seconds`
    - Labels: {"name", "result"}
  - Counter: `apiserver_authorization_webhook_evaluations_fail_open_total`
    - Labels: {"name", "result"}
<!-- - Renamed Label cluster to `storage_cluster_id` for `apiserver_storage_size_bytes metric` ([#124283](https://github.com/kubernetes/kubernetes/pull/124283), [dims](https://github.com/dims)) -->
<!-- - Bumped the stability level of apiserver_storage_size_bytes to `STABLE` ([#123342](https://github.com/kubernetes/kubernetes/pull/123342), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- :up: ラベル名をリネームし、StabilityLevel が Stable となりました([#124283](https://github.com/kubernetes/kubernetes/pull/124283), [dims](https://github.com/dims)) ([#123342](https://github.com/kubernetes/kubernetes/pull/123342), [@&#xFFF0;logicalhan](https://github.com/logicalhan))
  - Gauge: `apiserver_storage_size_bytes`
    - Labels: {"cluster" => "storage_cluster_id"}

### kubelet

<!-- - A new kubelet metric `image_pull_duration_seconds` was added. The metric tracks the duration (in seconds) it takes for an image to be pulled, including the time spent in the waiting queue of image puller. The metric is broken down by bucketed image size. ([#121719](https://github.com/kubernetes/kubernetes/pull/121719), [@&#xFFF0;ruiwen-zhao](https://github.com/ruiwen-zhao)) -->
- :new: 待機時間を含め、コンテナイメージがダウンロードされるまでの時間（秒）を記録するメトリクスが追加されました。このメトリクスはイメージサイズのラベルに持ち、以下の範囲ごとに記録されます([#121719](https://github.com/kubernetes/kubernetes/pull/121719), [@&#xFFF0;ruiwen-zhao](https://github.com/ruiwen-zhao))
  - Histogram: `kubelet_image_pull_duration_seconds`
    - Labels: {"image_size_in_bytes"}
    - `image_size_in_bytes` ラベルの値
      - {0-10MB, 10MB-100MB, 100MB-500MB, 500MB-1GB, 1GB-5GB, 5GB-10GB, 10GB-20GB, 20GB-30GB, 30GB-40GB, 40GB-60GB, 60GB-100GB, GT100GB}
<!-- - A new metric `lifecycle_handler_sleep_terminated_total` is added to record how many times LifecycleHandler sleep got unexpectedly terminated. ([#122456](https://github.com/kubernetes/kubernetes/pull/122456), [@&#xFFF0;AxeZhan](https://github.com/AxeZhan)) -->
- :new: LifecycleHandler のスリープが予期せず終了した回数を記録するメトリクスが追加されました([#122456](https://github.com/kubernetes/kubernetes/pull/122456), [@&#xFFF0;AxeZhan](https://github.com/AxeZhan))
  - Gauge: `kubelet_sleep_action_terminated_early_total`
    - Labels: {}
<!-- - Added kubelet metrics to track the memory manager allocation and pinning. ([#121778](https://github.com/kubernetes/kubernetes/pull/121778), [@&#xFFF0;Tal-or](https://github.com/Tal-or)) -->
- :new: Memory Manager のピニングの割当を記録するメトリクスが追加されました([#121778](https://github.com/kubernetes/kubernetes/pull/121778), [@&#xFFF0;Tal-or](https://github.com/Tal-or))
  - Counter: `kubelet_memory_manager_pinning_requests_total`
    - Labels: {}
  - Counter: `kubelet_memory_manager_pinning_errors_total`
    - Labels: {}
<!-- - Added a new internal metric `kubelet_first_network_pod_start_sli_duration_second` in the kubelet that allowed developers to understand the source of the latency problems on node startups.([#121720](https://github.com/kubernetes/kubernetes/pull/121720), [@&#xFFF0;aojea](https://github.com/aojea)) -->
- :new: 開発者がノード起動時の遅延問題の原因を把握できるように、最初のネットワーク Pod が起動するのにかかる時間（イメージのダウンロードやinitコンテナの実行時間を除く）を記録するメトリクスが追加されました。Pod 作成のタイムスタンプから、すべてのコンテナが起動しウォッチで観測されるまでの時間（秒）となります([#121720](https://github.com/kubernetes/kubernetes/pull/121720), [@&#xFFF0;aojea](https://github.com/aojea))。
  - Gauge: `kubelet_first_network_pod_start_sli_duration_seconds`
    - Labels: {}
<!-- - Added a "reason" field to the "image_garbage_collected_total" metric, allowing administrators to differentiate between images that were collected for reasons "age" vs "space".([#123345](https://github.com/kubernetes/kubernetes/pull/123345), [@&#xFFF0;haircommander](https://github.com/haircommander)) -->
- :up: `age` と `space` の値を持つ `reason` ラベルが追加されました。これにより何が要因でコンテナイメージが GC されたかが区別できるようになりました([#123345](https://github.com/kubernetes/kubernetes/pull/123345), [@&#xFFF0;haircommander](https://github.com/haircommander))
  - Counter: `kubelet_image_garbage_collected_total`
    - Labels: {"reason"}
<!-- - Added the `access_mode` label to `volume_manager_selinux_*` metrics. ([#123667](https://github.com/kubernetes/kubernetes/pull/123667), [@&#xFFF0;jsafrane](https://github.com/jsafrane)) -->
- :up: `RWX`、`ROX`、`RWO`、`RWOP` などの値を持つ、`access_mode` ラベルが追加されました[#123667](https://github.com/kubernetes/kubernetes/pull/123667), [@&#xFFF0;jsafrane](https://github.com/jsafrane))
  - `volume_manager_selinux_*`
    - Labels: {"access_mode"}

### kube-scheduler

<!-- - Scheduler now skips the `NodeAffinity Score` plugin when it has nothing to do with a Pod. You might have noticed an increase in the metric `plugin_execution_duration_seconds` for `extension_point=score` and `plugin=NodeAffinity`, because the plugin only runs when it's relevant.([#117024](https://github.com/kubernetes/kubernetes/pull/117024), [@&#xFFF0;sanposhiho](https://github.com/sanposhiho)) -->
- :up: 不要な時は `NodeAffinity Score` プラグインをスキップするようになりました。そのため次のメトリクスが増加している可能性があります([#117024](https://github.com/kubernetes/kubernetes/pull/117024), [@&#xFFF0;sanposhiho](https://github.com/sanposhiho))
  - Histogram: `scheduler_plugin_execution_duration_seconds{extension_point="score", plugin="NodeAffinity"}`
<!-- - Fixed the deprecated version for `pod_scheduling_duration_seconds` that caused the metric to be hidden by default in `1.29`.([#123038](https://github.com/kubernetes/kubernetes/pull/123038), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor)) -->
- :warning: 非推奨バージョンが `1.28` から `1.29` に修正されました([#123038](https://github.com/kubernetes/kubernetes/pull/123038), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor))
  - `scheduler_pod_scheduling_duration_seconds`
    - 代替は `scheduler_pod_scheduling_sli_duration_seconds` を利用してください

### kube-proxy

- なし

### その他

<!-- - Bumped cAdvisor to `v0.49.0`.([#123599](https://github.com/kubernetes/kubernetes/pull/123599), [@&#xFFF0;bobbypage](https://github.com/bobbypage)) -->
- cAdvisor: `v0.49.0` に更新されました([#123599](https://github.com/kubernetes/kubernetes/pull/123599), [@&#xFFF0;bobbypage](https://github.com/bobbypage))
<!-- - Client-go: Optimized leaders renewing leases by updating leader lock optimistically without getting the record from the API server first. Also, a new metric `leader_election_slowpath_total` was added to allow users to monitor how many leader elections are updated non-optimistically.([#122069](https://github.com/kubernetes/kubernetes/pull/122069), [@&#xFFF0;linxiulei](https://github.com/linxiulei)) -->
- client-go:  リーダーが最適化されずに更新されているかどうかを監視できるメトリクスが追加されました([#122069](https://github.com/kubernetes/kubernetes/pull/122069), [@&#xFFF0;linxiulei](https://github.com/linxiulei))。
  - Counter: `leader_election_slowpath_total`
    - Labels: {"name"}

## メトリクス以外の変更点

<!-- - Contextual logging is now in beta and enabled by default. Check out the [KEP](https://github.com/kubernetes/enhancements/issues/3077) and [official documentation](https://kubernetes.io/docs/concepts/cluster-administration/system-logs/#contextual-logging) for more details. ([#122589](https://github.com/kubernetes/kubernetes/pull/122589), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- 構造化ロギングはベータとなりデフォルトで有効になりました([#122589](https://github.com/kubernetes/kubernetes/pull/122589), [@&#xFFF0;pohly](https://github.com/pohly))
  - 詳しくは[KEP](https://github.com/kubernetes/enhancements/issues/3077)と[公式ドキュメント](https://kubernetes.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)を確認してください
<!-- - Migrated the cmd/kube-proxy to use [contextual logging](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging). ([#122197](https://github.com/kubernetes/kubernetes/pull/122197), [@&#xFFF0;fatsheep9146](https://github.com/fatsheep9146)) [SIG Network] -->
- kube-proxy: [構造化ロギング](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)が使えるようになりました([#122197](https://github.com/kubernetes/kubernetes/pull/122197), [@&#xFFF0;fatsheep9146](https://github.com/fatsheep9146))
<!-- - Enabled concurrent log rotation in kubelet. You can now configure the maximum number of concurrent rotations with the `containerLogMaxWorkers` setting, and adjust the monitoring interval with `containerLogMonitorInterval`. ([#114301](https://github.com/kubernetes/kubernetes/pull/114301), [@&#xFFF0;harshanarayana](https://github.com/harshanarayana)) -->
- kubelet: 同時にログローテーションを行う機能が有効になりました。これは、`containerLogMaxWorkers` という設定により、実行可能な同時ローテーションの最大数を決定します。また、`containerLogMonitorInterval` という設定で監視期間を設定します([#114301](https://github.com/kubernetes/kubernetes/pull/114301), [@&#xFFF0;harshanarayana](https://github.com/harshanarayana))
<!-- - Text logging in Kubernetes components now uses [textlogger](https://pkg.go.dev/k8s.io/klog/v2@&#xFFF0;v2.120.0/textlogger). The same split streams of info and error log entries with buffering of info entries is now also supported for text output (off by default, alpha feature). Previously, this was only supported for JSON. Performance is better also without split streams. ([#114672](https://github.com/kubernetes/kubernetes/pull/114672), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- コンポーネントのテキストロギングに[textlogger](https://pkg.go.dev/k8s.io/klog/v2@v2.120.0/textlogger)が使われるようになりパフォーマンスが向上しました([#114672](https://github.com/kubernetes/kubernetes/pull/114672), [@&#xFFF0;pohly](https://github.com/pohly))
<!-- - Kube-controller-manager: increased the global level for broadcaster's logging to 3 so that users can ignore event messages by lowering the logging level. It reduces information noise. ([#122293](https://github.com/kubernetes/kubernetes/pull/122293), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu)) -->
- kube-controller-manager: Broadcaster ロギングのグローバルレベルを 3 に更新し、ログベルを下げることでユーザーがイベントメッセージを無視できるようにしました。これによりログのノイズが減少します([#122293](https://github.com/kubernetes/kubernetes/pull/122293), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu))
<!-- - The `apiserver.latency.k8s.io/decode-response-object` annotation was added to the audit log to record the decoding time. ([#121512](https://github.com/kubernetes/kubernetes/pull/121512), [@&#xFFF0;HirazawaUi](https://github.com/HirazawaUi)) -->
- audit-log: `apiserver.latency.k8s.io/decode-response-object` アノテーションが追加され、デコード時間が記録されるようになりました([#121512](https://github.com/kubernetes/kubernetes/pull/121512), [@&#xFFF0;HirazawaUi](https://github.com/HirazawaUi))