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

- [Kubernetes 1.17 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/96a11f283ef98e6dcdd8)
- [Kubernetes 1.18 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/3e85738e5647feec4d8c)

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

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

Kubernetes v1.19 では SIG Instrumentation の大きなテーマとして、構造化ロギング（Structured logging）が導入されました。
構造化ロギングは KEP の[1602-structured-logging kubernetes/enhancements](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging) で提案されています。

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

<!-- Structured logging -->
<!-- SIG Instrumentation standardized the structure of log messages and references to Kubernetes objects. Structured logging makes parsing, processing, storing, querying and analyzing logs easier. New methods in the klog library enforce log message structure. -->

> ログメッセージの構造と Kubernetes オブジェクトへの参照を標準化しました。
> 構造化されたログにより、ログのパース、処理、保存、検索、そして分析が簡単になりました。klog ライブラリの新しいメソッドを利用することでログメッセージの構造化を強制できます。

この KEP により klog には 構造化されたログを出力する[InfoS](https://godoc.org/k8s.io/klog#InfoS) や [ErrorS](https://godoc.org/k8s.io/klog#ErrorS)、Kubernetes オブジェクトを展開する [KObj](https://godoc.org/k8s.io/klog#KObj)、[KRef](https://godoc.org/k8s.io/klog#KRef) などのメソッドが追加され、ライブラリは v2 に更新されました。
そして[こちらの移行計画をもとに](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/migration-to-structured-logging.md)、ログ出力の割合が多い重要なログに焦点を絞りメソッドの置き換えが進められています。Tracking Issue は[こちら](https://github.com/kubernetes/enhancements/issues/1602)です。

これらのメソッドを使った出力イメージは次の通りとなり、これだけでは [ndjson](http://ndjson.org/) のような json 形式で出力されません。

```text
> klog.V(2).InfoS("Pod status updated", "pod", klog.KObj(p), "status", status.Phase)

# key=value の形式で出力される
I0903 23:43:18.302818    3894 kubelet_getters.go:176] "Pod status updated" pod="kube-system/etcd-minikube" status=Running
```

ndjson の形式で出力するには component-base に実装された `--logging-format` のオプションを使用し、`json` を指定します。

実際にどのようなログが出力されるか minikube を使って確認してみます。
2020-09-03 時点でリリースされている minikube v1.12.3 では extra-config の内容が反映されなかったため、master ブランチの minikube をビルドし利用します。
kube-controller-manager と kube-scheduler の引数に `--logging-format` オプションを追加するため、次のような extra-config を付けて minikube を起動します。

```text
# macOS で実行しています
$ minikube start \
  --kubernetes-version 1.19.0 \
  --vm-driver hyperkit \
  --extra-config 'controller-manager.logging-format=json' \
  --extra-config 'scheduler.logging-format=json'
  --extra-config 'kubelet.logging-format=json'
  --extra-config 'controller-manager.v=6' \
  --extra-config 'scheduler.v=6'
  --extra-config 'kubelet.v=6'

😄  minikube v1.12.3 on Darwin 10.15.6
✨  Using the hyperkit driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🔥  Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🎉  minikube 1.13.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.13.0
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'
🐳  Preparing Kubernetes v1.19.0 on Docker 19.03.12 ...
    ▪ controller-manager.logging-format=json
    ▪ scheduler.logging-format=json
    ▪ kubelet.logging-format=json
    ▪ controller-manager.v=6
    ▪ scheduler.v=6
    ▪ kubelet.v=6
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"
```

このオプションで minikube の起動に成功すると次のようなフォーマットでログが出力されます。

kubelet のログ（一部抜粋）

```
$ minikube ssh 'sudo journalctl -xu kubelet'
...
I0904 00:17:45.010069    2773 flags.go:59] FLAG: --add-dir-header="false"
I0904 00:17:45.010111    2773 flags.go:59] FLAG: --address="0.0.0.0"
I0904 00:17:45.010117    2773 flags.go:59] FLAG: --allowed-unsafe-sysctls="[]"
I0904 00:17:45.010124    2773 flags.go:59] FLAG: --alsologtostderr="false"
I0904 00:17:45.010127    2773 flags.go:59] FLAG: --anonymous-auth="true"
I0904 00:17:45.010132    2773 flags.go:59] FLAG: --application-metrics-count-limit="100"
...
{"ts":1599178665518.6204,"msg":"Version: v1.19.0\n","v":0}
{"ts":1599178665518.9753,"msg":"feature gates: &{map[]}\n","v":1}
{"ts":1599178665521.7664,"msg":"feature gates: &{map[]}\n","v":1}
{"ts":1599178665521.9856,"msg":"Client rotation is on, will bootstrap in background\n","v":0}
{"ts":1599178665523.6094,"msg":"Config loaded from file:  /etc/kubernetes/kubelet.conf\n","v":6}
{"ts":1599178665525.3655,"msg":"Config loaded from file:  /etc/kubernetes/kubelet.conf\n","v":6}
{"ts":1599178665525.5464,"msg":"Current kubeconfig file contents are still valid, no bootstrap necessary\n","v":2}

# このログだと pod や status のキーが指定されているがまだ含まれてない？
# > klog.V(2).InfoS("Pod status updated", "pod", klog.KObj(p), "status", status.Phase)
{"ts":1599178743113.197,"msg":"Pod status updated","v":2}
{"ts":1599178743113.3542,"msg":"Pod status updated","v":2}
...
```

kube-controller-manager のログ（一部抜粋）

```
$ kubectl logs kube-scheduler-minikube
I0902 07:48:26.091216       1 registry.go:173] Registering SelectorSpread plugin
I0902 07:48:26.091310       1 registry.go:173] Registering SelectorSpread plugin
I0902 07:48:26.689893       1 serving.go:331] Generated self-signed cert in-memory
{"ts":1599032912174.6284,"msg":"Registering SelectorSpread plugin\n","v":0}
{"ts":1599032912174.6775,"msg":"Registering SelectorSpread plugin\n","v":0}
{"ts":1599032912177.0889,"msg":"Authorization is disabled\n","v":0}
{"ts":1599032912177.1306,"msg":"Authentication is disabled\n","v":0}
{"ts":1599032912177.163,"msg":"Serving healthz insecurely on [::]:10251\n","v":0}
{"ts":1599032912180.8513,"msg":"Starting client-ca::kube-system::extension-apiserver-authentication::client-ca-file\n","v":0}
{"ts":1599032912181.0864,"msg":"Waiting for caches to sync for client-ca::kube-system::extension-apiserver-authentication::client-ca-file\n","v":0}
{"ts":1599032912181.209,"msg":"Serving securely on [::]:10259\n","v":0}
```

kube-scheduler のログ（一部抜粋）

```
$ kubectl logs kube-controller-manager-minikube
I0902 07:48:26.685344       1 serving.go:331] Generated self-signed cert in-memory
{"ts":1599032906964.9773,"msg":"Version: v1.19.0\n","v":0}
{"ts":1599032906966.5215,"msg":"Serving securely on [::]:10257\n","v":0}
{"ts":1599032906967.1287,"msg":"Serving insecurely on [::]:10252\n","v":0}
{"ts":1599032906967.9482,"msg":"Starting request-header::/var/lib/minikube/certs/front-proxy-ca.crt\n","v":0}
{"ts":1599032906968.5168,"msg":"Starting DynamicServingCertificateController\n","v":0}
{"ts":1599032906968.684,"msg":"Starting client-ca-bundle::/var/lib/minikube/certs/ca.crt\n","v":0}
{"ts":1599032914511.9033,"msg":"Waiting for caches to sync for tokens\n","v":0}
```

出力されたログは KEP にて定義された次のキーが含まれた構造体になっており、キーの追加もできるようになっています。

- ts:  タイムスタンプ as UNIX time (required, float)
- v:   verbosity (required, int, default 0)
- err: error string (optional, string)
- msg: message (required, string)

``` text
{
   "ts": 1580306777.04728,
   "v": 4,
   "msg": "Pod status updated",
   "pod":{
      "name": "nginx-1",
      "namespace": "default"
   },
   "status": "ready"
}
```


現状では全てのコンポーネントやログが構造化されているわけではありませんが、フィードバックを反映しながら性能やスキームの改善がされていく見込みです。
この取り組みにより、今まで Fluentd などの正規表現でパースしていた処理がシンプルになり、分析したかったことに注力できそうです。

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

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

### 変更
#### kube-scheduler
<!-- - Add attempts label to scheduler's PodSchedulingDuration metric. ([#92650](https://github.com/kubernetes/kubernetes/pull/92650), [@&#xFFF0;ahg-g](https://github.com/ahg-g)) [SIG Instrumentation and Scheduling] -->

- `attempts` ラベルが追加されました([#92650](https://github.com/kubernetes/kubernetes/pull/92650), [@&#xFFF0;ahg-g](https://github.com/ahg-g))
    - `scheduler_pod_scheduling_duration_seconds`

<!-- - Adds profile label to kube-scheduler metric framework_extension_point_duration_seconds ([#92268](https://github.com/kubernetes/kubernetes/pull/92268), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor)) [SIG Instrumentation and Scheduling] -->

- `profile` ラベルが追加されました([#92268](https://github.com/kubernetes/kubernetes/pull/92268), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor))
    - `scheduler_framework_extension_point_duration_seconds`

<!-- - Adds profile label to kube-scheduler metric schedule_attempts_total -->
<!--   - Adds result and profile label to e2e_scheduling_duration_seconds. Times for unschedulable and error attempts are now recorded. ([#92202](https://github.com/kubernetes/kubernetes/pull/92202), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor)) [SIG Instrumentation and Scheduling] -->

- `profile` ラベルが追加され、scheduler ごとにメトリクスが記録されるようになりました([#92202](https://github.com/kubernetes/kubernetes/pull/92202), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor))
    - `scheduler_schedule_attempts_total`

- `result` と `profile` ラベルが追加され、スケジュールできなかった試行回数とエラー試行の時間が記録されるようになりました([#92202](https://github.com/kubernetes/kubernetes/pull/92202), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor))。
    - `scheduler_e2e_scheduling_duration_seconds`

<!-- - Rename pod_preemption_metrics to preemption_metrics. ([#93256](https://github.com/kubernetes/kubernetes/pull/93256), [@&#xFFF0;ahg-g](https://github.com/ahg-g)) [SIG Instrumentation and Scheduling] -->
- 次のメトリクスがリネームされました([#93256](https://github.com/kubernetes/kubernetes/pull/93256), [@&#xFFF0;ahg-g](https://github.com/ahg-g))
    - `scheduler_pod_preemption_victims` -> `scheduler_preemption_victims`

<!-- - Scheduling failures due to no nodes available are now reported as unschedulable under ```schedule_attempts_total``` metric. ([#90989](https://github.com/kubernetes/kubernetes/pull/90989), [@&#xFFF0;ahg-g](https://github.com/ahg-g)) [SIG Scheduling] -->

- 利用可能なノードがなくスケジュールに失敗すると、次の既存メトリクスで記録されるようになりました([#90989](https://github.com/kubernetes/kubernetes/pull/90989), [@&#xFFF0;ahg-g](https://github.com/ahg-g))
    - `scheduler_schedule_attempts_total`

<!-- - Kube-scheduler: The metric name `scheduler_total_preemption_attempts` has been renamed to `scheduler_preemption_attempts_total`. ([#91448](https://github.com/kubernetes/kubernetes/pull/91448), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Scheduling] -->

- 次のメトリクスがリネームされました([#91448](https://github.com/kubernetes/kubernetes/pull/91448), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `scheduler_total_preemption_attempts` -> `scheduler_preemption_attempts_total`

#### kubelet
<!-- - Kubelet: following metrics have been renamed: -->
<!--   kubelet_running_container_count -\-> kubelet_running_containers -->
<!--   kubelet_running_pod_count -\-> kubelet_running_pods ([#92407](https://github.com/kubernetes/kubernetes/pull/92407), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Node] -->

- 次のメトリクスがリネームされました([#92407](https://github.com/kubernetes/kubernetes/pull/92407), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))
    - `kubelet_running_container_count` -> `kubelet_running_containers`
    - `kubelet_running_pod_count`       -> `kubelet_running_pods`

<!-- - In the kubelet resource metrics endpoint at /metrics/resource, change the names of the following metrics: -->
<!--   - node_cpu_usage_seconds -\-> node_cpu_usage_seconds_total -->
<!--   - container_cpu_usage_seconds -\-> container_cpu_usage_seconds_total -->
<!--   This is a partial revert of &#35;86282, which was added in 1.18.0, and initially removed the _total suffix ([#89540](https://github.com/kubernetes/kubernetes/pull/89540), [@&#xFFF0;dashpole](https://github.com/dashpole)) [SIG Instrumentation and Node] -->

- `/metrics/resource` エンドポイントから取得できる次のメトリクスがリネームされました([#89540](https://github.com/kubernetes/kubernetes/pull/89540), [@&#xFFF0;dashpole](https://github.com/dashpole))
    - `node_cpu_usage_seconds`      -> `node_cpu_usage_seconds_total`
    - `container_cpu_usage_seconds` -> `container_cpu_usage_seconds_total`

#### kube-aggregator
<!-- - Kube-aggregator: renames aggregator_unavailable_apiservice_count metric to aggregator_unavailable_apiservice_total ([#88156](https://github.com/kubernetes/kubernetes/pull/88156), [@&#xFFF0;p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery] -->

- 次のメトリクスがリネームされました([#88156](https://github.com/kubernetes/kubernetes/pull/88156), [@&#xFFF0;p0lyn0mial](https://github.com/p0lyn0mial))
    - `aggregator_unavailable_apiservice_count` -> `aggregator_unavailable_apiservice_total`

<!-- - Openapi-controller: remove the trailing `1` character literal from the rate limiting metric `APIServiceOpenAPIAggregationControllerQueue1` and rename it to `open_api_aggregation_controller` to adhere to Prometheus best practices. ([#77979](https://github.com/kubernetes/kubernetes/pull/77979), [@&#xFFF0;s-urbaniak](https://github.com/s-urbaniak)) [SIG API Machinery] -->

- レート制限のメトリス Prometheus のベストプラクティスに従いリネームしました([#77979](https://github.com/kubernetes/kubernetes/pull/77979), [@&#xFFF0;s-urbaniak](https://github.com/s-urbaniak))
    - `APIServiceOpenAPIAggregationControllerQueue1` -> `open_api_aggregation_controller`

#### その他
<!-- - ACTION REQUIRED : In CoreDNS v1.7.0, [metrics names have been changed](https://github.com/coredns/coredns/blob/master/notes/coredns-1.7.0.md&#35;metric-changes) which will be backward incompatible with existing reporting formulas that use the old metrics' names. Adjust your formulas to the new names before upgrading.  Kubeadm now includes CoreDNS version v1.7.0. Some of the major changes include: -->
<!--     - Fixed a bug that could cause CoreDNS to stop updating service records. -->
<!--     - Fixed a bug in the forward plugin where only the first upstream server is always selected no matter which policy is set. -->
<!--     - Remove already deprecated options resyncperiod and upstream in the Kubernetes plugin. -->
<!--     - Includes Prometheus metrics name changes (to bring them in line with standard Prometheus metrics naming convention). They will be backward incompatible with existing reporting formulas that use the old metrics' names. -->
<!--     - The federation plugin (allows for v1 Kubernetes federation) has been removed.  More details are available in https://coredns.io/2020/06/15/coredns-1.7.0-release/ ([#92651](https://github.com/kubernetes/kubernetes/pull/92651), [@&#xFFF0;rajansandeep](https://github.com/rajansandeep)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] -->

- [CoreDNS v1.17 ](https://github.com/coredns/coredns/blob/master/notes/coredns-1.7.0.md#metric-changes)へのアップグレードに伴い、メトリクス名を [Prometheus のベストプラクティス](https://prometheus.io/docs/practices/naming/#metric-and-label-naming)に合わせるため、次のメトリクスがリネームされました。この変更は下位互換がないためアップグレードする前に利用箇所の修正が必要です([#92651](https://github.com/kubernetes/kubernetes/pull/92651), [@&#xFFF0;rajansandeep](https://github.com/rajansandeep))。
  - `coredns_request_block_count_total` -> `coredns_dns_blocked_requests_total`
  - `coredns_request_allow_count_total` -> `coredns_dns_allowed_requests_total`
  - `coredns_dns_acl_request_block_count_total` -> `coredns_acl_blocked_requests_total`
  - `coredns_dns_acl_request_allow_count_total` -> `coredns_acl_allowed_requests_total`
  - `coredns_autopath_success_count_total` -> `coredns_autopath_success_total`
  - `coredns_forward_request_count_total` -> `coredns_forward_requests_total`
  - `coredns_forward_response_rcode_count_total` -> `coredns_forward_responses_total`
  - `coredns_forward_healthcheck_failure_count_total` -> `coredns_forward_healthcheck_failures_total`
  - `coredns_forward_healthcheck_broken_count_total` -> `coredns_forward_healthcheck_broken_total`
  - `coredns_forward_max_concurrent_reject_count_total` -> `coredns_forward_max_concurrent_rejects_total`
  - `coredns_grpc_request_count_total` -> `coredns_grpc_requests_total`
  - `coredns_grpc_response_rcode_count_total` -> `coredns_grpc_responses_total`
  - `coredns_panic_count_total` -> `coredns_panics_total`
  - `coredns_dns_request_count_total` -> `coredns_dns_requests_total`
  - `coredns_dns_request_do_count_total` -> `coredns_dns_do_requests_total`
  - `coredns_dns_response_rcode_count_total` -> `coredns_dns_responses_total`
  - `coredns_reload_failed_count_total` -> `coredns_reload_failed_total`
  - `coredns_cache_size` -> `coredns_cache_entries`
  - `coredns_dns_request_type_count_total`
      - このメトリクスは削除され、既存のメトリクスである `coredns_dns_requests_total` に統合されました

<!-- - The metric label name of `kubernetes_build_info` has been updated from `camel case` to `snake case`: -->
<!--   - gitVersion -\-> git_version -->
<!--   - gitCommit -\-> git_commit -->
<!--   - gitTreeState -\-> git_tree_state -->
<!--   - buildDate -\-> build_date -->
<!--   - goVersion -\-> go_version -->
<!--   This change happens in `kube-apiserver`、`kube-scheduler`、`kube-proxy` and `kube-controller-manager`. ([#91805](https://github.com/kubernetes/kubernetes/pull/91805), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -->

- `kubernetes_build_info` メトリクスのラベル名が `camelCase` から `snake_case` になりました。この変更は kube-apiserver、kube-scheduler、kube-proxy、kube-controller-manager のコンポーネントに適用されています([#91805](https://github.com/kubernetes/kubernetes/pull/91805), [@&#xFFF0;RainbowMango](https://github.com/RainbowMango))。
    - `gitVersion`   -> `git_version`
    - `gitCommit`    -> `git_commit`
    - `gitTreeState` -> `git_tree_state`
    - `buildDate`    -> `build_date`
    - `goVersion`    ->` go_version`

### 追加

#### kube-apiserver

<!-- - API requests to deprecated versions now receive a warning header in the API response, and cause a metric indicating use of a deprecated API to be published: -->
<!--     - `kubectl` outputs warnings to stderr, and accepts a `--warnings-as-errors` option to treat warnings as fatal errors -->
<!--     - `k8s.io/client-go` outputs warnings to stderr by default; override this per-client by setting `config.WarningHandler`, or per-process with `rest.SetDefaultWarningHandler()`
<!--     - `kube-apiserver` publishes `apiserver_requested_deprecated_apis` gauge metrics set to `1` for deprecated APIs which have been requested, with `group`, `version`, `resource`, `subresource`, and `removed_release` labels ([#73032](https://github.com/kubernetes/kubernetes/pull/73032), [@&#xFFF0;liggitt](https://github.com/liggitt)) [SIG API Machinery, CLI, Instrumentation and Testing] -->

- 非推奨バージョンの API にリクエストすると、API レスポンスに警告ヘッダーが含まれ、非推奨 API の利用がわかるメトリクスへ記録されるようになりました。このメトリクスは Gauge となっており、非推奨 API が利用されると値として 1 が記録されます([#73032](https://github.com/kubernetes/kubernetes/pull/73032), [@&#xFFF0;liggitt](https://github.com/liggitt))
    - `apiserver_requested_deprecated_apis`
    - クラスタ運用者としては便利な機能ですね!

    ```
    # HELP apiserver_requested_deprecated_apis [ALPHA] Gauge of deprecated APIs that have been requested, broken out by API group, version, resource, subresource, and removed_release.
    # TYPE apiserver_requested_deprecated_apis gauge
    apiserver_requested_deprecated_apis{group="extensions",removed_release="1.22",resource="ingresses",subresource="",version="v1beta1"} 1
    ```


<!-- - Added kube-apiserver metrics: apiserver_current_inflight_request_measures and, when API Priority and Fairness is enable, windowed_request_stats. ([#91177](https://github.com/kubernetes/kubernetes/pull/91177), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery, Instrumentation and Testing] -->

- api-server でキューに入ってるリクエスト数を記録するメトリクスが追加されました([#91177](https://github.com/kubernetes/kubernetes/pull/91177), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))
    - `apiserver_current_inqueue_requests`

<!-- TODO もう少し深掘りしたい-->
- FeatureGate=APIPriorityAndFairness とした際に役立つメトリクスが追加されました。[詳細はこちらのドキュメントを参照してください](https://kubernetes.io/docs/concepts/cluster-administration/flow-control/#observability)([#91177](https://github.com/kubernetes/kubernetes/pull/91177), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))。
    - `apiserver_flowcontrol_priority_level_request_count_samples`
    - `apiserver_flowcontrol_priority_level_request_count_watermarks`
    - `apiserver_flowcontrol_read_vs_write_request_count_samples`
    - `apiserver_flowcontrol_read_vs_write_request_count_watermarks`

<!-- - Kube-apiserver backed by etcd3 exports metric showing the database file size. ([#89151](https://github.com/kubernetes/kubernetes/pull/89151), [@&#xFFF0;jingyih](https://github.com/jingyih)) [SIG API Machinery] -->

- etcd データベースのファイルサイズを示すメトリクスが記録されるようになりました([#89151](https://github.com/kubernetes/kubernetes/pull/89151), [@&#xFFF0;jingyih](https://github.com/jingyih))
    - `etcd_db_total_size_in_bytes`

#### kubelet

<!-- - Kubelets configured to rotate client certificates now publish a `certificate_manager_server_ttl_seconds` gauge metric indicating the remaining seconds until certificate expiration. ([#91148](https://github.com/kubernetes/kubernetes/pull/91148), [@&#xFFF0;liggitt](https://github.com/liggitt)) [SIG Auth and Node] -->
- クライアント証明書をローテーションするように設定された kubelet が、証明書の有効期限までの残りの秒数を記録するメトリクスが追加されました([#91148](https://github.com/kubernetes/kubernetes/pull/91148), [@&#xFFF0;liggitt](https://github.com/liggitt))。
    - `kubelet_certificate_manager_client_ttl_seconds`

#### kube-proxy

<!-- - Kube-proxy exposes a new metric, `kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds`, that indicates the last time a change for kube-proxy was queued to be applied. ([#90175](https://github.com/kubernetes/kubernetes/pull/90175), [@&#xFFF0;squeed](https://github.com/squeed)) [SIG Instrumentation and Network] -->

- kube-proxy の変更を適用するため、キューに入れられた最後の時間を記録するメトリクスが追加されました([#90175](https://github.com/kubernetes/kubernetes/pull/90175), [@&#xFFF0;squeed](https://github.com/squeed))
    - `kubeproxy_sync_proxy_rules_last_queued_timestamp_seconds`

#### kube-controller-manager

<!-- - Refactor the local nodeipam range allocator and instrument the cidrset used to store the allocated CIDRs with the following metrics: -->
<!--   "cidrset_cidrs_allocations_total", -->
<!--   "cidrset_cidrs_releases_total", -->
<!--   "cidrset_usage_cidrs", -->
<!--   "cidrset_allocation_tries_per_request", ([#90288](https://github.com/kubernetes/kubernetes/pull/90288), [@&#xFFF0;aojea](https://github.com/aojea)) [SIG Apps, Instrumentation, Network and Scalability] -->

- ローカル nodeipam のレンジアロケーターをリファクタリングし、割り当てられた CIDR を格納するために使用する cidrset を次のメトリクスで記録するようになりました([#90288](https://github.com/kubernetes/kubernetes/pull/90288), [@&#xFFF0;aojea](https://github.com/aojea))
    - `node_ipam_controller_cidrset_cidrs_allocations_total`
    - `node_ipam_controller_cidrset_cidrs_releases_total`
    - `node_ipam_controller_cidrset_usage_cidrs`
    - `node_ipam_controller_cidrset_allocation_tries_per_request`

### 削除

#### kubelet

- [#91148](https://github.com/kubernetes/kubernetes/pull/91148) の対応により、`kubelet_certificate_manager_client_ttl_seconds` が追加されたので次のメトリクスは削除されました
    - `kubelet_certificate_manager_client_expiration_seconds`


## 種類別の変更点(Changes by Kind)
<!-- ### API の変更（API Change） -->
<!-- 時間があれば -->
<!-- - Adds the ability to disable Accelerator/GPU metrics collected by Kubelet ([#91930](https://github.com/kubernetes/kubernetes/pull/91930), [@&#xFFF0;RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Node] -->

### 機能追加(Feature)

<!-- - Add --logging-format flag for component-base. Defaults to "text" using unchanged klog. ([#89683](https://github.com/kubernetes/kubernetes/pull/89683), [@&#xFFF0;yuzhiquan](https://github.com/yuzhiquan)) [SIG Instrumentation] -->
#### component-base
- `--logging-format` オプションが追加されました。デフォルト値は `text` となり以前と同じフォーマットになります。`json` を指定すると ndjson のようなフォーマットでログが出力されます([#89683](https://github.com/kubernetes/kubernetes/pull/89683), [@&#xFFF0;yuzhiquan](https://github.com/yuzhiquan))。

#### kubelet
<!-- - Kubelet: add '--logging-format' flag to support structured logging ([#91532](https://github.com/kubernetes/kubernetes/pull/91532), [@&#xFFF0;afrouzMashaykhi](https://github.com/afrouzMashaykhi)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Node] -->

- 構造化ロギングをサポートするために `--logging-format` オプションが追加されました([#91532](https://github.com/kubernetes/kubernetes/pull/91532), [@&#xFFF0;afrouzMashaykhi](https://github.com/afrouzMashaykhi))

#### kube-controller-manager
<!-- - Kube-controller-manager: add '--logging-format' flag to support structured logging ([#91521](https://github.com/kubernetes/kubernetes/pull/91521), [@&#xFFF0;SataQiu](https://github.com/SataQiu)) [SIG API Machinery and Instrumentation] -->

- 構造化ロギングをサポートするために `--logging-format` オプションが追加されました([#91521](https://github.com/kubernetes/kubernetes/pull/91521), [@&#xFFF0;SataQiu](https://github.com/SataQiu))

#### kube-scheduler
<!-- - Kube-scheduler: add '--logging-format' flag to support structured logging ([#91522](https://github.com/kubernetes/kubernetes/pull/91522), [@&#xFFF0;SataQiu](https://github.com/SataQiu)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Scheduling] -->

- 構造化ロギングをサポートするために `--logging-format` オプションが追加されました([#91522](https://github.com/kubernetes/kubernetes/pull/91522), [@&#xFFF0;SataQiu](https://github.com/SataQiu))

#### api-server

<!-- - Audit events for API requests to deprecated API versions now include a `"k8s.io/deprecated": "true"` audit annotation. If a target removal release is identified, the audit event includes a `"k8s.io/removal-release": "<majorVersion>.<minorVersion>"` audit annotation as well. ([#92842](https://github.com/kubernetes/kubernetes/pull/92842), [@&#xFFF0;liggitt](https://github.com/liggitt)) [SIG API Machinery and Instrumentation] -->

- 非推奨の API バージョンへリクエストされると監査イベント に `"k8s.io/deprecated": "true"` の監査アノテーションが含まれるようになりました。削除対象となるリリースが特定された場合、監査イベントには `"k8s.io/removal-release": "<majorVersion>.<minorVersion>"` の監査アノテーションも追加されます([#92842](https://github.com/kubernetes/kubernetes/pull/92842), [@&#xFFF0;liggitt](https://github.com/liggitt))。


<!-- - Trace output in apiserver logs is more organized and comprehensive. Traces are nested, and for all non-long running request endpoints, the entire filter chain is instrumented (e.g. authentication check is included). ([#88936](https://github.com/kubernetes/kubernetes/pull/88936), [@&#xFFF0;jpbetz](https://github.com/jpbetz)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Scheduling] -->

- api-server のログのトレース出力がより整理され、包括的になりました。トレースはネストされ長時間実行されていない全てのリクエストエンドポイントについて、フィルターチェイン全体が計測されます。 例では認証チェックが含まれています([#88936](https://github.com/kubernetes/kubernetes/pull/88936), [@&#xFFF0;jpbetz](https://github.com/jpbetz))。

    ```
    Trace[1374095871]: "HTTP Request" method:GET,url:/api/v1/namespaces/kube-system/resourcequotas,user-agent:kube-apiserver/v1.19.0 (linux/amd64) kubernetes/482c37a,client:::1 (02-Jun-2020 10:38:00.615) (total time: 3201ms):
    Trace[1374095871]: ---"Authenticate check done" 1000ms (10:38:00.615)
    Trace[1374095871]: ---"Authorize check done" 1000ms (10:38:00.616)
    Trace[1374095871]: ["List" url:/api/v1/namespaces/kube-system/resourcequotas,user-agent:kube-apiserver/v1.19.0 (linux/amd64) kubernetes/482c37a,client:::1 1200ms (10:38:00.616)
    Trace[1374095871]:  ["List etcd3" key:/resourcequotas/kube-system,resourceVersion:,limit:0,continue: 1200ms (10:38:00.616)]]
    Trace[1374095871]: [3.201532894s] [3.201532894s] END
    ```
    :memo: 将来的にはこのようなログも構造化される予定です。


### 不具合の修正（Bug or Regression）

<!-- TODO 時間があればメトリクスまで -->
<!-- - Fix detection of image filesystem, disk metrics for devicemapper, detection of OOM Kills on 5.0+ linux kernels. ([#92919](https://github.com/kubernetes/kubernetes/pull/92919), [@&#xFFF0;dashpole](https://github.com/dashpole)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Node] -->

- cadvisor を v0.37.0 にアップグレードし、次の内容を修正しました([#92919](https://github.com/kubernetes/kubernetes/pull/92919), [@&#xFFF0;dashpole](https://github.com/dashpole))
    - コンテナイメージのファイルシステムの検出を修正
    - devicemapper デバイスのディスクメトリクスを修正
    - Linux カーネル 5.0 以上 で発生する OOM Kill の検出を修正


## 所感
今回も Stability Level が ALPHA なメトリクスですが、ガンガンリネームされてます!
特に CoreDNS を監視されている Application Developer はご注意ください。

構造化ロギングは Fluentd の設定がシンプルになり、負荷の軽減にも繋がるので導入の検討をしていきたいです。
ただ今までログに出力されていたソースコードのファイル名と行数は調査時に助かっていたので、復活してもらえると嬉しいです。ログの容量のことを考えるとオプションの扱いが妥当でしょうか。