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

## はじめに

ここでは、[Kubernetes 1.16 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md#v1160) から Metrics Changes と SIG Instrumentation の取り組みについてまとめています。

また今回のリリースに関連する以下の KEP について紹介します。

- [KEP Kubernetes Control-Plane Metrics Stability](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md)
  - ゴール
      - Kubernetes コントロールプレーンのメトリクス取得に関するさまざまな安定性の保証について定義する
      - メトリクスの安定性を表現するための統一的なメカニズムを定義する
- [KEP Metrics Stability Migration](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190605-metrics-stability-migration.md)
  - ゴール
      - Stability Framework にメトリクスを移行するための一般的な戦略の概要を定義する
      - 共有されているメトリクスの移行方法を明示的に定義する
      - 移行パスを通じて下位互換性を維持する
      - ただしメトリクスのオーバーホールで廃止予定になったメトリクスは除外する（今後削除されるものも含む）
      - メトリクスの変更を各コンポーネントの所有者に通知する

メトリクスの安定性はコミュニティの継続的な関心事であり、コントロールプレーンのメトリクスに変更がある場合は事前に通知され、十分な移行期間などが設けられている必要があります。
そこで KEP [`Control-Plane Metrics Stability`](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md) ではメトリクス名やラベル名について何らかの保証を策定し、プログラムとして適切に扱う方法が提案されています。
また KEP [`Metrics Stability Migration`](https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190605-metrics-stability-migration.md) では上記で策定されたフレームワークに移行する方法が提案されています。

そして今回のリリースでは上記 KEP の一部が実装され取り込まれました。
おおまかな内容としては、一部のコントロールプレーンのメトリクスに Stability Level というメタデータが追加され、値として Stability Classes(ALPHA, STABLE) が登録されるようになりました。
このメタデータはメトリクスの Help テキストに表示されます。

Example)

```
# HELP kubelet_docker_operations [ALPHA] (Deprecated) Cumulative number of Docker operations by operation type.
# TYPE kubelet_docker_operations counter
kubelet_docker_operations{operation_type="create_container"} 33
kubelet_docker_operations{operation_type="info"} 1
...
```

それでは CHANGELOG を見ていきます。

## メトリクスの変更（Metrics Changes）

### 追加されたメトリクス（Added metrics）

