Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-19

はじめに(What’s New の内容含む)

ここでは、Kubernetes 1.21 の CHANGELOG から Metrics の変更と SIG Instrumentation の取り組みについてまとめています。

今回 Kubernetes v1.21 で SIG Instrumentation が扱う主要なテーマは 1 つとなります。では確認していきます。

Structured Logging in Kubelet

原文の What's New では次のように紹介されています。

Kubernetes v1.19 から始まった構造化ロギングの取り組みが、コミュニティの努力により kubelet で採用されました。引き続き構造化ロギングの導入に取り組んでいます。この取り組みに関心のある人は、メーリングリストのディスカッションを参照してください。

構造化ロギングの取り組みに関しては Kubernetes v1.19 の記事で簡単な内容ですが紹介しています。興味がある方はそちらも参照してください。

こちらの移行計画をもとに、ログ出力の割合が多い重要なログに焦点を絞りメソッドの置き換えが進められています。Tracking Issue はこちらです。v1.21 で対応された issue はこの Github Project から確認できます。この移行だけでも 52 個もの PR がマージされています。主な変更点は Severity に合わせて klog.InfoS と klog.ErrorS に置き換えることですが Change log functions to structured equivalent に合わせ、Warning を klog.InfoS に置き換える Severity やフォーマットなどの調整も合わせて実施されています。

Dynamic Cardinality Enforcement

その他にも今回のリリースに関連の深い 次の KEP があります。

この KEP では Kubernetes コンポーネントの実行時にメトリクスのラベル値を制限できる仕組みが提案されています。過去に何度も引き起こされた、メトリクスの増大によりメモリリークが発生した件に対応するためです。

私達も以前 reflector_xxx メトリクスのラベルが動的に生成されメモリが増大する問題に直面しました。その時の対応は価値の低いメトリクスだったことからメトリクスが削除され、対応したバイナリがリリースされました。
この時の対応もそうですが、メトリクスが引き起こすメモリリークの問題はメトリクスの削減、または削除の対応後にバイナリのリリースが必要となります。バイナリのリリースには時間が掛かるため、この KEP では実行時に問題を回避する方法を提案しています。

今回のリリースでは component-base に --allow-metric-labels フラグが含まれています。これを利用することでメトリクスのラベル値を制限できます。ただし今回のリリースでこのフラグが取り込まれているコンポーネントは kube-scheduler kube-controller-manager kube-apiserver となります。残念ながら v1.21.0 の段階では kube-proxykubelet にこのフラグは含まれません。

使用方法は以下のようになります。

spec) --allow-label-value <metric_name>,<label_name>='<allow_value1>, <allow_value2>...', <metric_name2>,<label_name>='<allow_value1>, <allow_value2>...', ...

ex) --allow-metric-labels=metric1,label1='v1,v2,v3',metric1,label2='v1,v2,v3'metric2,label1='v1,v2,v3'

またこの KEP とは直接関係ないようですが、メトリクス自体を一次的に無効化するフラグも component-base に取り込まれました。
こちらも v1.21.0 の段階で使用できるコンポーネントは kube-scheduler kube-controller-manager kube-apiserver になります。

使用方法は以下のようになり、複数メトリクスを指定する場合は区切り文字にカンマが利用できます。

--disabled-metrics=bad_metric1,bad_metric2

これらの機能で Kubernetes v1.21 以降ではメトリクスによるメモリリークが発生してしまっても比較的簡単に回避できそうです。
ただ --allow-label-value--disabled-metrics オプションの挙動を確認したところ、意図した挙動ではなかったため引き続き検証予定です。検証が終わり次第記事を更新します。

その他

他にも SIG-Instrumentation と関連がある次の KEP がありますが別の SIG のため今回は省略します。

それでは恒例の Metrics Changes について説明していきます。
ChangeLog から Metrics Changes の項目は削除されているため、私の方で全ての変更点からメトリクスの変更に関連するものを抜粋した内容を Metrics Changes としてまとめました。

メトリクスの変更(Metrics Changes)

追加

