はじめに(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-proxy
、kubelet
にこのフラグは含まれません。
使用方法は以下のようになります。
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
- Histogram:
- ストレージに保存されているオブジェクト数を記録します(#99785, @erain)
- Gauge:
apiserver_storage_objects
- Labels: {"resource"}
-
etcd_object_counts
メトリクスは非推奨となりました。代わりにapiserver_storage_objects
メトリクスを利用するように変更してください。
- メトリクス名のリネームという扱いのため、初めてのリリースですが StabilityLevel は Stable となっています(#100082, @logicalhan)
- Gauge:
kubelet
- CSI 操作の Duration と Status を記録します(#98979, @Jiawei0227)
- Histogram:
csi_operations_seconds
- Labels: {"driver_name", "method_name", "grpc_status_code", "migrated"}
- Histogram:
kube-controller-manager
-
TTLAfterfined
controller でジョブを削除するのにかかる時間を記録します(#98676, @ahg-g)- Histogram:
ttl_after_finished_controller_job_deletion_duration_seconds
- Histogram:
- Generic ephemeral volumes の作成操作を記録します(#99115, @pohly)
- Counter:
ephemeral_volume_controller_create_total
- Counter:
ephemeral_volume_controller_create_failures_total
- Counter:
- CronJob が実行されスケジュールされてから対応するジョブが作成されるまでの時間を記録します(#99341, @alaypatel07)
- Histogram:
cronjob_controller_cronjob_job_creation_skew_duration_seconds
- Histogram:
kube-proxy
- iptables のテーブルごと(filter、nat、mangle)に登録されたルール数を記録します(#99653, @aojea)
- Gauge:
kubeproxy_sync_proxy_rules_iptables_total
- Labels: {"table"}
- Gauge:
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
- Histogram:
- 次のメトリクスの StabilityLevel が Stable になりました。またその際にあまり使われない
content-type
ラベルが削除されました(#99788, @logicalhan)。- Counter:
apiserver_request_total
- Lables: {"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component",
"content-type","code"}
- Lables: {"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component",
- Counter:
kube-controller-manager
- 次のメトリクスに
migrated
ラベルが追加されました。CSI Migration 機能によって移行済みかどうかをモニタリングできます(#99050, @Jiawei0227)- Histogram:
storage_operation_duration_seconds
- Lables: {"volume_plugin", "operation_name", "status", "migrated"}
- Histogram:
component-base
- Windows でのプロセス開始時刻の取得方法を修正しました(#97491, @jsturtevant)
- Gauge:
process_start_time_seconds
- Gauge:
非推奨
kube-apiserver
- ストレージに保存されているオブジェクト数を記録する次のメトリクスは非推奨となりました(#99785, @erain)
- Gauge:
etcd_object_counts
- 代わりに Gauge:
apiserver_storage_objects
を利用してください
- Gauge:
kubelet
- 次のメトリクスが非推奨となりました。(#99045, @mattcary)。
- Counter:
storage_operation_errors_total
- Counter:
storage_operation_status_count
- 代わりに
storage_operation_duration_seconds
メトリクスを利用してください。storage_operation_errors_total
の変わりはstatus
のラベル値fail-unknown
が利用できます
- Counter:
削除
kube-scheduler
- 非推奨だった次のメトリクスが削されました。(#96447, @chendave)
- Histogram:
scheduling_algorithm_preemption_evaluation_seconds
- Histogram:
binding_duration_seconds
- 代わりに
scheduler_framework_extension_point_duration_seconds
メトリクスを利用してください
- Histogram:
修正
component-base
- 認証時間を記録するメトリクスに、apiserver へのリクエスト処理の全ての時間が記録されていたため修正しました(#99944, @marseel)
- Histogram:
authentication_duration_seconds
- Histogram:
kubelet
- 削除されてしまった プレフィックス
machine_
のメトリクスを元に戻しました(#97006, @lingsamuel)- ex)
machine_cpu_cores
- ex)
machine_memory_bytes
- この修正は v1.19.7/v1.20.2 にも cherry-pick されています
- ex)
- Backet を調整し、1 を超えるメトリクスだけを表示するように修正しました(#98169, @wawa0210)
- Histogram:
kubelet_containers_per_pod_count
- Histogram:
メトリクス以外の変更
機能追加(Feature)
- kubelet から cAdvisor JSON metrics (/stats/container, /stats/<podname>/<containername>, /stats/<namespace>/<podname>/<poduid>/<containername>) が削除されました(#99236, @pacoxu)
- component-base にメトリクスのラベル値の許可リストを指定できる
--allow-metric-labels
フラグが追加されました(#99385, @YoyinZyc) (#99738, @YoyinZyc)
- コマンドラインのフラグを使って、明示的にメトリクスを無効化できるようになりました(#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)