Kubernetes 1.17: Metrics Changes と SIG Instrumentation の変更内容

# Kubernetes 1.17: Metrics Changes と SIG Instrumentation の変更内容

- [Kubernetes 1.15 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/01162b0ae3b262c32695)
- [Kubernetes 1.16 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/e22c23c2a999ed5f8eaa)

## はじめに
v1.17 では前回の v1.16 に引き続き、KEP: [Metrics Stability Migration](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190605-metrics-stability-migration.md) が進められています。

その影響でいくつかのメトリクスが非表示となったので、古いメトリクスを使用している場合は、移行が必要となる点に注意してください。  
ただし Stability Framework の戦略に沿ったメトリクスで、コードから削除されず非表示になっただけのメトリクスは、`show-hidden-metrics-for-version` フラグを指定することで、メトリクスを出力できます。

- [Update KEP about the escape hatch flag.](https://github.com/kubernetes/enhancements/commit/3c80dc48b60b725339f285088c0c420d395609dd#diff-c00067f457d9d83f57a28fc275853931)

例えば [`rest_client_request_latency_seconds`](https://github.com/kubernetes/kubernetes/pull/83836/files)メトリクスは、次の通り v1.17 からは表示されない設定になりました。

```
# オプションをなしで起動
 ❯❯ minikube start --kubernetes-version 1.17.0

# proxy 経由でコンポーネントにアクセスするために proxy コマンドを実行
 ❯❯ kubectl proxy --port 8080

# apiserver のメトリクスを取得するが、`rest_client_request_latency_seconds`メトリクスは表示されない
 ❯❯ curl -sLf http://localhost:8080/metrics |grep rest_client_request_latency_seconds

# grep 終了ステータスは 1 となる
 ❯❯ echo $?
1
```

このような場合でも、フラグに`show-hidden-metrics-for-version=1.16`を設定することでメトリクスを表示できます。
ただし、このフラグは KEP に記載されている通り、メトリクスが移行できなかった場合の救済措置として使用するものなので、基本的にはメトリクス移行をするようにした方が良いでしょう。

```
# show-hidden-metrics-for-version を 1.16 で指定し起動
 ❯❯ minikube start --kubernetes-version 1.17.0 --extra-config=apiserver.show-hidden-metrics-for-version=1.16

# proxy 経由でコンポーネントにアクセスするために proxy コマンドを実行
 ❯❯ kubectl proxy --port 8080

# apiserver のメトリクスを取得すると、`rest_client_request_latency_seconds`メトリクスが表示される
 ❯❯ curl -sLf http://localhost:8080/metrics |grep rest_client_request_latency_seconds
# HELP rest_client_request_latency_seconds [ALPHA] (Deprecated since 1.14.0) Request latency in seconds. Broken down by verb and URL.
# TYPE rest_client_request_latency_seconds histogram
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.001"} 12
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.002"} 124
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.004"} 164
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.008"} 177
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.016"} 183
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.032"} 187
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.064"} 187
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.128"} 204
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.256"} 210
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="0.512"} 210
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/%7Bprefix%7D",verb="GET",le="+Inf"} 210
rest_client_request_latency_seconds_sum{url="https://[::1]:8443/%7Bprefix%7D",verb="GET"} 3.3186713230000024
rest_client_request_latency_seconds_count{url="https://[::1]:8443/%7Bprefix%7D",verb="GET"} 210
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.001"} 0
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.002"} 3
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.004"} 6
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.008"} 8
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.016"} 9
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.032"} 11
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.064"} 11
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.128"} 11
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.256"} 11
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="0.512"} 11
rest_client_request_latency_seconds_bucket{url="https://[::1]:8443/healthz",verb="GET",le="+Inf"} 11
rest_client_request_latency_seconds_sum{url="https://[::1]:8443/healthz",verb="GET"} 0.08930866600000001
rest_client_request_latency_seconds_count{url="https://[::1]:8443/healthz",verb="GET"} 11

# grep 終了ステータスは 0 となる
 ❯❯ echo $?
0
```

v1.17.0 時点では`show-hidden-metrics-for-version`フラグを持つコンポーネントは apiserver だけのようでしたが、今後のバージョンで[他のコンポーネントにも追加されていくと思われます](https://github.com/kubernetes/kubernetes/pull/85279)。

それでは CHANGELOG を見ていきます。

## メトリクスの変更（Metrics Changes）
### 追加されたメトリクス（Added metrics）
#### scheduler
<!-- - Add `scheduler_goroutines` metric to track number of kube-scheduler binding and prioritizing goroutines ([#83535](https://github.com/kubernetes/kubernetes/pull/83535), [@&#xFFF0;wgliang](https://github.com/wgliang)) -->
- `scheduler_goroutines`
    -  kube-scheduler のゴルーチン数を記録し、`prioritizing_extender` と `binding` のラベルを持ちます([#83535](https://github.com/kubernetes/kubernetes/pull/83535), [@&#xFFF0;wgliang](https://github.com/wgliang))

<!-- - Add `plugin_execution_duration_seconds` metric for scheduler framework plugins. ([#84522](https://github.com/kubernetes/kubernetes/pull/84522), [@&#xFFF0;liu-cong](https://github.com/liu-cong)) -->
- `plugin_execution_duration_seconds`
    - スケジュールフレームワークのプラグインごとの実行時間を記録します([#84522](https://github.com/kubernetes/kubernetes/pull/84522), [@&#xFFF0;liu-cong](https://github.com/liu-cong))

<!-- - Add `permit_wait_duration_seconds` metric to the scheduler. ([#84011](https://github.com/kubernetes/kubernetes/pull/84011), [@&#xFFF0;liu-cong](https://github.com/liu-cong)) -->
- `permit_wait_duration_seconds`
    - RunPermitPlugins での待機時間が記録されます([#84011](https://github.com/kubernetes/kubernetes/pull/84011), [@&#xFFF0;liu-cong](https://github.com/liu-cong))

#### controll-manager
<!-- - Adding initial EndpointSlice metrics. ([#83257](https://github.com/kubernetes/kubernetes/pull/83257), [@&#xFFF0;robscott](https://github.com/robscott)) -->
- `endpoint_slice_controller_endpoints_added_per_sync`、`endpoint_slice_controller_endpoints_removed_per_sync`、`endpoint_slice_controller_endpoints_desired`、`endpoint_slice_controller_num_endpoint_slices`、`endpoint_slice_controller_desired_endpoint_slices`、`endpoint_slice_controller_changes`
    - [EndpointSlice](https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/) のメトリクスが追加されました([#83257](https://github.com/kubernetes/kubernetes/pull/83257), [@&#xFFF0;robscott](https://github.com/robscott))

#### kubelet
<!-- - A new `kubelet_preemptions` metric is reported from Kubelets to track the number of preemptions occuring over time, and which resource is triggering those preemptions. ([#84120](https://github.com/kubernetes/kubernetes/pull/84120), [@&#xFFF0;smarterclayton](https://github.com/smarterclayton)) -->
- `kubelet_preemptions`
    - 時間の経過とともに発生するプリエンプションの数を記録し、トリガーとなるリソースをラベルに持ちます([#84120](https://github.com/kubernetes/kubernetes/pull/84120), [@&#xFFF0;smarterclayton](https://github.com/smarterclayton))

#### apiserver
<!-- - Adds a metric `apiserver_request_error_total` to kube-apiserver. This metric tallies the number of `request_errors` encountered by verb, group, version, resource, subresource, scope, component, and code. ([#83427](https://github.com/kubernetes/kubernetes/pull/83427), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- `apiserver_request_error_total`
    - apiserver のリクエストエラー数を記録し、`verb`, `group`, `version`, `resource`, `subresource`, `scope`, `component`, `code`のラベルを持ちます([#83427](https://github.com/kubernetes/kubernetes/pull/83427), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - Kube-apiserver: Added metrics `authentication_latency_seconds` that can be used to understand the latency of authentication. ([#82409](https://github.com/kubernetes/kubernetes/pull/82409), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- `authentication_latency_seconds`
    - 認証処理のレイテンシーを記録し、`success|failure|error`などの値が入る、`result`ラベルを持ちます([#82409](https://github.com/kubernetes/kubernetes/pull/82409), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))

### 非推奨/変更されたメトリクス（Deprecated/changed metrics）

#### etcd
<!-- - etcd version monitor metrics are now marked as with the ALPHA stability level. ([#83283](https://github.com/kubernetes/kubernetes/pull/83283), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスの Stability Level が ALPHA となりました([#83283](https://github.com/kubernetes/kubernetes/pull/83283), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `etcd_version_info`

#### kubelet
<!-- - Following metrics from kubelet are now marked as with the ALPHA stability level: -->
<!--   `kubelet_container_log_filesystem_used_bytes` -->
<!--   `kubelet_volume_stats_capacity_bytes` -->
<!--   `kubelet_volume_stats_available_bytes` -->
<!--   `kubelet_volume_stats_used_bytes` -->
<!--   `kubelet_volume_stats_inodes` -->
<!--   `kubelet_volume_stats_inodes_free` -->
<!--   `kubelet_volume_stats_inodes_used` -->
<!--   `plugin_manager_total_plugins` -->
<!--   `volume_manager_total_volumes` -->
<!--   ([#84907](https://github.com/kubernetes/kubernetes/pull/84907), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
<!-- - Following metrics from kubelet are now marked as with the ALPHA stability level: -->
<!--   `node_cpu_usage_seconds_total` -->
<!--   `node_memory_working_set_bytes` -->
<!--   `container_cpu_usage_seconds_total` -->
<!--   `container_memory_working_set_bytes` -->
<!--   `scrape_error` -->
<!--   ([#84987](https://github.com/kubernetes/kubernetes/pull/84987), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスの Stability Level が ALPHA となりました([#84907](https://github.com/kubernetes/kubernetes/pull/84907), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango), [#84987](https://github.com/kubernetes/kubernetes/pull/84987), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `kubelet_container_log_filesystem_used_bytes`
    - `kubelet_volume_stats_capacity_bytes`
    - `kubelet_volume_stats_available_bytes`
    - `kubelet_volume_stats_used_bytes`
    - `kubelet_volume_stats_inodes`
    - `kubelet_volume_stats_inodes_free`
    - `kubelet_volume_stats_inodes_used`
    - `plugin_manager_total_plugins`
    - `volume_manager_total_volumes`
    - `node_cpu_usage_seconds_total`
    - `node_memory_working_set_bytes`
    - `container_cpu_usage_seconds_total`
    - `container_memory_working_set_bytes`
    - `scrape_error`

### kube-controller-manager
<!-- - Following metrics from kube-controller-manager are now marked as with the ALPHA stability level: -->
<!--   `storage_count_attachable_volumes_in_use` -->
<!--   `attachdetach_controller_total_volumes` -->
<!--   `pv_collector_bound_pv_count` -->
<!--   `pv_collector_unbound_pv_count` -->
<!--   `pv_collector_bound_pvc_count` -->
<!--   `pv_collector_unbound_pvc_count` -->
<!--   ([#84896](https://github.com/kubernetes/kubernetes/pull/84896), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスの Stability Level が ALPHA となりました([#84896](https://github.com/kubernetes/kubernetes/pull/84896), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `storage_count_attachable_volumes_in_use`
    - `attachdetach_controller_total_volumes`
    - `pv_collector_bound_pv_count`
    - `pv_collector_unbound_pv_count`
    - `pv_collector_bound_pvc_count`
    - `pv_collector_unbound_pvc_count`

#### apiserver
<!-- - Following metrics have been turned off: -->
<!--   `apiserver_request_count` -->
<!--   `apiserver_request_latencies` -->
<!--   `apiserver_request_latencies_summary` -->
<!--   `apiserver_dropped_requests` -->
<!--   `etcd_request_latencies_summary` -->
<!--   `apiserver_storage_transformation_latencies_microseconds` -->
<!--   `apiserver_storage_data_key_generation_latencies_microseconds` -->
<!--   `apiserver_storage_transformation_failures_total` -->
<!--   ([#83837](https://github.com/kubernetes/kubernetes/pull/83837), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスは v1.17 より出力されない設定となりました([#83837](https://github.com/kubernetes/kubernetes/pull/83837), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `apiserver_request_count`
    - `apiserver_request_latencies`
    - `apiserver_request_latencies_summary`
    - `apiserver_dropped_requests`
    - `etcd_request_latencies_summary`
    - `apiserver_storage_transformation_latencies_microseconds`
    - `apiserver_storage_data_key_generation_latencies_microseconds`
    - `apiserver_storage_transformation_failures_total`

### scheduler
<!-- - Change `pod_preemption_victims` metric from Gauge to Histogram. ([#83603](https://github.com/kubernetes/kubernetes/pull/83603), [@&#xFFF0;Tabrizian](https://github.com/Tabrizian)) -->
- `pod_preemption_victims`
    - メトリクスのタイプが Gauge から Histogram に変更されました([#83603](https://github.com/kubernetes/kubernetes/pull/83603), [@&#xFFF0;Tabrizian](https://github.com/Tabrizian))

<!-- - Following metrics have been turned off: -->
<!--   `scheduler_scheduling_latency_seconds` -->
<!--   `scheduler_e2e_scheduling_latency_microseconds` -->
<!--   `scheduler_scheduling_algorithm_latency_microseconds` -->
<!--   `scheduler_scheduling_algorithm_predicate_evaluation` -->
<!--   `scheduler_scheduling_algorithm_priority_evaluation` -->
<!--   `scheduler_scheduling_algorithm_preemption_evaluation` -->
<!--   `scheduler_scheduling_binding_latency_microseconds ([#83838](https://github.com/kubernetes/kubernetes/pull/83838`), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスは v1.17 より出力されない設定となりました([#83838](https://github.com/kubernetes/kubernetes/pull/83838), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `scheduler_scheduling_latency_seconds`
    - `scheduler_e2e_scheduling_latency_microseconds`
    - `scheduler_scheduling_algorithm_latency_microseconds`
    - `scheduler_scheduling_algorithm_predicate_evaluation`
    - `scheduler_scheduling_algorithm_priority_evaluation`
    - `scheduler_scheduling_algorithm_preemption_evaluation`
    - `scheduler_scheduling_binding_latency_microseconds`

### kubeproxy
<!-- - Deprecated metric `kubeproxy_sync_proxy_rules_latency_microseconds` has been turned off. ([#83839](https://github.com/kubernetes/kubernetes/pull/83839), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスは v1.17 より出力されない設定となりました([#83839](https://github.com/kubernetes/kubernetes/pull/83839), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `kubeproxy_sync_proxy_rules_latency_microseconds`

### その他
<!-- - Deprecated metric `rest_client_request_latency_seconds` has been turned off. ([#83836](https://github.com/kubernetes/kubernetes/pull/83836), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- 次のメトリクスは v1.17 より出力されない設定となりました([#83836](https://github.com/kubernetes/kubernetes/pull/83836), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `rest_client_request_latency_seconds`

<!-- - Deprecated prometheus request meta-metrics have been removed -->
<!--  `http_request_duration_microseconds` `http_request_duration_microseconds_sum` `http_request_duration_microseconds_count` -->
<!--  `http_request_size_bytes` -->
<!--  `http_request_size_bytes_sum` -->
<!--  `http_request_size_bytes_count` -->
<!--  `http_requests_total, http_response_size_bytes` -->
<!--  `http_response_size_bytes_sum` -->
<!--  `http_response_size_bytes_count` -->
<!--  due to removal from the prometheus client library. Prometheus http request meta-metrics are now generated from [`promhttp.InstrumentMetricHandler`](https://godoc.org/github.com/prometheus/client_golang/prometheus/promhttp&#35;InstrumentMetricHandler) instead.  -->
- Prometheus のクライアントライブラリから削除されたため、非推奨だった以下の Prometheus のリクエストメトリクスが削除されました。代わりのメトリクスは[`promhttp.InstrumentMetricHandler`](https://godoc.org/github.com/prometheus/client_golang/prometheus/promhttp&#35;InstrumentMetricHandler)から生成されるようになりました([#83987](https://github.com/kubernetes/kubernetes/pull/83987), [@&#xFFF0;wenjiaswe](https://github.com/wenjiaswe))
    - `http_request_duration_microseconds`
    - `http_request_duration_microseconds_sum`
    - `http_request_duration_microseconds_count`
    - `http_request_size_bytes`
    - `http_request_size_bytes_sum`
    - `http_request_size_bytes_count`
    - `http_requests_total`
    - `http_response_size_bytes`
    - `http_response_size_bytes_sum`
    - `http_response_size_bytes_count`

## その他の変更 （Other notable changes）
<!-- - Bump version of event-exporter to 0.3.1, to switch it to protobuf. ([#83396](https://github.com/kubernetes/kubernetes/pull/83396), [@&#xFFF0;loburm](https://github.com/loburm)) -->
- Addons: fluentd-gcp
    - event-exporter が 0.3.1 に更新され、protobuf を利用するようになりました([#83396](https://github.com/kubernetes/kubernetes/pull/83396), [@&#xFFF0;loburm](https://github.com/loburm))

<!-- - addons: elasticsearch discovery supports IPv6 ([#85543](https://github.com/kubernetes/kubernetes/pull/85543), [@&#xFFF0;SataQiu](https://github.com/SataQiu)) -->
- Addons: fluentd-elasticsearch
    - elasticsearch ディスカバリーが IPv6 をサポートしました([#85543](https://github.com/kubernetes/kubernetes/pull/85543), [@&#xFFF0;SataQiu](https://github.com/SataQiu))

<!-- - Bumps metrics-server version to v0.3.6 with following bugfix: -->
<!--   -  Don't break metric storage when duplicate pod metrics encountered causing hpa to fail ([#83907](https://github.com/kubernetes/kubernetes/pull/83907), [@&#xFFF0;olagacek](https://github.com/olagacek)) -->
- Addons: metrics-server
    - 次のバグが修正され、metrics-server が v0.3.6 に更新されました
        - Pod メトリクスの重複が発生すると、Metrics ストレージが壊れる問題（HPA と metrics-server がダウンする原因になる）([#83907](https://github.com/kubernetes/kubernetes/pull/83907), [@&#xFFF0;olagacek](https://github.com/olagacek))

<!-- - Update Cluster Autoscaler to 1.17.0; changelog: https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.17.0 ([#85610](https://github.com/kubernetes/kubernetes/pull/85610), [@&#xFFF0;losipiuk](https://github.com/losipiuk)) -->
- Addons: cluster-autoscaler
    -  Cluster Autoscaler が 1.17.0 に更新されました[Changelog](https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.17.0) ([#85610](https://github.com/kubernetes/kubernetes/pull/85610), [@&#xFFF0;losipiuk](https://github.com/losipiuk))


## 所感
私の環境で v1.17 のメトリクスを見る限り、Kubernetes コンポーネント特有のメトリクスは、大方 Stability Framework に移しているようです。なので Stability Framework の仕様に合わせ、v1.18 からは非推奨なメトリクスが、非表示でななくコードから削除され始めるはずです。

Application Developer からするとメトリクスの変更ばかりで、大きな恩恵が受けられるわけではありません。ですが、メトリクス の扱いについて仕様的に保護されることは、監視システムを含めエコシステムの高い関心事なので引き続きウォッチしていきます。