Kubernetes 1.15: SIG Instrumentation の変更内容

# Kubernetes 1.15: SIG Instrumentation の変更内容

## はじめに

ここでは、[Kubernetes 1.15 の CHANGELOG](Kubernetes 1.15 の CHANGELOG ) から SIG Instrumentation の取り組みについてまとめています。

v1.15 の SIG Instrumentation では以下のトピックに変更内容はないため記載を省略しています。

- 主な変更点(1.15 What’s New)
- 既知の問題 (Known Issues)
- アップグレード時の注意点 (Urgent Upgrade Notes)
- 廃止及び削除される機能 (Deprecations and Removals)
- 注目機能 (Notable Features)
- API の変更 (API Changes)
- 依存関係 (Dependencies)

また今回 SIG Instrumentation 単体での変更内容調査は初回となるため、今回のリリースにも関連する SIG Instrumentation の KEP についても紹介します。
以下の KEP で提唱されている Kubernetes Metrics Overhaul により v1.14 をターゲットに[メトリクスの修正](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#removed-and-deprecated-metrics)が実施されました。

- [KEP Kubernetes Metrics Overhaul](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20181106-kubernetes-metrics-overhaul.md)
- ゴール
  - Prometheusや他のエコシステムに合わせて一貫性のある名前と高品質のメトリクスを提供すること
  - メトリクスの直接的な結合を可能にするため、一貫したラベル名を提供すること

v1.15 でも引続き単位の修正などが実施されており、今後も SIG-Instrumentation の[ガイドライン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md#naming)や、Prometheus の[ガイドライン](https://prometheus.io/docs/practices/naming/#metric-names)に合わせてメトリクスの改善がされるでしょう。

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

### Added metrics

<!-- - The metric `kube_proxy_sync_proxy_rules_last_timestamp_seconds` is now available, indicating the last time that kube-proxy successfully applied proxying rules. ([#74027](https://github.com/kubernetes/kubernetes/pull/74027), [@squeed](https://github.com/squeed)) -->
<!-- 原文のメトリクス名間違ってる -->
- [kube-proxy] kube-proxy がプロキシールールを適用した最後の時間を記録するメトリクスである `kubeproxy_sync_proxy_rules_last_timestamp_seconds` が追加されました ([#74027](https://github.com/kubernetes/kubernetes/pull/74027), [@squeed](https://github.com/squeed))
  - :memo: その他にも以下の `kubeproxy_sync_proxy_rules_*` メトリクスが追加されています
    - `kubeproxy_sync_proxy_rules_endpoint_changes_pending`
    - `kubeproxy_sync_proxy_rules_endpoint_changes_total`
    - `kubeproxy_sync_proxy_rules_service_changes_pending`
    - `kubeproxy_sync_proxy_rules_service_changes_total`

<!-- - `process_start_time_seconds` has been added to kubelet’s '/metrics/probes' endpoint ([#77975](https://github.com/kubernetes/kubernetes/pull/77975), [@logicalhan](https://github.com/logicalhan)) -->
- [kubelet] `process_start_time_seconds` メトリクスが追加されました ([#77975](https://github.com/kubernetes/kubernetes/pull/77975), [@logicalhan](https://github.com/logicalhan))
  - :memo: これは名前の通り kubelet 自身のプロセスが起動した時間となります

<!-- - Scheduler: added metrics to record the number of pending pods in different queues ([#75501](https://github.com/kubernetes/kubernetes/pull/75501), [@Huang-Wei](https://github.com/Huang-Wei)) -->
- [scheduler] scheduler の queue ごとに Pending ステータスの Pod 数を記録する `scheduler_pending_pods` メトリクスが追加されました ([#75501](https://github.com/kubernetes/kubernetes/pull/75501), [@Huang-Wei](https://github.com/Huang-Wei))
  - :memo: クラスターの全体的な状態を知るために追加されました、ちなみにスケジュール済の Pod は `scheduler_schedule_attempts_total{result="scheduled"}` のメトリクスで取得できます。

<!-- - todo メトリクスを確認できず Exposed CSI volume stats via kubelet volume metrics ([#76188](https://github.com/kubernetes/kubernetes/pull/76188), [@humblec](https://github.com/humblec)) -->
- [kubelet] `kubelet_volume_stats_*` メトリクスに CSI ボリュームの情報が追加されました ([#76188](https://github.com/kubernetes/kubernetes/pull/76188), [@humblec](https://github.com/humblec))

<!-- - Added a new `storage_operation_status_count` metric for kube-controller-manager and kubelet to count success and error statues. ([#75750](https://github.com/kubernetes/kubernetes/pull/75750), [@msau42](https://github.com/msau42)) -->
- [kube-controller-manager, kubelet] ストレージ操作の成功と失敗のステータスを記録する `storage_operation_status_count` メトリクスが追加されました ([#75750](https://github.com/kubernetes/kubernetes/pull/75750), [@msau42](https://github.com/msau42))
  - :memo: 合わせて `storage_operation_duration_seconds` メトリクス（Histogram）のバケット範囲が、最大50秒だったものから600秒まで拡張されています

### Deprecated/changed metrics

<!-- - kubelet probe metrics are now of the counter type rather than the gauge type, and the `prober_probe_result` has been replaced by `prober_probe_total`. ([#76074](https://github.com/kubernetes/kubernetes/pull/76074), [@danielqsj](https://github.com/danielqsj)) -->
- [kubelet] Probe メトリクスが Gauge タイプから Counter タイプに変更となったため、 メトリクス名も `prober_probe_result` から `prober_probe_total` に変更となりました ([#76074](https://github.com/kubernetes/kubernetes/pull/76074), [@danielqsj](https://github.com/danielqsj))
  - :memo: 変更になったため `prober_probe_result` は利用できません

<!-- - todo メトリクスを確認できず The `transformer_failures_total` metric is deprecated in favor of `transformation_operation_total`. The old metric will continue to be populated but will be removed in a future release. ([#70715](https://github.com/kubernetes/kubernetes/pull/70715), [@immutableT](https://github.com/immutableT)) -->
- [kube-apiserver] `transformation_failures_total` メトリクスが非推奨となり将来のリリースで削除されるため、`transformation_operation_total` の利用が推奨となりました。 ([#70715](https://github.com/kubernetes/kubernetes/pull/70715), [@immutableT](https://github.com/immutableT))
  - :memo: KMS Provider の変換処理をモニタリングすることがモチベーションのようです

<!--
- Introducing new semantic for metric `volume_operation_total_seconds` to be the end to end latency of volume provisioning/deletion. Existing metric "storage_operation_duration_seconds" will remain untouched, however it is exposed to the following potential issues:
  1. For volumes provisioned/deleted via external provisioner/deleter, `storage_operation_duration_seconds` will NOT wait for the external operation to be done before reporting latency metric (effectively close to 0). This will be fixed by using `volume_operation_total_seconds` instead
  2. if there's a transient error happened during "provisioning/deletion", i.e., a volume is still in-use while a deleteVolume has been called, original `storage_operation_duration_seconds` will NOT wait until a volume has been finally deleted before reporting an inaccurate latency metric. The newly implemented metric `volume_operation_total_seconds`, however, waits until a provisioning/deletion operation has been fully executed.

    Potential impacts:
    If an SLO/alert has been defined based on `volume_operation_total_seconds`, it might get violated because of the more accurate metric might be significantly larger than previously reported. The metric is defined to be a histogram and the new semantic could change the distribution. ([#78061](https://github.com/kubernetes/kubernetes/pull/78061), [@yuxiangqian](https://github.com/yuxiangqian))
todo 新しいメトリクスを確認できず https://github.com/coreos/prometheus-operator/issues/485
-->
- [kubelet] `storage_operation_duration_seconds` メトリクスには潜在的な問題があったため、ボリュームのプロビジョニングと削除を含んだ `volume_operation_total_seconds` メトリクスが追加されました。`storage_operation_duration_seconds` メトリクスに変更はありませんが以下の問題を含んでいます。 ([#78061](https://github.com/kubernetes/kubernetes/pull/78061), [@yuxiangqian](https://github.com/yuxiangqian))
  - 1. External Provisioner / Deleter によってプロビジョニング/削除されたボリュームの場合、 `storage_operation_duration_seconds` メトリクスに External Provisioner / Deleter の操作時間は含まれません（事実上0秒に近い数値となります）。これは `volume_operation_total_seconds` で修正されています。
  - 2. プロビジョニングや削除の処理中に一時的なエラーが発生した場合、例えば deleteVolume が呼び出されている間にボリュームがまだ使用中だと `storage_operation_duration_seconds` メトリクスはボリュームが削除されるまで待ちません。これも `volume_operation_total_seconds` メトリクスで修正されています。
  - この変更の潜在的な影響としてアラートや SLO で使用しているメトリクスを `storage_operation_duration_seconds` から `volume_operation_total_seconds` に修正すると、以前より正確な数値で値も大きくなるため、閾値を超える可能性があります。

<!--
- Implement the scheduling framework with `Reserve`, `Prebind`, `Permit`, `Post-bind`, `Queue sort` and `Unreserve` extension points.
([#77567](https://github.com/kubernetes/kubernetes/pull/77567), [@wgliang](https://github.com/wgliang))
([#77559](https://github.com/kubernetes/kubernetes/pull/77559), [@ahg-g](https://github.com/ahg-g))
([#77529](https://github.com/kubernetes/kubernetes/pull/77529), [@draveness](https://github.com/draveness))
([#77598](https://github.com/kubernetes/kubernetes/pull/77598), [@danielqsj](https://github.com/danielqsj))
([#77501](https://github.com/kubernetes/kubernetes/pull/77501), [@JieJhih](https://github.com/JieJhih))
([#77457](https://github.com/kubernetes/kubernetes/pull/77457), [@danielqsj](https://github.com/danielqsj))
todo これは scheduling のはず
-->
<!-- - todo メトリクスを確認できず Replaced *_admission_latencies_milliseconds_summary and *_admission_latencies_milliseconds metrics because they were reporting seconds rather than milliseconds. They were also subject to multiple naming guideline violations (units should be in base units and "duration" is the best practice labelling to measure the time a request takes). Please convert to use *_admission_duration_seconds and *_admission_duration_seconds_summary, as these now report the unit as described, and follow the instrumentation best practices. ([#75279](https://github.com/kubernetes/kubernetes/pull/75279), [@danielqsj](https://github.com/danielqsj)) -->
- [kube-apiserver] ミリ秒ではなく秒の単位になっていたため、`*_admission_latencies_milliseconds_summary` と `*_admission_latencies_milliseconds` メトリクスは、`*_admission_duration_seconds` と `*_admission_duration_seconds_summary` に変更となりました ([#75279](https://github.com/kubernetes/kubernetes/pull/75279), [@danielqsj](https://github.com/danielqsj))
  - これは命名ガイドライン違反の影響を受けました
  - :memo: これは SIG-Instrumentation の[ガイドライン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md#naming)ではなく、Prometheus の[ガイドライン](https://prometheus.io/docs/practices/naming/#metric-names)の `must have a single unit` です

<!-- - Fixed admission metrics histogram bucket sizes to cover 25ms to ~2.5 seconds. ([#78608](https://github.com/kubernetes/kubernetes/pull/78608), [@jpbetz](https://github.com/jpbetz)) -->
- [kube-apiserver] Admission メトリクス `*_admission_duration_seconds` の Histogram バケットの範囲が 5ミリ秒 〜 2.5秒 の範囲に修正されました ([#78608](https://github.com/kubernetes/kubernetes/pull/78608), [@jpbetz](https://github.com/jpbetz))
  - :memo: ミリ秒から秒に修正した時、6桁ほどずれていたみたいです :cry:

<!-- - Fixed incorrect prometheus azure metrics. ([#77722](https://github.com/kubernetes/kubernetes/pull/77722), [@andyzhangx](https://github.com/andyzhangx)) -->
- [cloud-providers/azure] 不正確な Azure のメトリクスが修正されました ([#77722](https://github.com/kubernetes/kubernetes/pull/77722), [@andyzhangx](https://github.com/andyzhangx))

<!-- - `kubectl scale job`, deprecated since 1.10, has been removed. ([#78445](https://github.com/kubernetes/kubernetes/pull/78445), [@soltysh](https://github.com/soltysh))
todo これは cli のはず
-->

## その他の変更 (Other notable changes)

<!-- - [metrics-server addon] Restored the ability to connect to nodes via IP addresses. ([#76819](https://github.com/kubernetes/kubernetes/pull/76819), [@serathius](https://github.com/serathius)) -->
- [metrics-server addon] 優先的に IP addresses を使ってノードへ接続するように戻しました ([#76819](https://github.com/kubernetes/kubernetes/pull/76819), [@serathius](https://github.com/serathius))
  - :memo: metrtics-server v0.3 で変更された機能により、IP アドレスより DNS が優先されるようになり一部のテストなどで DNS への依存が増えたので、引数の変更でもとの挙動に戻したようです。

<!-- - If a pod has a running instance, the stats of its previously terminated instances will not show up in the kubelet summary stats any more for CRI runtimes such as containerd and cri-o.
  This keeps the behavior consistent with Docker integration, and fixes an issue that some container Prometheus metrics don't work when there are summary stats for multiple instances of the same pod. ([#77426](https://github.com/kubernetes/kubernetes/pull/77426), [@Random-Liu](https://github.com/Random-Liu))
 - todo instanceとは process のこと？https://kubernetes.io/docs/concepts/workloads/pods/pod/ https://cloud.google.com/kubernetes-engine/docs/concepts/pod?hl=ja -->
- Pod に実行中のインスタンスがある場合、containerd や cri-o などの CRI ランタイムについては、 kubelet の Stats から以前に終了したインスタンスの Stats を表示しないように修正しました。
この修正により Docker を利用した時の挙動と一貫性が保たれ、同じ Pod に複数インスタンスの Stats がある場合に一部のコンテナの Prometheus メトリクスが機能しなくなるという問題が修正されました ([#77426](https://github.com/kubernetes/kubernetes/pull/77426), [@Random-Liu](https://github.com/Random-Liu))
  - :memo: ここで使われているインスタンスとは Pod の実体のことを指しています。またこの現象は短い期間で再作成されると同じ名前空間と名前をもつ Pod が作成され発生するようです。

## 所感

v1.14 ほどではありませんが、v1.15 でもメトリクスの追加・変更があったので アラートや SLO のメトリクスも合わせて棚卸しをした方がよさそうです。  
また現状だと Kubernetes に限らず Prometheus のメトリクスのガイドラインは、レビューによって守られているので [ツール](https://github.com/prometheus/prometheus/issues/1953) や仕様などで検知・修正できる仕組みが OpenMetrics などで議論されると嬉しいなと思っています。