Kubernetes 1.32 SIG Instrumentation の変更内容

- [Kubernetes 1.30 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/09b929fa5537babeaf6e)
- [Kubernetes 1.31 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/ae739b0a2085bd16c0f9)


## はじめに

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

Kubernetes v1.32 の SIG Instrumentation では 2 つの KEP が Alpha として導入されました。

これらの KEP で導入されているエンドポイントは Google 社でモニタリングやデバッグに有用なエンドポイントとして利用されている [z-pages](https://kubernetes.io/docs/reference/instrumentation/zpages/) の機能の一部となっています。z-pages の z はアプリケーション側のドメインで必要なエンドポイントと重複しないように `/healthz`、`/statusz`、 `/varz` などのサフィックスとして設けられた文字のようです。確かな情報がないため、知っている方がいればコメントで教えてください。
- [Where does the convention of using /healthz for application health checks come from? - Stack Overflow](https://stackoverflow.com/questions/43380939/where-does-the-convention-of-using-healthz-for-application-health-checks-come-f)

### [KEP-4827: Component Statusz](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/4827-component-statusz)

`/statusz` エンドポイントをコンポーネントに実装することを提案している KEP です。

`/statusz` エンドポイントを実装することで、外部スクリプトやコンポーネントごとに独自の方法で取得・提供していた情報を統一的なインターフェイスで提供できるようになります。また、このエンドポイントではビルドバージョン、Go のバージョン、互換性の詳細、その他の重要なコンポーネント情報の概要を提供することで、コンポーネントの可観測性が強化され、トラブルシューティングやデバッグに役立てることも目指しています。

個人的にはこれらの情報の多くはすでにメトリクスとして公開されており、インターフェイスに関しても component-base で実装すれば統一されるため、メトリクスとの使い分けが難しいと感じました。KEP のユーザーストーリーでは `/statusz` エンドポイントの参照権限を管理/監視/開発などを実施する最小限の人員に設定することが推奨されています。これによりセンシティブなデバッグ情報が意図せず公開されることを防ぐことができるため、権限や公開範囲を分離できるという点ではメリットがありそうです。

v1.32.0 ではレスポンス内容は次のような内容となっています。

```
kube-apiserver statusz
Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is for debugging purposes only.

Started:  Tue Jan  7 03:03:57 UTC 2025
Up:  0 hr 05 min 28 sec
Go version:  go1.23.3
Binary version:  1.32.0
Emulation version:  1.32
```

KEP では上記の内容に加えて z-pages のエンドポイントのリストを出力することも提案されています。

### [KEP-4828: Component Flagz](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/4828-component-flagz)

KEP-4827 の Component Statusz と同様に、z-pages のエンドポイントとして `/flagz` エンドポイントをコンポーネントに実装することを提案している KEP です。

このエンドポイントでは、コンポーネントのコマンドラインフラグや設定オプションのキーと値を表示します。

v1.32.0 の段階ではレスポンス内容は次のような内容となっています。

<details>

<summary>kind で起動した kube-apiserver の出力内容（一部抜粋）</summary>

```
kube-apiserver flags
Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is for debugging purposes only.

admission-control: []
admission-control-config-file: 
advertise-address: xx.xx.xx.xx
aggregator-reject-forwarding-redirect: true
allow-metric-labels: []
allow-metric-labels-manifest: 
allow-privileged: true
...
v: 0
vmodule: 
```

</details>


## メトリクスの変更

メトリクスの変更は、チェンジログだけでなく、ドキュメントの変更履歴からも確認できます。ドキュメントは [documentation-list.yaml](https://github.com/kubernetes/kubernetes/blob/master/test/instrumentation/documentation/documentation-list.yaml) のファイルから機械的に生成しています。

- [生成プログラム](https://github.com/kubernetes/kubernetes/blob/master/test/instrumentation/documentation/main.go)
- [Update metrics reference for v1.32 release by mengjiao-liu · Pull Request #48684 · kubernetes/website](https://github.com/kubernetes/website/pull/48684)
- [Update metrics docs for v1.32 release(Note this must be committed after the code freeze) by mengjiao-liu · Pull Request #128720 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/128720/files)

### kube-apiserver
- :new: フィーチャーゲート ExternalServiceAccountTokenSigner に関するメトリクスが追加されました([#128190](https://github.com/kubernetes/kubernetes/pull/128190), [@&#xFFF0;HarshalNeelkamal](https://github.com/HarshalNeelkamal))
  - Gauge: `apiserver_externaljwt_fetch_keys_data_timestamp`
  - Gauge: `apiserver_externaljwt_fetch_keys_success_timestamp`
  - Counter: `apiserver_externaljwt_fetch_keys_request_total`
    - Labels: `code`
  - Counter: `apiserver_externaljwt_sign_request_total`
    - Labels: `code`
  - Histogram: `apiserver_externaljwt_request_duration_seconds`
    - Labels: `code`、`method`
- :up: リソースを特定するために `resource` ラベルが追加されました([#126512](https://github.com/kubernetes/kubernetes/pull/126512), [@&#xFFF0;kmala](https://github.com/kmala))
  - Counter: `apiserver_storage_transformation_operations_total`
    - Labels: `resource`, `status`, `transformation_type`, `transformer_prefix`
- :bug: `ValidatingAdmissionPolicy` に関するメトリクスが修正され、経過時間が正しく記録されるようになりました([#128463](https://github.com/kubernetes/kubernetes/pull/128463), [@&#xFFF0;knrc](https://github.com/knrc))
  - Histogram: `apiserver_validating_admission_policy_check_duration_seconds`
    - Labels: `enforcement_action`、 `error_type`、`policy`、`policy_binding`
- :bug: ヘルプドキュメントが修正されました([#127898](https://github.com/kubernetes/kubernetes/pull/127898), [@&#xFFF0;modulitos](https://github.com/modulitos))
  - Counter: `apiserver_admission_webhook_fail_open_count`
    - Help: Admission webhook fail open count, identified by name and broken out for each admission type (validating or ~~mutating~~ admit).
  - Counter: `apiserver_admission_webhook_request_total`
    - Help: Admission webhook request total, identified by name and broken out for each admission type (validating or ~~mutating~~ admit) and operation. Additional labels specify whether the request was rejected or not and an HTTP status code. Codes greater than 600 are truncated to 600, to keep the metrics cardinality bounded.


### kubelet
- :new: CPU マネージャーにより管理されている CPU プールに関する情報を記録するメトリクスが追加されました([#127506](https://github.com/kubernetes/kubernetes/pull/127506), [@&#xFFF0;ffromani](https://github.com/ffromani))
  - Gauge: `kubelet_cpu_manager_shared_pool_size_millicores`
  - Gauge: `kubelet_cpu_manager_exclusive_cpu_allocation_count`
- :new: コンテナが割り当てられたコンピューティングリソースを記録するメトリクスが追加されました([#127155](https://github.com/kubernetes/kubernetes/pull/127155), [@&#xFFF0;ffromani](https://github.com/ffromani))
  - Counter: `kubelet_container_aligned_compute_resources_count`
    - Labels: `boundary`、`scope`
- :new: DRA のノード操作とDRA の gRPC のレイテンシを記録するメトリクスが追加されました([#127146](https://github.com/kubernetes/kubernetes/pull/127146), [@&#xFFF0;bart0sh](https://github.com/bart0sh))
  - Histogram: `dra_operations_duration_seconds`
    - Labels: `is_error`、`operation_name`
  - Histogram: `dra_grpc_operations_duration_seconds`
    - Labels: `driver_name`、`grpc_status_code`、`method_name`
- :new: アドミッション時に拒否された数を記録するメトリクスが追加されました([#128556](https://github.com/kubernetes/kubernetes/pull/128556), [@&#xFFF0;AnishShah](https://github.com/AnishShah))
  - Counter: `kubelet_admission_rejections_total`
    - Labels: `reason`
- :bug: ヘルプテキストが修正されました([#128189](https://github.com/kubernetes/kubernetes/pull/128189), [@&#xFFF0;zylxjtu](https://github.com/zylxjtu))
  - Gauge: `kubelet_graceful_shutdown_end_time_seconds`
    - Help: Last graceful shutdown ~~start~~ end time since unix epoch in seconds

### kube-controller-manager

- :new: `ResourceClaims` の総数と割り当て済みの `ResourceClaims` の数を記録するメトリクスが追加されました([#127661](https://github.com/kubernetes/kubernetes/pull/127661), [@&#xFFF0;pohly](https://github.com/pohly))
  - Gauge: `resourceclaim_controller_resource_claims`
  - Gauge: `resourceclaim_controller_allocated_resource_claims`
- :new: ClusterTrustBundle に関するメトリクスが追加されました([#127326](https://github.com/kubernetes/kubernetes/pull/127326), [@&#xFFF0;stlaz](https://github.com/stlaz))
  - Histogram: `clustertrustbundle_publisher_sync_duration_seconds`
    - Labels: `code`
  - Counter: `clustertrustbundle_publisher_sync_total`
    - Labels: `code`
- :new: 同じノードで同じボリュームを異なる SELinux コンテキストで使用すると、片方の Pod がボリュームにアクセスできなくなるため、対象の Pod を記録するメトリクスが追加されました([#128242](https://github.com/kubernetes/kubernetes/pull/128242), , [@&#xFFF0;jsafrane](https://github.com/jsafrane))
  - Custom: `selinux_warning_controller_selinux_volume_conflict`
    - Labels: `property`、`pod1_namespace`、`pod1_name`、`pod1_value`、`pod2_namespace`、`pod2_name`、`pod2_value`

### kube-scheduler
- :new: 現在のスケジューリングのキューでトラッキングされているイベントの数を記録するメトリクスが追加されました([#127052](https://github.com/kubernetes/kubernetes/pull/127052), [@&#xFFF0;sanposhiho](https://github.com/sanposhiho))
  - Gauge: `scheduler_inflight_events`
    - Labels: `event`
- :new: フィーチャーゲート `SchedulerAsyncPreemption` を有効にした場合、プリエンプションを実行するための goroutine の数と処理時間を記録するメトリクスが追加されました([#128170](https://github.com/kubernetes/kubernetes/pull/128170), [@&#xFFF0;sanposhiho](https://github.com/sanposhiho))
  - Counter: `scheduler_preemption_goroutines_execution_total`
    - Labels: `result`
  - Histogram: `scheduler_preemption_goroutines_duration_seconds`
    - Labels: `result`

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

- :new: [kube-apiserver] 冒頭で述べた [KEP-4828: Component Flagz](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/4828-component-flagz) に対応しました([#127581](https://github.com/kubernetes/kubernetes/pull/127581), [@&#xFFF0;richabanker](https://github.com/richabanker))
- :new: [kube-apiserver] 冒頭で述べた [KEP-4827: Component Statusz](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/4827-component-statusz) に対応しました([#125577](https://github.com/kubernetes/kubernetes/pull/125577), [@&#xFFF0;richabanker](https://github.com/richabanker))
- :new: [kubelet] カーネルバージョン 5.8 より古いバージョンで cgroup v2 を利用すると、警告ログやイベントを出力するようになりました([#126595](https://github.com/kubernetes/kubernetes/pull/126595), [@&#xFFF0;pacoxu](https://github.com/pacoxu))
- :up: [client-go/rest] リクエスト/レスポンスのコンテキストログに呼び出し元のソースコードの正確な位置情報を記録するように更新されました([#126999](https://github.com/kubernetes/kubernetes/pull/126999), [@&#xFFF0;pohly](https://github.com/pohly))
- :up: [kube-apiserver] `--tracing-config-file` オプションで指定された設定ファイルが厳密に検証されるようになりました。重複したフィールドや不明なフィールドが含まれているとエラーが発生します([#128073](https://github.com/kubernetes/kubernetes/pull/128073), [@&#xFFF0;seans3](https://github.com/seans3))
- :up: フィーチャーゲート ComponentSLIs が GA となったため削除されました([#128317](https://github.com/kubernetes/kubernetes/pull/128317)、[#127787](https://github.com/kubernetes/kubernetes/pull/127787), [@&#xFFF0;Jefftree](https://github.com/Jefftree))
- :bug: [kube-scheduler] `--allow-metric-labels` フラグが処理されるまで、メトリクスの初期化を遅延させます。この修正によりフラグの値を利用できることが保証され、ラベル値に `unexpected` と記録される不具合が修正されました([#126762](https://github.com/kubernetes/kubernetes/pull/126762), [@&#xFFF0;richabanker](https://github.com/richabanker))
- :bug: [kube-scheduler] [#126762](https://github.com/kubernetes/kubernetes/pull/126762) と同様の対応がされました([#128100](https://github.com/kubernetes/kubernetes/pull/128100), [@&#xFFF0;yongruilin](https://github.com/yongruilin))
- :bug: [kubelet] セキュアポート 10250 とインセキュアポート 10255 のどちらでアクセスしても `/metrics/slis` エンドポイントがアクセスできるように修正されました([#128430](https://github.com/kubernetes/kubernetes/pull/128430), [@&#xFFF0;richabanker](https://github.com/richabanker))
- :bug: [trace] 一部の子スパンと親スパンが並列に表示されていたので、子スパンと親スパンの間違った階層構造（具体的には `SerializeObject` と `List`）が修正されました([#127551](https://github.com/kubernetes/kubernetes/pull/127551), [@&#xFFF0;carlory](https://github.com/carlory))