#### apiserver
<!-- - Added metrics `aggregator_openapi_v2_regeneration_count`, `aggregator_openapi_v2_regeneration_gauge` and `apiextension_openapi_v2_regeneration_count` counting the triggering APIService and CRDs and the reason (add, update, delete) when kube-apiserver regenerates the OpenAPI spec. ([#81786](https://github.com/kubernetes/kubernetes/pull/81786), [@&#xFFF0;sttts](https://github.com/sttts)) -->
- `aggregator_openapi_v2_regeneration_count`、`aggregator_openapi_v2_regeneration_gauge`、`apiextension_openapi_v2_regeneration_count`
  - kube-apiserver が OpenAPI Spec を再生成するときに、トリガーになる API Service または CRD と、追加、更新、削除などの理由を計測します([#81786](https://github.com/kubernetes/kubernetes/pull/81786), [@&#xFFF0;sttts](https://github.com/sttts))

<!-- - Added metrics `authentication_attempts` that can be used to understand the attempts of authentication. ([#81509](https://github.com/kubernetes/kubernetes/pull/81509), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) -->
- `authentication_attempts`
  - 認証の試行回数をカウントします([#81509](https://github.com/kubernetes/kubernetes/pull/81509), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))

<!-- - Add a new counter metrics `apiserver_admission_webhook_rejection_count` with details about the causing for a webhook rejection. ([#81399](https://github.com/kubernetes/kubernetes/pull/81399), [@&#xFFF0;roycaihw](https://github.com/roycaihw)) -->
- `apiserver_admission_webhook_rejection_count`
  - Admission Webhook により Reject された原因を計測します([#81399](https://github.com/kubernetes/kubernetes/pull/81399), [@&#xFFF0;roycaihw](https://github.com/roycaihw))

<!-- - Added metric `apiserver_watch_events_total` that can be used to understand the number of watch events in the system. ([#78732](https://github.com/kubernetes/kubernetes/pull/78732), [@&#xFFF0;mborsz](https://github.com/mborsz)) -->
- `apiserver_watch_events_total`
  - システム内で Watch しているイベント数をカウントします([#78732](https://github.com/kubernetes/kubernetes/pull/78732), [@&#xFFF0;mborsz](https://github.com/mborsz))

<!-- - Added metric `apiserver_watch_events_sizes` that can be used to estimate sizes of watch events in the system. ([#80477](https://github.com/kubernetes/kubernetes/pull/80477), [@&#xFFF0;mborsz](https://github.com/mborsz)) -->
- `apiserver_watch_events_sizes`
  - システム内の Watch しているイベントのサイズを見積もりするために使用するメトリクスです([#80477](https://github.com/kubernetes/kubernetes/pull/80477), [@&#xFFF0;mborsz](https://github.com/mborsz))

#### kubelet
<!-- - Add `container_state` label to `running_container_count` kubelet metrics, to get count of containers based on their state(running/exited/created/unknown) ([#81573](https://github.com/kubernetes/kubernetes/pull/81573), [@&#xFFF0;irajdeep](https://github.com/irajdeep)) -->
- `running_container_count`
  - `container_state` のラベルが追加され、コンテナの状態(running/exited/created/unknown)に基づいてコンテナ数を取得できるようになりました([#81573](https://github.com/kubernetes/kubernetes/pull/81573), [@&#xFFF0;irajdeep](https://github.com/irajdeep))

<!-- - kubelet now exports an `kubelet_evictions` metric that counts the number of pod evictions carried out by the kubelet to reclaim resources ([#81377](https://github.com/kubernetes/kubernetes/pull/81377), [@&#xFFF0;sjenning](https://github.com/sjenning)) -->
- `kubelet_evictions`
  - リソースを再利用するために kubelet によって実行された Pod eviction 数をカウントします([#81377](https://github.com/kubernetes/kubernetes/pull/81377), [@&#xFFF0;sjenning](https://github.com/sjenning))

<!-- - NFS Drivers are now enabled to collect metrics, StatFS metrics provider is used to collect the metrics. (@&#xFFF0;brahmaroutu) ([#75805](https://github.com/kubernetes/kubernetes/pull/75805), [@&#xFFF0;brahmaroutu](https://github.com/brahmaroutu)) -->
- StatFS メトリクスプロバイダーを使用し、NFS ドライバーのメトリクスが収集できるようになりました([#75805](https://github.com/kubernetes/kubernetes/pull/75805), [@&#xFFF0;brahmaroutu](https://github.com/brahmaroutu))

#### cadvisor
<!-- - Add `container_sockets`, `container_threads`, and `container_threads_max` metrics ([#81972](https://github.com/kubernetes/kubernetes/pull/81972), [@&#xFFF0;dashpole](https://github.com/dashpole)) -->
- cAdvisor が v0.34.0 にアップデートされました([#81972](https://github.com/kubernetes/kubernetes/pull/81972), [@&#xFFF0;dashpole](https://github.com/dashpole))
  - `container_sockets`
      - コンテナで開いているソケット数を計測します
  - `container_threads`
      - コンテナ内で実行されているスレッドの数を計測します
  - `container_threads_max`
      - コンテナ内で許可されるスレッドの最大数を計測します。値がゼロの場合は無限となります。

#### kube-proxy
<!-- - Added a new Prometheus counter metric `sync_proxy_rules_iptables_restore_failures_total` for kube-proxy iptables-restore failures (both ipvs and iptables modes)([#81210](https://github.com/kubernetes/kubernetes/pull/81210), [@&#xFFF0;figo](https://github.com/figo)) -->
- `sync_proxy_rules_iptables_restore_failures_total`
  - iptable のリストアに失敗した数をカウントします（ipvsとiptablesの両方に対応）([#81210](https://github.com/kubernetes/kubernetes/pull/81210), [@&#xFFF0;figo](https://github.com/figo))

### 削除されたメトリクス（Removed metrics）

<!-- - Removed cadvisor metric labels `pod_name` and `container_name` to match instrumentation guidelines. Any Prometheus queries that match `pod_name` and `container_name` labels (e.g. cadvisor or kubelet probe metrics) must be updated to use `pod` and `container` instead. ([#80376](https://github.com/kubernetes/kubernetes/pull/80376), [@&#xFFF0;ehashman](https://github.com/ehashman)) -->
- [SIG instrumentation のガイドライン](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md#naming) に合わせて、cAvisor のメトリクスから `pod_name` と `container_name` のラベルが削除されました。もし cAdvisor や kubelet で提供されたメトリクスで `pod_name` と `container_name` のラベルを利用している PromQL がある場合は、`pod` と `container` に置き換える必要があります([#80376](https://github.com/kubernetes/kubernetes/pull/80376), [@&#xFFF0;ehashman](https://github.com/ehashman))。
  - :memo: Grafana のダッシュボードで使ってる PromQL、Prometheus の Record Rule、Alert Rule で コンテナの CPU や Memory を参照しているプロジェクトでは v1.16 移行前には修正が必要です。

    ```
    container_cpu_usage_seconds_total{
      container="coredns",
      # 削除された=> container_name="coredns",
      pod="coredns-xxxxxxxxxx-xxxx",
      # 削除された=> pod_name="coredns-xxxxxxxxxx-xxxx"
    }
    ```

### 非推奨/変更されたメトリクス（Deprecated/changed metrics）

<!-- - kube-controller-manager and cloud-controller-manager metrics are now marked as with the ALPHA stability level. ([#81624](https://github.com/kubernetes/kubernetes/pull/81624), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- kube-controller-manager と cloud-controller-manager のメトリクスは、Stability Level が ALPHA となりました([#81624](https://github.com/kubernetes/kubernetes/pull/81624), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - kube-proxy metrics are now marked as with the ALPHA stability level. ([#81626](https://github.com/kubernetes/kubernetes/pull/81626), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- kube-proxy のメトリクスは、Stability Level が ALPHA となりました([#81626](https://github.com/kubernetes/kubernetes/pull/81626), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - kube-apiserver metrics are now marked as with the ALPHA stability level. ([#81531](https://github.com/kubernetes/kubernetes/pull/81531), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- kube-apiserver のメトリクスは、Stability Level が ALPHA となりました([#81531](https://github.com/kubernetes/kubernetes/pull/81531), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - kubelet metrics for /metrics and /metrics/probes are now marked as with the ALPHA stability level. ([#81534](https://github.com/kubernetes/kubernetes/pull/81534), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- kubelet の `/metrics` と `/metrics/probes` のパスが提供するメトリクスは、Stability Level が ALPHA となりました([#81534](https://github.com/kubernetes/kubernetes/pull/81534), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - Scheduler metrics are now marked as with the ALPHA stability level. ([#81576](https://github.com/kubernetes/kubernetes/pull/81576), [@&#xFFF0;logicalhan](https://github.com/logicalhan)) -->
- scheduler のメトリクスは、Stability Level が ALPHA となりました([#81576](https://github.com/kubernetes/kubernetes/pull/81576), [@&#xFFF0;logicalhan](https://github.com/logicalhan))

<!-- - The `rejected` label in `apiserver_admission_webhook_admission_duration_seconds` metrices now properly indicates if the request was rejected. ([#81399](https://github.com/kubernetes/kubernetes/pull/81399), [@&#xFFF0;roycaihw](https://github.com/roycaihw)) -->
- `apiserver_admission_webhook_admission_duration_seconds` メトリクスの `rejected` ラベルの値が正しい結果が記録されるように修正されました([#81399](https://github.com/kubernetes/kubernetes/pull/81399), [@&#xFFF0;roycaihw](https://github.com/roycaihw))

<!-- - Fixed a bug in the CSI metrics that does not return not supported error when a CSI driver does not support metrics. ([#79851](https://github.com/kubernetes/kubernetes/pull/79851), [@&#xFFF0;jparklab](https://github.com/jparklab)) -->
- CSI ドライバーがメトリクスをサポートしていない場合、サポートしていないエラーを返さない CSI メトリクスの不具合が修正されました([#79851](https://github.com/kubernetes/kubernetes/pull/79851), [@&#xFFF0;jparklab](https://github.com/jparklab))

<!-- - Fix disk stats in LXD using ZFS storage pool and CRI-O missing network metris bug ([#81972](https://github.com/kubernetes/kubernetes/pull/81972), [@&#xFFF0;dashpole](https://github.com/dashpole)) -->
- ZFS ストレージプールを使用し LXD のディスク Stats が修正されました([#81972](https://github.com/kubernetes/kubernetes/pull/81972), [@&#xFFF0;dashpole](https://github.com/dashpole))

- CRI-O に存在しないネットワークメトリクスの不具合が修正されました([#81972](https://github.com/kubernetes/kubernetes/pull/81972), [@&#xFFF0;dashpole](https://github.com/dashpole))

## その他の変更 （Other notable changes）

<!-- - Kibana has been slightly revamped/improved in the latest version ([#80421](https://github.com/kubernetes/kubernetes/pull/80421), [@&#xFFF0;lostick](https://github.com/lostick)) -->
- addons で利用されている fluentd-elasticsearch の Kibana が 最新版に更新され改善されました([#80421](https://github.com/kubernetes/kubernetes/pull/80421), [@&#xFFF0;lostick](https://github.com/lostick))

## 所感
今回紹介した KEP の実装が完了すれば、STABLE なメトリクスが突然廃止になることはなくなりますが、Prometheus(Alertmanager)、Grafana 側でプログラマブルに Deprecated なメトリクスを検知できるわけではありません。
将来的に Prometheus（もしくは OpenMetrics） 側のメトリクスの仕様が見直され、Deprecated なメトリクスがプログラマブルに検知できたら嬉しいです。

## 備考
- 前回: [Kubernetes 1.15: SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/01162b0ae3b262c32695)