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

- [Kubernetes 1.21 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/87108aa1545eb5ff4556)
- [Kubernetes 1.22 SIG Instrumentation の変更内容](https://qiita.com/watawuwu/items/c177d1bc8a4b9a1d3a91)

## はじめに

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

- [Kubernetes 1.23: Reaching New Peaks | Kubernetes](https://kubernetes.io/blog/2021/12/07/kubernetes-1-23-release-announcement/)
- [Kubernetes 1.23 CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md)

今回 Kubernetes v1.23 で SIG Instrumentation が扱う主要なテーマは以下となります。

<!-- ### Deprecation of klog specific flags -->
### klog 固有フラグの非推奨

<!-- To simplify the code base, several logging flags were marked as deprecated in Kubernetes 1.23. The code which implements them will be removed in a future release, so users of those need to start replacing the deprecated flags with some alternative solutions. -->
ソースコードをシンプルに保つため、Kubernetes 1.23 ではいくつかのロギングオプションが非推奨となりました。これらのオプションは将来のバージョンで削除されます。

- `--add-dir-header`
- `--alsologtostderr`
- `--log-backtrace-at`
- `--log-dir`
- `--log-file`
- `--log-file-max-size`
- `--logtostderr`
- `--one-output`
- `--skip-headers`
- `--skip-log-headers`
- `--stderrthreshold`

これは次の KEP で取り組まれています。

- [KEP-2845: Deprecate klog specific flags in Kubernetes Compnents](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/2845-deprecate-klog-specific-flags-in-k8s-components)

klog は glog からフォークしており、多くのケースで利用されていない機能が存在します。新しい機能を追加する際には、これらの利用されていない機能との互換性を考慮する必要があるため、仕様の複雑化や性能劣化などの問題が生じています。

これらの課題を根本的に解決するためには多大な開発コストをかけて改修する必要があります。ですが改修して対応できたとしてもロギング・ライブラリのメンテナンスコストを払い続ける問題は残ります。
そもそもログローテのように、他のコンポーネントに委譲した方が良い機能もあります。この KEP ではロギングライブラリの責務を小さくすることで、メンテナンスコストの削減と品質の向上を推進することを目指す方針となっています。

#### 関連ドキュメント
- [System Logs | Kubernetes](https://kubernetes.io/docs/concepts/cluster-administration/system-logs/#klog)


<!-- Structured logging graduate to Beta -->

### 構造化ロギングが Beta に移行
<!-- Structured logging reached its Beta milestone. Most log messages from kubelet and kube-scheduler have been converted. Users are encouraged to try out JSON output or parsing of the structured text format and provide feedback on possible solutions for the open issues, such as handling of multi-line strings in log values. -->
構造化ロギングのマイルストーンが Beta に到達しました。
kubelet と kube-scheduler コンポーネントのログメッセージの大部分が構造化ロギングに移行しました。
利用者は JSON フォーマット、または構造化テキストのコマンドオプションを試し、複数行の文字列処理や未解決な問題への解決策についてフィードバックを提供することが推奨されています。

構造化ロギングについては Kubernetes 1.19 からこの [KEP 1602-structured-logging](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/1602-structured-logging) で取り組まれています。フィードバックを収集し大きな問題がなければ v1.26 で Stable になる予定です。

<!-- Defend Against Logging Secrets via Static Analysis -->
### その他

その他の SIG Instrumentation の取り組みとしては、以前は SIG Instrumentation で管理され、現在は SIG Security で管理されている次の KEP が Stable になりました。

- [KEP 1933-secret-logging-static-analysis](https://github.com/kubernetes/enhancements/tree/master/keps/sig-security/1933-secret-logging-static-analysis)

静的解析ツールの [google/go-flow-levee](https://github.com/google/go-flow-levee) を利用し、ロギングによる Secret 情報の漏洩を改善する KEP のようです。
[KEP: 1753-logs-sanitization](https://github.com/kubernetes/enhancements/tree/59e5c698639a8489ee3808c13fc9526f746c5fc4/keps/sig-instrumentation/1753-logs-sanitization)と同じく、あくまで保険的な機構だという点は注意が必要です。

それでは `Metrics Changes` について説明していきます。
`メトリクスの変更` は、私が全ての変更点からメトリクスの変更に関連するものを抜粋した内容となります。

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

### 追加

#### kube-apiserver

<!-- - Added `apiserver_longrunning_requests` metric to replace the soon to be deprecated `apiserver_longrunning_gauge` metric. ([#103799](https://github.com/kubernetes/kubernetes/pull/103799), [@&#xFFF0;jyz0309](https://github.com/jyz0309)) -->
- 廃止予定の `apiserver_longrunning_gauge` を置き換えるメトリクス([#103799](https://github.com/kubernetes/kubernetes/pull/103799), [@&#xFFF0;jyz0309](https://github.com/jyz0309))
    - Gauge: `apiserver_longrunning_requests`
        - Labels: {"verb", "group", "version", "resource", "subresource", "scope", "component"}
        - Help: Gauge of all active long-running apiserver requests broken out by verb, group, version, resource, scope and component. Not all requests are tracked this way.

<!-- - This PR adds the following metrics for API Priority and Fairness. -->
<!--   - **apiserver_flowcontrol_priority_level_seat_count_samples**: histograms of seats occupied by executing requests (both regular and final-delay phases included), broken down by priority_level; the observations are taken once per millisecond. -->
<!--   - **apiserver_flowcontrol_priority_level_seat_count_watermarks**: histograms of high and low watermarks of number of seats occupied by executing requests (both regular and final-delay phases included), broken down by priority_level. -->
<!--   - **apiserver_flowcontrol_watch_count_samples**: histograms of number of watches relevant to a given mutating request, broken down by that request's priority_level and flow_schema. ([#105873](https://github.com/kubernetes/kubernetes/pull/105873), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery, Instrumentation and Testing] -->
- API Priority and Fairness 関連のメトリクス ([#105873](https://github.com/kubernetes/kubernetes/pull/105873), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))
    - Histogram: `apiserver_flowcontrol_priority_level_seat_count_samples`
        - Help: Periodic observations of the number of requests
        - Labels: {"phase", "priority_level"}
    - Histogram: `apiserver_flowcontrol_priority_level_seat_count_watermarks`
        - Help: Watermarks of the number of requests
        - Labels: {"phase", "priority_level"}
    - Histogram: `apiserver_flowcontrol_watch_count_samples`
        - Help: count of watchers for mutating requests in API Priority and Fairnes
        - Labels: {"priorityLevel", "flowSchema"}

<!-- - Add Pod Security admission metrics: `pod_security_evaluations_total`, `pod_security_exemptions_total`, `pod_security_errors_total` ([#105898](https://github.com/kubernetes/kubernetes/pull/105898), [@&#xFFF0;tallclair](https://github.com/tallclair)) -->
- Pod Security admission のメトリクス ([#105898](https://github.com/kubernetes/kubernetes/pull/105898), [@&#xFFF0;tallclair](https://github.com/tallclair))
    - Counter: `pod_security_evaluations_total`
        - Help: Counter of pod security evaluations
        - Labels: {"decision", "policy_level", "policy_version", "mode", "operation", "resource", "subresource"}
    - Counter: `pod_security_exemptions_total`
        - Help: Number of exempt requests, not counting ignored or out of scope requests.
        - Labels: {"request_operation", "resource", "subresource"}
    - Counter: `pod_security_errors_total`
        - Help: Number of errors preventing normal evaluation. Non-fatal errors may result in the latest restricted profile being used for evaluation.
        - Labels: {"fatal", "request_operation", "resource", "subresource"}

<!-- - Introduces a new metric: `admission_webhook_request_total` with the following labels: name (string) - the webhook name, type (string) - the admission type, operation (string) - the requested verb, code (int) - the HTTP status code, rejected (bool) - whether the request was rejected, namespace (string) - the namespace of the requested resource. ([#103162](https://github.com/kubernetes/kubernetes/pull/103162), [@&#xFFF0;rmoriar1](https://github.com/rmoriar1)) -->
- Admission Webhook 関連のメトリクス([#103162](https://github.com/kubernetes/kubernetes/pull/103162), [@&#xFFF0;rmoriar1](https://github.com/rmoriar1))
    - Counter: `apiserver_admission_webhook_request_total`
        - Help: Admission webhook request total, identified by name and broken out for each admission type (validating or mutating) and operation. Additional labels specify whether the request was rejected or not and an HTTP status code. Codes greater than 600 are truncated to 600, to keep the metrics cardinality bounded.
        - Labels: {"name", "type", "operation", "code", "rejected"}

<!-- - The kube-apiserver's Prometheus metrics have been extended with some that describe the costs of handling LIST requests.  They are as follows. -->
<!--   - *apiserver_cache_list_total*: Counter of LIST requests served from watch cache, broken down by resource_prefix and index_name -->
<!--   - *apiserver_cache_list_fetched_objects_total*: Counter of objects read from watch cache in the course of serving a LIST request, broken down by resource_prefix and index_name -->
<!--   - *apiserver_cache_list_evaluated_objects_total*: Counter of objects tested in the course of serving a LIST request from watch cache, broken down by resource_prefix -->
<!--   - *apiserver_cache_list_returned_objects_total*: Counter of objects returned for a LIST request from watch cache, broken down by resource_prefix -->
<!--   - *apiserver_storage_list_total*: Counter of LIST requests served from etcd, broken down by resource -->
<!--   - *apiserver_storage_list_fetched_objects_total*: Counter of objects read from etcd in the course of serving a LIST request, broken down by resource -->
<!--   - *apiserver_storage_list_evaluated_objects_total*: Counter of objects tested in the course of serving a LIST request from etcd, broken down by resource -->
<!--   - *apiserver_storage_list_returned_objects_total*: Counter of objects returned for a LIST request from etcd, broken down by resource ([#104983](https://github.com/kubernetes/kubernetes/pull/104983), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))-->
- LIST リクエストの処理にかかるコストを表すメトリクス([#104983](https://github.com/kubernetes/kubernetes/pull/104983), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))
    - Counter: `apiserver_cache_list_total`
        - Watch のキャッシュから取得した LIST リクエスト数
        - Help: Number of LIST requests served from watch cache
        - Labels: {"resource_prefix", "index_name"}
    - Counter: `apiserver_cache_list_fetched_objects_total`
        - LIST リクエストで Watch のキャッシュから読み込まれたオブジェクト数
        - Help: Number of objects read from watch cache in the course of serving a LIST request
        - Labels: {"resource_prefix", "index_name"}
    - Counter: `apiserver_cache_list_returned_objects_total`
        - LIST リクエストで Watch のキャッシュからリターンされたオブジェクト数
        - Help: Number of objects returned for a LIST request from watch cache
        - Labels: {"resource_prefix"}
    - Counter: `apiserver_storage_list_total`
        - etcd から取得した LIST リクエスト数
        - Help: Number of LIST requests served from storage
        - Labels: {"resource"}
  - Counter: `apiserver_storage_list_fetched_objects_total`
        - LIST リクエスト処理で etcd から読み込まれたオブジェクト数
        - Help: Number of objects read from storage in the course of serving a LIST request
        - Labels: {"resource"}
  - Counter: `apiserver_storage_list_evaluated_objects_total`
        - LIST リクエストで etcd から評価されたオブジェクト数
        - Help: Number of objects tested in the course of serving a LIST request from storage
        - Labels: {"resource"}
  - Counter: `apiserver_storage_list_returned_objects_total`
        - LIST リクエストで etcd からリターンされたオブジェクト数
        - Help: Number of objects returned for a LIST request from storage
        - Labels: {"resource"}

<!-- - The `apiserver` exposes 4 new metrics that allow to track the status of the Service CIDRs allocations: -->
<!--       - current number of available IPs per Service CIDR -->
<!--       - current number of used IPs per Service CIDR -->
<!--       - total number of allocation per Service CIDR -->
<!--       - total number of allocation errors per ServiceCIDR ([#104119](https://github.com/kubernetes/kubernetes/pull/104119), [@&#xFFF0;aojea](https://github.com/aojea)) -->
- Service の CIDRs 割当を記録するメトリクス([#104119](https://github.com/kubernetes/kubernetes/pull/104119), [@&#xFFF0;aojea](https://github.com/aojea))
    - Gauge: `kube_apiserver_clusterip_allocator_allocated_ips`
        - Help: Service CIDR ごとの割り当てられた Cluster IPs
        - Labels: {"cidr"}
    - Gauge: `kube_apiserver_clusterip_allocator_available_ips`
        - Help: Service CIDR ごとの割り当て可能な Cluster IPs
        - Labels: {"cidr"}
    - Gauge: `kube_apiserver_clusterip_allocator_allocation_total`
        - Help: Service CIDR ごとのクラスタ IP の割り当て数
        - Labels: {"cidr"}
    - Gauge: `kube_apiserver_clusterip_allocator_allocation_errors_total`
        - Help: Service CIDR ごとの割り当てエラー数
        - Labels: {"cidr"}

#### kube-controller-manager

<!-- - When feature gate `JobTrackingWithFinalizers` is enabled: -->
<!--   - Limit the number of Pods tracked in a single Job sync to avoid starvation of small Jobs. -->
<!--   - The metric `job_pod_finished_total` counts the number of finished Pods tracked by the Job controller. ([#105197](https://github.com/kubernetes/kubernetes/pull/105197), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor)) -->
- Job コントローラーがトラックしている終了した Pod 数を記録。このメトリクスは Feature Gate `JobTrackingWithFinalizers` が有効な場合に記録されます([#105197](https://github.com/kubernetes/kubernetes/pull/105197), [@&#xFFF0;alculquicondor](https://github.com/alculquicondor))
    - Counter: `job_pod_finished_total`
        - Help: The number of finished Pods that are fully tracked
        - Labels: {"completion_mode", "result"}

### 変更

#### kube-apiserver

<!-- - Graduating `controller_admission_duration_seconds`, `step_admission_duration_seconds`, `webhook_admission_duration_seconds`, `apiserver_current_inflight_requests` and `apiserver_response_sizes` metrics to stable. ([#106122](https://github.com/kubernetes/kubernetes/pull/106122), [@&#xFFF0;rezakrimi](https://github.com/rezakrimi)) [SIG API Machinery, Instrumentation and Testing] -->
- 次のメトリクスの StabilityLevel が Stable になりました([#106122](https://github.com/kubernetes/kubernetes/pull/106122), [@&#xFFF0;rezakrimi](https://github.com/rezakrimi))
    - `apiserver_admission_controller_admission_duration_seconds`
    - `apiserver_admission_step_admission_duration_seconds`
    - `apiserver_admission_webhook_admission_duration_seconds`
    - `apiserver_current_inflight_requests`
    - `apiserver_response_sizes`

<!-- - Reverts adding namespace label to admission metrics (and histogram exansion) due to cardinality issues. ([#104033](https://github.com/kubernetes/kubernetes/pull/104033), [@&#xFFF0;s-urbaniak](https://github.com/s-urbaniak)) -->
- カーディナリティの問題があるため、admission 関連のメトリクスに付与した namespace のラベルをリバートし削除しました([#104033](https://github.com/kubernetes/kubernetes/pull/104033), [@&#xFFF0;s-urbaniak](https://github.com/s-urbaniak))
   - 1.22 で入ったコミットのため 1.22 にも cherry-pick されています
       - [Add a namespace label to admission metrics and expand histogram range to 0-10s by voutcn · Pull Request #101208 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/101208)
       - [Automated cherry pick of #104033: Revert "Add a namespace label to admission metrics and expand by rphillips · Pull Request #104037 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/104037)

<!-- - Changed buckets in apiserver_request_duration_seconds metric from [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60] to [0.05, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 1.25, 1.5, 2, 3, 4, 5, 6, 8, 10, 15, 20, 30, 45, 60] ([#106306](https://github.com/kubernetes/kubernetes/pull/106306), [@&#xFFF0;pawbana](https://github.com/pawbana)) [SIG API Machinery, Instrumentation and Testing] -->
- カーディナリティが高いため、バケットレンジを変更しました([#106306](https://github.com/kubernetes/kubernetes/pull/106306), [@&#xFFF0;pawbana](https://github.com/pawbana))
    - `apiserver_request_duration_seconds`
        - from: [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60]
        - to: [0.05, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 1.25, 1.5, 2, 3, 4, 5, 6, 8, 10, 15, 20, 30, 45, 60]

<!-- - Deprecate `apiserver_longrunning_gauge` and `apiserver_register_watchers` in 1.23.0. ([#103793](https://github.com/kubernetes/kubernetes/pull/103793), [@&#xFFF0;yan-lgtm](https://github.com/yan-lgtm)) -->
- 次のメトリクスが非推奨となりました([#103793](https://github.com/kubernetes/kubernetes/pull/103793), [@&#xFFF0;yan-lgtm](https://github.com/yan-lgtm))
    - `apiserver_longrunning_gauge`
    - `apiserver_register_watchers`

#### kube-scheduler

<!-- - Graduating `pending_pods`, `preemption_attempts_total`, `preemption_victims` and `schedule_attempts_total` metrics to stable. Also `e2e_scheduling_duration_seconds` is renamed to `scheduling_attempt_duration_seconds` and the latter is graduated to stable. ([#105941](https://github.com/kubernetes/kubernetes/pull/105941), [@&#xFFF0;rezakrimi](https://github.com/rezakrimi)) [SIG Instrumentation, Scheduling and Testing] -->
- 次のメトリクスの StabilityLevel が Stable になりました ([#105941](https://github.com/kubernetes/kubernetes/pull/105941), [@&#xFFF0;rezakrimi](https://github.com/rezakrimi))
    - `scheduler_pending_pods`
    - `scheduler_preemption_attempts_total`
    - `scheduler_preemption_victims`
    - `scheduler_schedule_attempts_total`
- 次のメトリクスの StabilityLevel が Stable になりリネームされました([#105941](https://github.com/kubernetes/kubernetes/pull/105941), [@&#xFFF0;rezakrimi](https://github.com/rezakrimi))
    - `scheduler_e2e_scheduling_duration_seconds` => `scheduler_scheduling_attempt_duration_seconds`

<!-- - Graduating `pod_scheduling_duration_seconds`, `pod_scheduling_attempts`, `framework_extension_point_duration_seconds`, `plugin_execution_duration_seconds` and `queue_incoming_pods_total` metrics to stable. ([#106266](https://github.com/kubernetes/kubernetes/pull/106266), [@&#xFFF0;ahg-g](https://github.com/ahg-g)) [SIG Instrumentation, Scheduling and Testing] -->
- 次のメトリクスの StabilityLevel が Stable になりました([#106266](https://github.com/kubernetes/kubernetes/pull/106266), [@&#xFFF0;ahg-g](https://github.com/ahg-g))
    - `scheduler_pod_scheduling_duration_seconds`
    - `scheduler_pod_scheduling_attempts`
    - `scheduler_framework_extension_point_duration_seconds`
    - `scheduler_plugin_execution_duration_seconds`
    - `scheduler_queue_incoming_pods_total`

#### kubelet

<!-- - Move `ConfigurableFSGroupPolicy` to GA and rename metric `volume_fsgroup_recursive_apply` to `volume_apply_access_control` ([#105885](https://github.com/kubernetes/kubernetes/pull/105885), [@&#xFFF0;gnufied](https://github.com/gnufied)) -->
- 次のメトリクスがリネームされました ([#105885](https://github.com/kubernetes/kubernetes/pull/105885), [@&#xFFF0;gnufied](https://github.com/gnufied))
    - `volume_fsgroup_recursive_apply` => `volume_apply_access_control`

<!-- - Removed the error message label from the `kubelet_started_pods_errors_total` metric ([#105213](https://github.com/kubernetes/kubernetes/pull/105213), [@&#xFFF0;yxxhero](https://github.com/yxxhero)) -->
- 文字数の長いエラーメッセージが記録されてしまうため、次のメトリクスから `message` ラベルが削除されました([#105213](https://github.com/kubernetes/kubernetes/pull/105213), [@&#xFFF0;yxxhero](https://github.com/yxxhero))
    - `kubelet_started_pods_errors_total`

### 修正

#### kube-apiserver

<!-- - Fix `kube-apiserver` metric reporting for the deprecated watch path of `/api/<version>/watch/...`. ([#104161](https://github.com/kubernetes/kubernetes/pull/104161), [@&#xFFF0;wojtek-t](https://github.com/wojtek-t)) -->
- 非推奨となっている `/api/<version>/watch/...` パスにリクエストされた際のメトリクスが WATCH として正しく記録されるように修正されました([#104161](https://github.com/kubernetes/kubernetes/pull/104161), [@&#xFFF0;wojtek-t](https://github.com/wojtek-t))

#### kubelet

<!-- - Kubelet did not report `kubelet_volume_stats_*` metrics for Generic Ephemeral Volumes. ([#105569](https://github.com/kubernetes/kubernetes/pull/105569), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- Generic Ephemeral Volumes が次のメトリクスで記録されるように修正されました([#105569](https://github.com/kubernetes/kubernetes/pull/105569), [@&#xFFF0;pohly](https://github.com/pohly))
    - `kubelet_volume_stats_*`

#### kube-scheduler

<!-- - Metrics changes: Fix exposed buckets of `scheduler_volume_scheduling_duration_seconds_bucket` metric. ([#100720](https://github.com/kubernetes/kubernetes/pull/100720), [@&#xFFF0;dntosas](https://github.com/dntosas)) -->
- 次のメトリクスのバケットレンジを修正しました([#100720](https://github.com/kubernetes/kubernetes/pull/100720), [@&#xFFF0;dntosas](https://github.com/dntosas))
    - `scheduler_volume_scheduling_duration_seconds_bucket`
    - metrics.ExponentialBuckets の引数が 1000 から 0.001 に修正されています

<!-- - Scheduler resource metrics over fractional binary quantities (2.5Gi, 1.1Ki) were incorrectly reported as very small values. ([#103751](https://github.com/kubernetes/kubernetes/pull/103751), [@&#xFFF0;y-tag](https://github.com/y-tag)) -->
- 2.5Gi、1.1Ki などの小数点を含む 2 進接頭辞の場合に、スケジューラーのメトリクスが非常に小さい値として記録されていた点が修正されました([#103751](https://github.com/kubernetes/kubernetes/pull/103751), [@&#xFFF0;y-tag](https://github.com/y-tag))
    - `kube_pod_resource_request`
    - `kube_pod_resource_limit`
    - 過去バージョンに cherry-pick されてないのがちょっと気になりますね。

#### kube-proxy

<!-- - The kube-proxy sync_proxy_rules_iptables_total metric now gives -->
<!--   the correct number of rules, rather than being off by one. -->

<!--   Fixed multiple iptables proxy regressions introduced in 1.22: -->

<!--     - When using Services with SessionAffinity, client affinity for an -->
<!--       endpoint now gets broken when that endpoint becomes non-ready -->
<!--       (rather than continuing until the endpoint is fully deleted). -->

<!--     - Traffic to a service IP now starts getting rejected (as opposed to -->
<!--       merely dropped) as soon as there are no longer any *usable* -->
<!--       endpoints, rather than waiting until all of the terminating -->
<!--       endpoints have terminated even when those terminating endpoints -->
<!--       were not being used. -->

<!--     - Chains for endpoints that won't be used are no longer output to -->
<!--       iptables, saving a bit of memory/time/cpu. ([#106030](https://github.com/kubernetes/kubernetes/pull/106030), [@&#xFFF0;danwinship](https://github.com/danwinship)) -->
- 次のメトリクスの値が間違っていたため修正され、正しいルール数が記録されるようになりました([#106030](https://github.com/kubernetes/kubernetes/pull/106030), [@&#xFFF0;danwinship](https://github.com/danwinship))
    - `kubeproxy_sync_proxy_rules_iptables_total`
    - Kubernetes v1.22 で導入された複数の iptables proxy に関する不具合が修正されました
        - Service で SessionAffinity を利用し、Endpoint が Non-Ready になると、Endpoint に対するクライアントアフィニティが壊れることがありました
        - Service IP へのトラフィックは使用可能な Endpoint がなくなった時点でリジェクトされるようになり、停止中の Endpoint が使用されていない場合でも、すべての停止中の Endpoint が終了するまで待つ必要がなくなりました
        - 使用されていない Endpoint 用の iptables のチェインのリソース（メモリ/時間/CPU）を少し節約できるようになりました

### 削除

#### kube-scheduler

<!-- - Removed deprecated metric `scheduler_volume_scheduling_duration_seconds`. ([#104518](https://github.com/kubernetes/kubernetes/pull/104518), [@&#xFFF0;dntosas](https://github.com/dntosas)) -->
- 次の非推奨だったメトリクスが削除されました([#104518](https://github.com/kubernetes/kubernetes/pull/104518), [@&#xFFF0;dntosas](https://github.com/dntosas))
    - `scheduler_volume_scheduling_duration_seconds`

## メトリクス以外の変更

### API 変更(API Changes)

<!-- - In kubelet, log verbosity and flush frequency can also be configured via the configuration file and not just via command line flags. In other commands (kube-apiserver, kube-controller-manager), the flags are listed in the "Logs flags" group and not under "Global" or "Misc". The type for `-vmodule` was made a bit more descriptive (`pattern=N,...` instead of `moduleSpec`). ([#106090](https://github.com/kubernetes/kubernetes/pull/106090), [@&#xFFF0;pohly](https://github.com/pohly)) [SIG API Machinery, Architecture, CLI, Cluster Lifecycle, Instrumentation, Node and Scheduling] -->
- kubelet では ログの Verbosity （--v）とフラッシュ頻度（--log-flush-frequency）をコマンドラインオプションだけでなく、設定ファイルからも設定できるようになりました。ヘルプのテキストでは `Global`、または `Misc` グループから、`Logs` グループで表示されるようになりました。また `-vmodule` オプションの説明が改善されています([#106090](https://github.com/kubernetes/kubernetes/pull/106090), [@&#xFFF0;pohly](https://github.com/pohly))。

```
$ docker run -it k8s.gcr.io/kube-controller-manager-amd64:v1.23.0 kube-controller-manager --help
...
Logs flags:

      --experimental-logging-sanitization
                [Experimental] When enabled prevents logging of fields tagged as sensitive (passwords, keys, tokens).
                Runtime log sanitization may introduce significant computation overhead and therefore should not be enabled in production.
      --log-flush-frequency duration
                Maximum number of seconds between log flushes (default 5s)
      --log-json-info-buffer-size quantity
                [Experimental] In JSON format with split output streams, the info messages can be buffered for a while to increase performance. The default value of zero bytes
                disables buffering. The size can be specified as number of bytes (512), multiples of 1000 (1K), multiples of 1024 (2Ki), or powers of those (3M, 4G, 5Mi, 6Gi).
      --log-json-split-stream
                [Experimental] In JSON format, write error messages to stderr and info messages to stdout. The default is to write a single stream to stdout.
      --logging-format string
                Sets the log format. Permitted formats: "json", "text".
                Non-default formats don't honor these flags: --add-dir-header, --alsologtostderr, --log-backtrace-at, --log-dir, --log-file, --log-file-max-size, --logtostderr,
                --one-output, --skip-headers, --skip-log-headers, --stderrthreshold, --vmodule.
                Non-default choices are currently alpha and subject to change without warning. (default "text")
  -v, --v Level
                number for the log level verbosity
      --vmodule pattern=N,...
                comma-separated list of pattern=N settings for file-filtered logging (only works for text log format)
...
```

### 非推奨(Deprecation)

<!-- - Kube-scheduler: the `--port` and `--address` flags have no effect and would be removed in v1.24. -->
<!--   The insecure port flags `--port` may only be set to 0 now. -->
<!--   Also `metricsBindAddress` and `healthzBindAddress` fields from `kubescheduler.config.k8s.io/v1beta1` are no-op and expected to be empty. Removed in `kubescheduler.config.k8s.io/v1beta2` completely. ([#96345](https://github.com/kubernetes/kubernetes/pull/96345), [@ingvagabund](https://github.com/ingvagabund)) -->
<!--   In addition, please be careful that: -->
<!--   - kube-scheduler MUST start with `--authorization-kubeconfig` and `--authentication-kubeconfig` correctly set to get authentication/authorization working. -->
<!--   - liveness/readiness probes to kube-scheduler MUST use HTTPS now, and the default port has been changed to 10259. -->
<!--   - Applications that fetch metrics from kube-scheduler should use a dedicated service account which is allowed to access nonResourceURLs `/metrics`. ([#96345](https://github.com/kubernetes/kubernetes/pull/96345), [@ingvagabund](https://github.com/ingvagabund)) [SIG Cloud Provider, Scheduling and Testing] -->
- kube-scheduler: `--port` と `--address` フラグは v1.24 で削除される予定です。セキュアではないポートフラグ `--port` は、現在 0 にのみ設定できます。また `kubescheduler.config.k8s.io/v1beta1` の `metricsBindAddress` と `healthzBindAddress` フィールドは設定されても無視されるため、設定しないことが期待されています。`kubescheduler.config.k8s.io/v1beta2` で完全に削除されました([#96345](https://github.com/kubernetes/kubernetes/pull/96345), [@ingvagabund](https://github.com/ingvagabund)) なお 次の点に注意してください
    - (MUST)   kube-scheduler は認証/認可を動作させるために `--authorization-kubeconfig` と `--authentication-kubeconfig` を正しくセットする必要があります
    - (MUST)   kube-scheduler への Liveness/Readiness Probe は HTTPS を使用しなければならず、デフォルトのポートは 10259 に変更されました
    - (Should) kube-scheduler からメトリクスを取得するアプリケーション（Prometheus など）は、nonResourceURLs の `/metrics` へアクセスが許可された専用の Servcie Account を使うべきです

### 機能追加(Feature)

<!-- - Added support for setting controller-manager log level online. ([#104571](https://github.com/kubernetes/kubernetes/pull/104571), [@&#xFFF0;h4ghhh](https://github.com/h4ghhh)) -->
- controller-manager で動的にログレベルを変更できる機能がサポートされました([#104571](https://github.com/kubernetes/kubernetes/pull/104571), [@&#xFFF0;h4ghhh](https://github.com/h4ghhh))
    - 詳細はこちらに素晴らしい記事があります！
        - https://qiita.com/everpeace/items/a12d378c47c3ae30602f

<!-- - The `constants/variables` from k8s.io for STABLE metrics is now supported. ([#103654](https://github.com/kubernetes/kubernetes/pull/103654), [@&#xFFF0;coffeepac](https://github.com/coffeepac)) -->
- STABLE メトリクス名に定数や変数が利用できるようになりました([#103654](https://github.com/kubernetes/kubernetes/pull/103654), [@&#xFFF0;coffee pac](https://github.com/coffeepac))
    - メトリクスの StabilityLevel をチェックする都合上(test/instrumentation/stability-utils.sh)、メトリクス名は文字列リテラルが期待されていたようですが、ツールで使うパーケージを改修し定数や変数が利用できるように対応したようです。

### 不具合の修正(Bug or Regression)

<!-- - Kubelet: the printing of flags at the start of kubelet now uses the final logging configuration. ([#106520](https://github.com/kubernetes/kubernetes/pull/106520), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- kubelet: 起動時に表示されるフラグ内容に最終的に利用されるロギングの設定内容が表示されるように修正されました([#106520](https://github.com/kubernetes/kubernetes/pull/106520), [@&#xFFF0;pohly](https://github.com/pohly))

<!-- - Migrated kubernetes object references (= name + namespace) to structured logging when using JSON as log output format ([#104877](https://github.com/kubernetes/kubernetes/pull/104877), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- ログ出力フォーマットに JSON を使用した場合、Kubernetes オブジェクトの名前と名前空間を構造化ロギングで出力するように修正しました([#104877](https://github.com/kubernetes/kubernetes/pull/104877), [@&#xFFF0;pohly](https://github.com/pohly))
    - ex) `{"ts":%f,"caller":"json/klog_test.go:%d","msg":"some","v":0,"pod":{"name":"pod-1","namespace":"kube-system"}}`

<!-- - `--log-flush-frequency` had no effect in several commands or was missing. Help and warning texts were not always using the right format for a command (`add_dir_header` instead of `add-dir-header`). Fixing this included cleaning up flag handling in component-base/logs: that package no longer adds flags to the global flag sets. Commands which want the klog and `--log-flush-frequency` flags must explicitly call `logs.AddFlags`; the new `cli.Run` does that for commands. That helper function also covers flag normalization and printing of usage and errors in a consistent way (print usage text first if parsing failed, then the error). ([#105076](https://github.com/kubernetes/kubernetes/pull/105076), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- `--log-flush-frequency` はいくつかのコンポーネントで実装されていなかったり、無視されます。ヘルプや警告のテキストは、コマンドに対して必ずしも正しいオプション名を表示できていません（`add-dir-header` ではなく `add_dir_header` になるなど）。この PR には `component-base/logs` のコマンドオプションのクリーンアップも含まれます。いくつかのロギング系のコマンドオプションは `Global` グループではなく `Logs` グループで表示されます。klog と `--log-flush-frequency` オプションが必要なコマンドは明示的に `logs.AddFlags` 関数を呼び出す必要があります。新しい `cli.Run` ヘルパー関数は、コマンドオプションの正規化や、一貫した利用方法とエラーの表示を行います。コマンドオプションのパースに失敗した場合は使用方法のヘルプを最初に表示し、その後でエラーを表示します([#105076](https://github.com/kubernetes/kubernetes/pull/105076), [@&#xFFF0;pohly](https://github.com/pohly))

### そのほか(Cleanup or Flake)

<!-- - All `klog` flags except for `-v` and `-vmodule` are deprecated. Support for `-vmodule` is only guaranteed for the text log format. ([#105042](https://github.com/kubernetes/kubernetes/pull/105042), [@&#xFFF0;pohly](https://github.com/pohly)) -->
- `-v` と `-vmodule` 以外のすべての `klog` オプションは非推奨となりました。`-vmodule` オプションのサポートは、ログフォーマットがテキストの場合のみ利用できます([#105042](https://github.com/kubernetes/kubernetes/pull/105042), [@&#xFFF0;pohly](https://github.com/pohly))

- 次のパッケージ、もしくはファイルは構造化ロギングに移行しました
    - `cmd/proxy/app`、`pkg/proxy/meta_proxier`([#104928](https://github.com/kubernetes/kubernetes/pull/104928), [@&#xFFF0;jyz0309](https://github.com/jyz0309))
    - `cmd/proxy/{config, healthcheck, winkernel}`([#104944](https://github.com/kubernetes/kubernetes/pull/104944), [@&#xFFF0;jyz0309](https://github.com/jyz0309))
    - `cmd/kube-scheduler/app/server.go`, `pkg/scheduler/framework/plugins/nodelabel/node_label.go`, `pkg/scheduler/framework/plugins/nodevolumelimits/csi.go`, `pkg/scheduler/framework/plugins/nodevolumelimits/non_csi.go`([#105855](https://github.com/kubernetes/kubernetes/pull/105855), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `pkg/proxy`([#104908](https://github.com/kubernetes/kubernetes/pull/104908), [@&#xFFF0;CIPHERTron](https://github.com/CIPHERTron))
    - `pkg/proxy`([#104891](https://github.com/kubernetes/kubernetes/pull/104891), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `pkg/proxy/ipvs`([#104932](https://github.com/kubernetes/kubernetes/pull/104932), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `pkg/proxy/userspace`([#104931](https://github.com/kubernetes/kubernetes/pull/104931), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `pkg/proxy/winuserspace`([#105035](https://github.com/kubernetes/kubernetes/pull/105035), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `pkg/scheduler`([#99273](https://github.com/kubernetes/kubernetes/pull/99273), [@&#xFFF0;yangjunmyfm192085](https://github.com/yangjunmyfm192085))
    - `pkg/scheduler/framework/plugins/interpodaffinity/filtering.go`、`pkg/scheduler/framework/plugins/podtopologyspread/filtering.go`、`pkg/scheduler/framework/plugins/volumezone/volume_zone.go`([#105931](https://github.com/kubernetes/kubernetes/pull/105931), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu))
    - `pkg/scheduler/framework/plugins/volumebinding/assume_cache.go`([#105904](https://github.com/kubernetes/kubernetes/pull/105904), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu))
    - `pkg/scheduler/framework/preemption/preemption.go`、`pkg/scheduler/framework/plugins/examples/stateful/stateful.go`、`pkg/scheduler/framework/plugins/noderesources/resource_allocation.go`([#105967](https://github.com/kubernetes/kubernetes/pull/105967), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - `migratecmd/kube-proxy/app`([#98913](https://github.com/kubernetes/kubernetes/pull/98913), [@&#xFFF0;yxxhero](https://github.com/yxxhero))
    - scheduler file `cache.go`([#105969](https://github.com/kubernetes/kubernetes/pull/105969), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))
    - scheduler files `comparer.go`, `dumper.go`, `node_tree.go`([#105968](https://github.com/kubernetes/kubernetes/pull/105968), [@&#xFFF0;shivanshu1333](https://github.com/shivanshu1333))

<!-- - More detailed logging has been added to the EndpointSlice controller for Topology. ([#104741](https://github.com/kubernetes/kubernetes/pull/104741), [@&#xFFF0;robscott](https://github.com/robscott)) -->
- EndpointSlice controller に Topology Hints 関連のログが追加されました([#104741](https://github.com/kubernetes/kubernetes/pull/104741), [@&#xFFF0;robscott](https://github.com/robscott))