Help us understand the problem. What is going on with this article?

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

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
    • kube-scheduler のゴルーチン数を記録し、prioritizing_extenderbinding のラベルを持ちます(#83535, @￰wgliang)
  • plugin_execution_duration_seconds
    • スケジュールフレームワークのプラグインごとの実行時間を記録します(#84522, @￰liu-cong)
  • permit_wait_duration_seconds

controll-manager

  • endpoint_slice_controller_endpoints_added_per_syncendpoint_slice_controller_endpoints_removed_per_syncendpoint_slice_controller_endpoints_desiredendpoint_slice_controller_num_endpoint_slicesendpoint_slice_controller_desired_endpoint_slicesendpoint_slice_controller_changes

kubelet

  • kubelet_preemptions
    • 時間の経過とともに発生するプリエンプションの数を記録し、トリガーとなるリソースをラベルに持ちます(#84120, @￰smarterclayton)

apiserver

  • apiserver_request_error_total
    • apiserver のリクエストエラー数を記録し、verb, group, version, resource, subresource, scope, component, codeのラベルを持ちます(#83427, @￰logicalhan)
  • 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: fluentd-gcp
    • event-exporter が 0.3.1 に更新され、protobuf を利用するようになりました(#83396, @￰loburm)
  • Addons: fluentd-elasticsearch
    • elasticsearch ディスカバリーが IPv6 をサポートしました(#85543, @￰SataQiu)
  • Addons: metrics-server
    • 次のバグが修正され、metrics-server が v0.3.6 に更新されました
      • Pod メトリクスの重複が発生すると、Metrics ストレージが壊れる問題(HPA と metrics-server がダウンする原因になる)(#83907, @￰olagacek)

所感

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした