Kubernetes 1.17: Metrics Changes と SIG Instrumentation の変更内容
はじめに
v1.17 では前回の v1.16 に引き続き、KEP: Metrics Stability Migration が進められています。
その影響でいくつかのメトリクスが非表示となったので、古いメトリクスを使用している場合は、移行が必要となる点に注意してください。
ただし Stability Framework の戦略に沿ったメトリクスで、コードから削除されず非表示になっただけのメトリクスは、show-hidden-metrics-for-version
フラグを指定することで、メトリクスを出力できます。
例えば rest_client_request_latency_seconds
メトリクスは、次の通り 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 だけのようでしたが、今後のバージョンで他のコンポーネントにも追加されていくと思われます。
それでは CHANGELOG を見ていきます。
メトリクスの変更(Metrics Changes)
追加されたメトリクス(Added metrics)
scheduler
-
scheduler_goroutines
-
plugin_execution_duration_seconds
- スケジュールフレームワークのプラグインごとの実行時間を記録します(#84522, @liu-cong)
-
permit_wait_duration_seconds
- RunPermitPlugins での待機時間が記録されます(#84011, @liu-cong)
controll-manager
-
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 のメトリクスが追加されました(#83257, @robscott)
kubelet
-
kubelet_preemptions
- 時間の経過とともに発生するプリエンプションの数を記録し、トリガーとなるリソースをラベルに持ちます(#84120, @smarterclayton)
apiserver
-
apiserver_request_error_total
- apiserver のリクエストエラー数を記録し、
verb
,group
,version
,resource
,subresource
,scope
,component
,code
のラベルを持ちます(#83427, @logicalhan)
- apiserver のリクエストエラー数を記録し、
-
authentication_latency_seconds
- 認証処理のレイテンシーを記録し、
success|failure|error
などの値が入る、result
ラベルを持ちます(#82409, @RainbowMango)
- 認証処理のレイテンシーを記録し、
非推奨/変更されたメトリクス(Deprecated/changed metrics)
etcd
- 次のメトリクスの Stability Level が ALPHA となりました(#83283, @RainbowMango)
etcd_version_info
kubelet
- 次のメトリクスの Stability Level が ALPHA となりました(#84907, @RainbowMango, #84987, @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
- 次のメトリクスの Stability Level が ALPHA となりました(#84896, @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
- 次のメトリクスは v1.17 より出力されない設定となりました(#83837, @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
-
pod_preemption_victims
- メトリクスのタイプが Gauge から Histogram に変更されました(#83603, @Tabrizian)
- 次のメトリクスは v1.17 より出力されない設定となりました(#83838, @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
- 次のメトリクスは v1.17 より出力されない設定となりました(#83839, @RainbowMango)
kubeproxy_sync_proxy_rules_latency_microseconds
その他
- 次のメトリクスは v1.17 より出力されない設定となりました(#83836, @RainbowMango)
rest_client_request_latency_seconds
- Prometheus のクライアントライブラリから削除されたため、非推奨だった以下の Prometheus のリクエストメトリクスが削除されました。代わりのメトリクスは
promhttp.InstrumentMetricHandler
から生成されるようになりました(#83987, @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)
- Addons: metrics-server
- 次のバグが修正され、metrics-server が v0.3.6 に更新されました
- Pod メトリクスの重複が発生すると、Metrics ストレージが壊れる問題(HPA と metrics-server がダウンする原因になる)(#83907, @olagacek)
- 次のバグが修正され、metrics-server が v0.3.6 に更新されました
- Addons: cluster-autoscaler
- Cluster Autoscaler が 1.17.0 に更新されましたChangelog (#85610, @losipiuk)
所感
私の環境で v1.17 のメトリクスを見る限り、Kubernetes コンポーネント特有のメトリクスは、大方 Stability Framework に移しているようです。なので Stability Framework の仕様に合わせ、v1.18 からは非推奨なメトリクスが、非表示でななくコードから削除され始めるはずです。
Application Developer からするとメトリクスの変更ばかりで、大きな恩恵が受けられるわけではありません。ですが、メトリクス の扱いについて仕様的に保護されることは、監視システムを含めエコシステムの高い関心事なので引き続きウォッチしていきます。