kube-apiserver

  • 1 つの etcd Lease に接続されているオブジェクト数を記録します(#97480, @￰lingsamuel)
    • Histogram: etcd_lease_object_counts
  • ストレージに保存されているオブジェクト数を記録します(#99785, @￰erain)
    • Gauge: apiserver_storage_objects
      • Labels: {"resource"}
      • etcd_object_counts メトリクスは非推奨となりました。代わりに apiserver_storage_objects メトリクスを利用するように変更してください。
    • :pencil: メトリクス名のリネームという扱いのため、初めてのリリースですが StabilityLevel は Stable となっています(#100082, @￰logicalhan)

kubelet

  • CSI 操作の Duration と Status を記録します(#98979, @￰Jiawei0227)
    • Histogram: csi_operations_seconds
      • Labels: {"driver_name", "method_name", "grpc_status_code", "migrated"}

kube-controller-manager

  • TTLAfterfined controller でジョブを削除するのにかかる時間を記録します(#98676, @￰ahg-g)
    • Histogram: ttl_after_finished_controller_job_deletion_duration_seconds
  • Generic ephemeral volumes の作成操作を記録します(#99115, @￰pohly)
    • Counter: ephemeral_volume_controller_create_total
    • Counter: ephemeral_volume_controller_create_failures_total
  • CronJob が実行されスケジュールされてから対応するジョブが作成されるまでの時間を記録します(#99341, @￰alaypatel07)
    • Histogram: cronjob_controller_cronjob_job_creation_skew_duration_seconds

kube-proxy

  • iptables のテーブルごと(filter、nat、mangle)に登録されたルール数を記録します(#99653, @￰aojea)
    • Gauge: kubeproxy_sync_proxy_rules_iptables_total
      • Labels: {"table"}

component-base

  • client-go の credential plugins へのコール数を記録します。これは終了コードと発生したイベントのタイプ(no_error、plugin_execution_error、plugin_not_found_error、client_internal_error)をラベルに持ちます。呼び出しが成功した場合にのみ、終了コードは 0 が設定されます。(#98892, @￰ankeesler)
    • rest_client_exec_plugin_call_total
      • Labels: {"code", "call_status"}

変更

kube-apiserver

  • 次のメトリクスの StabilityLevel が Stable になりました(#99925, @￰logicalhan)
    • Histogram: apiserver_request_duration_seconds
  • 次のメトリクスの StabilityLevel が Stable になりました。またその際にあまり使われない content-type ラベルが削除されました(#99788, @￰logicalhan)。
    • Counter: apiserver_request_total
      • Lables: {"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component", "content-type", "code"}

kube-controller-manager

  • 次のメトリクスに migrated ラベルが追加されました。CSI Migration 機能によって移行済みかどうかをモニタリングできます(#99050, @￰Jiawei0227)
    • Histogram: storage_operation_duration_seconds
      • Lables: {"volume_plugin", "operation_name", "status", "migrated"}

component-base

非推奨

kube-apiserver

  • ストレージに保存されているオブジェクト数を記録する次のメトリクスは非推奨となりました(#99785, @￰erain)
    • Gauge: etcd_object_counts
    • 代わりに Gauge: apiserver_storage_objects を利用してください

kubelet

  • 次のメトリクスが非推奨となりました。(#99045, @￰mattcary)。
    • Counter: storage_operation_errors_total
    • Counter: storage_operation_status_count
    • 代わりに storage_operation_duration_seconds メトリクスを利用してください。storage_operation_errors_total の変わりは status のラベル値 fail-unknown が利用できます

削除

kube-scheduler

  • 非推奨だった次のメトリクスが削されました。(#96447, @￰chendave)
    • Histogram: scheduling_algorithm_preemption_evaluation_seconds
    • Histogram: binding_duration_seconds
    • 代わりに scheduler_framework_extension_point_duration_seconds メトリクスを利用してください

修正

component-base

  • 認証時間を記録するメトリクスに、apiserver へのリクエスト処理の全ての時間が記録されていたため修正しました(#99944, @￰marseel)
    • Histogram: authentication_duration_seconds

kubelet

  • 削除されてしまった プレフィックス machine_ のメトリクスを元に戻しました(#97006, @￰lingsamuel)
    • ex) machine_cpu_cores
    • ex) machine_memory_bytes
    • :pencil: この修正は v1.19.7/v1.20.2 にも cherry-pick されています
  • Backet を調整し、1 を超えるメトリクスだけを表示するように修正しました(#98169, @￰wawa0210)
    • Histogram: kubelet_containers_per_pod_count

メトリクス以外の変更

機能追加(Feature)

  • kubelet から cAdvisor JSON metrics (/stats/container, /stats/<podname>/<containername>, /stats/<namespace>/<podname>/<poduid>/<containername>) が削除されました(#99236, @￰pacoxu)
  • コマンドラインのフラグを使って、明示的にメトリクスを無効化できるようになりました(#99217, @￰logicalhan)
    • ex) --disabled-metrics=metric1,metric2

不具合の修正(Bug or Regression)

  • [GCE Load-Balancer Controller Addon] k8s.gcr.io/ingress-gce-404-server-with-metrics-amd64 を、デフォルト以外のポートで /metrics エンドポイントにサービスを提供するバージョンに更新しました(#97621, @￰vbannai)
  • Windows の Pod のログ統計(/stats/summary ) が記録されるようになりました (#99221, @￰jsturtevant)
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?