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

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

## はじめに

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

- [Kubernetes 1.22: Reaching New Peaks | Kubernetes](https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/)
- [Kubernetes 1.22 CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.22.md)

今回 Kubernetes v1.22 で SIG Instrumentation が扱う主要なテーマはありませんが、注目すべき機能として Alpha feature の `API Server Tracing` が記載されています。

### API Server Tracing

**======追記======**
2021-09-03 に Etcd、Mutating Webhook のトレーシングを含めたブログが公式から出ています。
API Server Tracing については次のリンクを参照してみてください。

https://kubernetes.io/blog/2021/09/03/api-server-tracing/

**======追記終わり======**

`API Server Tracing` は Kubernetes v1.22 から利用できるようになった FeatureGate です。ステージは Alpha のため、デフォルトでは無効となっています。

- [enhancements/keps/sig-instrumentation/647-apiserver-tracing · kubernetes/enhancements](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/647-apiserver-tracing)
- [Traces For Kubernetes System Components | Kubernetes](https://kubernetes.io/docs/concepts/cluster-administration/system-traces/)

FeatureGate 名からも分かるとおり、kube-apiserver コンポーネントの分散トレーシング機能のため、kube-controller-manager コンポーネントなど、他のコンポーネントは対象外です。

kube-apiserver へのリクエスト処理をデバッグするために v1.21 以前でも簡易的な[トレース](https://github.com/kubernetes/utils/tree/master/trace)機能はありました。ですが、OpenTelemetry Trace の仕様を利用することで、既存のエコシステムが利用できます。この標準的な仕様を利用することでより使いやすく、より分析が容易となる環境が構築できます。またこの取り組みにより Admission Webhooks などにコンテキストを伝播することで、kube-apiserver へのリクエストに紐つけたトレースデータを収集できるようになります(私は未確認です :pray:)。

トレースしたデータは、kube-apiserver に設定されたエンドポイントへ、OpenTelemetry Protocol (OTLP)/gRPC を使って送信されます。今回は OpenTelemetry Collector を利用し Jaeger で、kube-apiserver のトレーシングデータを確認していきます。他にも、OTLP/gRPC、または OpenTelemetry Collector の Exporter として対応したクラウドのサービスであれば、バックエンドストアとして活用できます。


まずは [kind](https://kind.sigs.k8s.io/) でクラスタ作成するための設定ファイルを作成します。
分散トレーシングを利用するためには、FeatureGate 以外にも kube-apiserver の引数で設定ファイルを指定します。私の環境の場合、ローカル PC(macOS)で作成した設定ファイルを Node と Pod に参照させるため、次のような設定ファイルとなります。


```yaml:config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraMounts:
  - hostPath: __current_dir_path__/tracing # __current_dir_path__ はローカル PC(macOS)の作業パスを指定
    containerPath: /tracing                # Node のマウント先
kubeadmConfigPatches:
- |
  kind: ClusterConfiguration
  metadata:
    name: config
  apiServer:
    extraVolumes:
    - name: api-server
      hostPath: /tracing
      mountPath: /tracing
    extraArgs:
      tracing-config-file: /tracing/config.yaml

featureGates:
  "APIServerTracing": true
```

次に、kube-apiserver の引数オプション `--tracing-config-file` に指定する分散トレーシングの設定ファイルを作成します。

```yaml:config.yaml
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: TracingConfiguration
# 後ほど作成する ClusterIP をエンドポイントとして設定します
# フォーマットには [RPC Name Resolution](https://github.com/grpc/grpc/blob/master/doc/naming.md) が利用できます
endpoint: 10.96.176.117:4317
# 100 万ごとのサンプリング数を設定します。今回はテストのため全ての処理をトレーシングします
# デフォルト値は 0 となります
samplingRatePerMillion: 1000000
```

作成した設定ファイルを元に、Kubernetes v1.22.0 でクラスタを作成します。

```shell
$ kind create cluster --config=config.yaml --image kindest/node:v1.22.0 --name kind-1.22
Creating cluster "kind-1.22" ...
 ✓ Ensuring node image (kindest/node:v1.22.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind-1.22"
You can now use your cluster with:

kubectl cluster-info --context kind-kind-1.22

Have a nice day! 👋
```

クラスタが作成できたら、OpenTelemetry Collector と Jaeger をデプロイします。
トレースデータは次のように送信され、Jaeger の Web UI でトレーシングしたデータを確認できます。

kube-apiserver => OpenTelemetry Collector => Jaeger

<details><summary>OpenTelemetry Collector</summary><div>

```yaml:otel-collector.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-collector-conf
  labels:
    app: opentelemetry
    component: otel-collector-conf
data:
  otel-collector-config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      batch:
      memory_limiter:
        ballast_size_mib: 683
        limit_mib: 1500
        spike_limit_mib: 512
        check_interval: 5s
    extensions:
      health_check: {}
      zpages: {}
    exporters:
      jaeger:
        endpoint: "jaeger-collector.kube-system.svc.cluster.local:14250"
        insecure: true
    service:
      extensions: [health_check, zpages]
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [jaeger]
---
apiVersion: v1
kind: Service
metadata:
  name: otel-collector
  labels:
    app: opentelemetry
    component: otel-collector
spec:
  type: ClusterIP
  clusterIP: 10.96.176.117
  clusterIPs:
  - 10.96.176.117
  ports:
  - name: otlp
    port: 4317
    protocol: TCP
    targetPort: 4317
  selector:
    component: otel-collector
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: otel-collector
  labels:
    app: opentelemetry
    component: otel-collector
spec:
  selector:
    matchLabels:
      app: opentelemetry
      component: otel-collector
  replicas: 1
  template:
    metadata:
      labels:
        app: opentelemetry
        component: otel-collector
    spec:
      containers:
      - command:
          - "/otelcol"
          - "--config=/conf/otel-collector-config.yaml"
          - "--mem-ballast-size-mib=683"
        image: ghcr.io/watawuwu/opentelemetry-collector-dev:test
        name: otel-collector
        ports:
        - containerPort: 4317
        volumeMounts:
        - name: otel-collector-config
          mountPath: /conf
        livenessProbe:
          httpGet:
            path: /
            port: 13133
        readinessProbe:
          httpGet:
            path: /
            port: 13133
      volumes:
        - name: otel-collector-config
          configMap:
            name: otel-collector-conf
            items:
              - key: otel-collector-config
                path: otel-collector-config.yaml

```

```shell
$ kubectl -n kube-system apply -f otel-collector.yaml
configmap/otel-collector-conf created
service/otel-collector created
deployment.apps/otel-collector created
```

</div></details>


<details><summary>Jaeger</summary><div>

```yaml:jaeger.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
  labels:
    app.kubernetes.io/name: jaeger
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app.kubernetes.io/name: jaeger
  template:
    metadata:
      labels:
        app.kubernetes.io/name: jaeger
    spec:
      containers:
      - image: jaegertracing/all-in-one
        name: jaeger
        ports:
          - containerPort: 16686
            protocol: TCP
          - containerPort: 14250
            protocol: TCP
        readinessProbe:
          httpGet:
            path: "/"
            port: 14269
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: jaeger-query
  labels:
    app.kubernetes.io/name: jaeger-query
spec:
  type: LoadBalancer
  ports:
    - name: query-http
      port: 80
      protocol: TCP
      targetPort: 16686
  selector:
    app.kubernetes.io/name: jaeger
---
apiVersion: v1
kind: Service
metadata:
  name: jaeger-collector
  labels:
    app.kubernetes.io/name: jaeger-collector
spec:
  type: ClusterIP
  ports:
  - name: jaeger-collector-grpc
    port: 14250
    protocol: TCP
    targetPort: 14250
  selector:
    app.kubernetes.io/name: jaeger
```


```shell
$ kubectl -n kube-system apply -f jaeger.yaml
deployment.apps/jaeger created
service/jaeger-query created
service/jaeger-collector created
```

</div></details>


トレーシング関連のコンポーネントをデプロイしたら、Jaeger の Jaeger UI に接続しトレーシングできていることを確認します。

```shell
$ kubectl -n kube-system port-forward svc/jaeger-query 8080:80 &
Forwarding from 127.0.0.1:8080 -> 16686
Forwarding from [::1]:8080 -> 16686

# ブラウザで http://localhost:8080 を確認してください（以下は macOS の例）
$ open http://localhost:8080
```

Jaeger UI の Service に apiserver が含まれていれば成功です。

<img width="400px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62029/802e09ea-1da1-35c8-657c-3c69b384a059.png"/>


試しに 1 つの Trace を参照してみると、kube-apiserver の呼び出しと etcd client の処理時間が計測されていることが確認できます。

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62029/fa4bb5e8-9829-16a9-bdb6-7070c38aadd3.png"/>


これらの単体の処理時間はメトリクスでも確認できますが、Admission Webhooks などと連携したトレースデータを含め、1 つのトレース情報（コンテキスト）として参照できるのは嬉しいですね。

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

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

### 追加

#### kube-apiserver

<!-- - Added new metrics about API Priority and Fairness.  Each one has a label `priority_level`.  The last two also have a label `bound` taking values `min` and `max. -->
<!--   - apiserver_flowcontrol_current_r: R(the time of the last change in state of the queues) -->
<!--   - apiserver_flowcontrol_dispatch_r: R(the time of the latest request dispatch) -->
<!--   - apiserver_flowcontrol_latest_s: S(the request last dispatched) = R(when that request starts executing in the virtual world) -->
<!--   - apiserver_flowcontrol_next_s_bounds: min and max next S among non-empty queues -->
<!--   - apiserver_flowcontrol_next_discounted_s_bounds: min and max next S - (sum [over requests executing] width * estimatedDuration) among non-empty queues ([#102859](https://github.com/kubernetes/kubernetes/pull/102859), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery and Instrumentation] -->
- API Priority and Fairness のメトリクスを追加しました([#102859](https://github.com/kubernetes/kubernetes/pull/102859), [@&#xFFF0;MikeSpreitzer](https://github.com/MikeSpreitzer))
    - Gauge: `apiserver_flowcontrol_current_r`
        - Labels: ["priority_level"]
        - Help: R(キューの状態が最後に変化したタイムスタンプ)
    - Gauge: `apiserver_flowcontrol_dispatch_r`
        - Labels: ["priority_level"]
        - Help: R(最新のリクエストが発信されたタイムスタンプ)
    - Gauge: `apiserver_flowcontrol_latest_s`
        - Labels: ["priority_level"]
        - Help: S(最後に発信されたリクエスト)
    - Gauge: `apiserver_flowcontrol_next_s_bounds`
        - Labels: ["priority_level", "bound"]
        - Help: キュー上で S(最も古くから待っているリクエスト)の最小値と最大値
    - Gauge: apiserver_flowcontrol_next_discounted_s_bounds
        - Labels: ["priority_level", "bound"]
        - Help: キュー上で S(最も古くから待っているリクエスト)から処理中の推定値を減算した最小値と最大値

<!-- - Adds metrics for the delegated authenticator used by extension APIs that delegate authentication logic to the Kube API server. ([#99364](https://github.com/kubernetes/kubernetes/pull/99364), [@&#xFFF0;p0lyn0mial](https://github.com/p0lyn0mial)) -->
<!-- - Adds metrics for the delegated authorizer used by extension APIs that delegate authorization logic to the Kube API server. ([#100339](https://github.com/kubernetes/kubernetes/pull/100339), [@&#xFFF0;p0lyn0mial](https://github.com/p0lyn0mial)) -->
- 認証ロジックを kube-apiserver に委譲する拡張 API で使用されるメトリクスを追加しました([#99364](https://github.com/kubernetes/kubernetes/pull/99364), [#100339](https://github.com/kubernetes/kubernetes/pull/100339) [@&#xFFF0;p0lyn0mial](https://github.com/p0lyn0mial))
    - Counter: `apiserver_delegated_authn_request_total`
        - Labels: ["code"]
        - Help: 委譲された HTTP リクエスト数
    - Histogram: `apiserver_delegated_authn_request_duration_seconds`
        - Labels: ["code"]
        - Help: 委譲された HTTP リクエストの処理時間
    - Counter: `apiserver_delegated_authz_request_total`
        - Labels: ["code"]
        - Help: 委譲された HTTP リクエスト数
    - Histogram: `apiserver_delegated_authz_request_duration_seconds`
        - Labels: ["code"]
        - Help: 委譲された HTTP リクエストの処理時間

<!-- - New metrics: `apiserver_kube_aggregator_x509_missing_san_total` and `apiserver_webhooks_x509_missing_san_total`. This metric measures a number of connections to webhooks/aggregated API servers that use certificates without Subject Alternative Names. It being non-zero is a warning sign that these connections will stop functioning in the future since Golang is going to deprecate x509 certificate subject Common Names for server hostname verification. ([#95396](https://github.com/kubernetes/kubernetes/pull/95396), [@&#xFFF0;stlaz](https://github.com/stlaz)) [SIG API Machinery, Auth and Instrumentation] -->
- SAN(Subject Alternative Names) を持たない証明書を使用する Webhooks/Aggregated API への接続数を記録します。将来的にホスト名の検証に CN（Common Names）は使用されなくなります。このメトリクスがゼロではない場合、将来的に機能しなくなる可能性があるため、SAN を持つ証明書に移行が必要です([#95396](https://github.com/kubernetes/kubernetes/pull/95396), [@&#xFFF0;stlaz](https://github.com/stlaz))。
    - Counter: `apiserver_kube_aggregator_x509_missing_san_total`
    - Counter: `apiserver_webhooks_x509_missing_san_total`

<!-- これは重複してる -->
<!-- This metric measures a number of connections to webhooks/aggregated API servers that use certificates without Subject Alternative Names. It being non-zero is a warning sign that these connections will stop functioning in the future since Golang is going to deprecate x509 certificate subject Common Names for server hostname verification. ([#95396](https://github.com/kubernetes/kubernetes/pull/95396), [@&#xFFF0;stlaz](https://github.com/stlaz)) [SIG API Machinery, Auth and Instrumentation] -->
<!--   - Counter: `apiserver_kube_aggregator_x509_missing_san_total` -->
<!--   - Gauge: `apiserver_webhooks_x509_missing_san_total` -->

#### kubelet

<!-- - Expose container start time as `container_start_time_seconds` in the kubelet `/metrics/resource` endpoint. ([#102444](https://github.com/kubernetes/kubernetes/pull/102444), [@&#xFFF0;sanwishe](https://github.com/sanwishe)) -->
- kubelet の `/metrics/resource` エンドポイントにコンテナの起動時刻を記録します([#102444](https://github.com/kubernetes/kubernetes/pull/102444), [@&#xFFF0;sanwishe](https://github.com/sanwishe))
  - Gauge: `container_start_time_seconds`
    - Labels: ["container", "pod", "namespace"]

#### kube-controller-manager

<!-- - Add three metrics to the job controller to monitor if a job works in healthy condition. `IndexedJob` has been promoted to Beta. ([#101292](https://github.com/kubernetes/kubernetes/pull/101292), [@&#xFFF0;AliceZhang2016](https://github.com/AliceZhang2016)) -->
<!-- - Added the "action" label to Job controller sync metrics job_sync_total and job_sync_duration_seconds ([#102022](https://github.com/kubernetes/kubernetes/pull/102022), [@&#xFFF0;adtac](https://github.com/adtac)) [SIG Apps, Instrumentation and Testing] -->
- Job が正常な状態で動作しているかどうかを監視します([#101292](https://github.com/kubernetes/kubernetes/pull/101292), [@&#xFFF0;AliceZhang2016](https://github.com/AliceZhang2016)、[#102022](https://github.com/kubernetes/kubernetes/pull/102022), [@&#xFFF0;adtac](https://github.com/adtac))
    - Histogram:  `job_controller_job_sync_duration_seconds`
        - Labels: ["completion_mode", "result", "action"]
    - Counter: `job_controller_job_sync_total`
        - Labels: ["completion_mode", "result", "action"]
    - Counter: `job_controller_job_finished_total`
        - Labels: ["completion_mode", "result"]

#### component-base

<!-- - Expose `rest_client_rate_limiter_duration_seconds` metric to component-base to track client side rate limiter latency in seconds. Broken down by verb and URL. ([#100311](https://github.com/kubernetes/kubernetes/pull/100311), [@&#xFFF0;IonutBajescu](https://github.com/IonutBajescu)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -->
- component-base に クライアントサイドの Rate Limiter のレイテンシーを記録するメトリクスを追加しました([#100311](https://github.com/kubernetes/kubernetes/pull/100311), [@&#xFFF0;IonutBajescu](https://github.com/IonutBajescu))
    - Histogram: `rest_client_rate_limiter_duration_seconds`
        - Labels: ["verb", "url"]

### 変更

#### kube-apiserver

<!-- - Add a namespace label for all `apiserver_admission_* metrics`. Expand the histogram range to 0-10s for all `apiserver_admission_*_duration_seconds` metrics. ([#101208](https://github.com/kubernetes/kubernetes/pull/101208), [@&#xFFF0;voutcn](https://github.com/voutcn)) -->
- 次のメトリクスに `namespace` ラベルを追加し、`*_duration_seconds` メトリクスにはバケットを追加しました([#101208](https://github.com/kubernetes/kubernetes/pull/101208), [@&#xFFF0;voutcn](https://github.com/voutcn))
    - Histogram: `apiserver_admission_*`
        - Labels: ["type", "operation", "rejected", "namespace"]
    - Histogram: `apiserver_admission_*_duration_seconds`
        - Labels: ["type", "operation", "rejected", "namespace"]
        - Buckets: [0.005, 0.025, 0.1, 0.5, 2.5, 5.0, 10.0]

<!-- - The `WarningHeader` feature is now GA and is unconditionally enabled. The `apiserver_requested_deprecated_apis` metric has graduated to stable status. The `WarningHeader` feature-gate is no longer operative and will be removed in v1.24. ([#100754](https://github.com/kubernetes/kubernetes/pull/100754), [@&#xFFF0;liggitt](https://github.com/liggitt)) [SIG API Machinery, Instrumentation and Testing] -->
- 次のメトリクスの StabilityLevel が Stable になりました([#100754](https://github.com/kubernetes/kubernetes/pull/100754), [@&#xFFF0;liggitt](https://github.com/liggitt))
    - Gauge: `apiserver_requested_deprecated_apis`

### 修正

#### kube-apiserver
<!-- - Fix "verb" and "scope" tag in apiserver_longrunning_gauge and apiserver_request_terminations_total  such that a GET namespaced object by name call will have verb "GET" instead of "LIST", and scope "resource" instead of "namespace" ([#103565](https://github.com/kubernetes/kubernetes/pull/103565), [@&#xFFF0;zhan849](https://github.com/zhan849)) [SIG API Machinery and Instrumentation] -->
- 次のメトリクスの Label 値に記録される値を修正しました。Namespaced な Object を GET した場合、`verb` には `LIST` ではなく `GET` を、`scope` には`namespace` ではなく `resource` となるように値を修正([#103565](https://github.com/kubernetes/kubernetes/pull/103565), [@&#xFFF0;zhan849](https://github.com/zhan849))
    - Gauge: `apiserver_longrunning_gauge`
        - Labels: ["verb", "group", "version", "resource", "subresource", "scope", "component"]
    - Gauge: `apiserver_request_terminations_total`
        - Labels: ["verb", "group", "version", "resource", "subresource", "scope", "component", "code"]

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

### 機能追加(Feature)

<!-- - Add distributed tracing to the `kube-apiserver`. It is can be enabled with the feature gate `APIServerTracing` ([#94942](https://github.com/kubernetes/kubernetes/pull/94942), [@&#xFFF0;dashpole](https://github.com/dashpole)) -->
- `APIServerTracing` FetureGate を有効にすると、`kube-apiserver` で分散トレーシングの機能が利用できます([#94942](https://github.com/kubernetes/kubernetes/pull/94942), [@&#xFFF0;dashpole](https://github.com/dashpole))
    - FeatureGate: APIServerTracing, Stage: alpha, Since: 1.22
    - kube-apiserver に `--tracing-config-file` のオプションが追加されています

<!-- - APIServerTracing now collects spans from etcd client calls, and propagates context to etcd. ([#103216](https://github.com/kubernetes/kubernetes/pull/103216), [@&#xFFF0;dashpole](https://github.com/dashpole)) -->
- etcd クライアントの呼び出しから span を記録し、コンテキストを etcd に伝播します([#103216](https://github.com/kubernetes/kubernetes/pull/103216), [@&#xFFF0;dashpole](https://github.com/dashpole))

<!-- - API Server tracing can now trace re-entrant api requests. ([#103218](https://github.com/kubernetes/kubernetes/pull/103218), [@&#xFFF0;dashpole](https://github.com/dashpole)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation] -->
- `kube-apiserver` の分散トレーシングで、リエントラントな API リクエストをトレースできるようになりました([#103218](https://github.com/kubernetes/kubernetes/pull/103218), [@&#xFFF0;dashpole](https://github.com/dashpole))
    - リエントラントな API については[こちら](https://github.com/kubernetes/enhancements/tree/master/keps/sig-instrumentation/647-apiserver-tracing#tracing-api-requests)を参照してください

<!-- - JSON logging format is no longer available by default in non-core Kubernetes Components and require owners to opt in. ([#102869](https://github.com/kubernetes/kubernetes/pull/102869), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu)) [SIG API Machinery, Cluster Lifecycle and Instrumentation] -->
- JSON ロギングフォーマットは GA ではないため、component-base/logs ライブラリの JSON ロギングフォーマットのデフォルトを `text` に変更しました。コンポーネント作成者は必要に応じてロギングフォーマットを `json` に変更する必要があります([#102869](https://github.com/kubernetes/kubernetes/pull/102869), [@&#xFFF0;mengjiao-liu](https://github.com/mengjiao-liu))。

<!-- - Metrics server nanny has now poll period set to 30s (previously 5 minutes) to allow faster scaling of metrics server. ([#101869](https://github.com/kubernetes/kubernetes/pull/101869), [@&#xFFF0;olagacek](https://github.com/olagacek)) [SIG Cloud Provider and Instrumentation] -->
- Metrics server の nanny コンテナのポーリング周期を 5 分から 30 秒に変更し、Metrics server のスケーリングを高速化しました([#101869](https://github.com/kubernetes/kubernetes/pull/101869), [@&#xFFF0;olagacek](https://github.com/olagacek))

<!-- 時間があれば -->
<!-- - Some of the in-tree storage drivers indicate support for the `MetricsProvider` interface, but fail to configure this for BlockMode volumes. With a recent change, `Kubelet` will call `GetMetrics()` for BlockMode volumes, and the in-tree drivers that miss the support cause a Go panic. Now the in-tree storage drivers that support BlockMode volumes, will return the Capacity of the volume in the `GetMetrics()` call. ([#101587](https://github.com/kubernetes/kubernetes/pull/101587), [@&#xFFF0;nixpanic](https://github.com/nixpanic)) -->

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

<!-- - Applications that fetch metrics from controller-manager should use a dedicated service account which is allowed to access nonResourceURLs `/metrics`. ([#96216](https://github.com/kubernetes/kubernetes/pull/96216), [@knight42](https://github.com/knight42)) [SIG API Machinery, Cloud Provider, Instrumentation and Testing] -->
- controller-manager から insecure port が削除されたため、メトリクスのエンドポイントも secure port でアクセスする必要があります。メトリクスを取得するアプリケーションは、nonResourceURLs である `/metrics` へのアクセスが許可された専用のサービスアカウントを使用する必要があります([#96216](https://github.com/kubernetes/kubernetes/pull/96216), [@knight42](https://github.com/knight42))。

<!-- - When `DisableAcceleratorUsageMetrics` is set, do not collect accelerator metrics using cAdvisor. ([#101712](https://github.com/kubernetes/kubernetes/pull/101712), [@&#xFFF0;SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Instrumentation and Node] -->
- `DisableAcceleratorUsageMetrics` の FeatureGate を有効にした場合、cAdvisor を使って Accelerator メトリクスが収集されないように修正されました([#101712](https://github.com/kubernetes/kubernetes/pull/101712), [@&#xFFF0;SergeyKanzhelev](https://github.com/SergeyKanzhelev))

<!-- - Metrics Server will use Addon Manager 1.8.3 ([#103541](https://github.com/kubernetes/kubernetes/pull/103541), [@&#xFFF0;jbartosik](https://github.com/jbartosik)) [SIG Cloud Provider and Instrumentation] -->
- [Addon] Metrics Server アドオンの addon-resizer コンテナのバージョンを 1.8.14 に更新しました([#103541](https://github.com/kubernetes/kubernetes/pull/103541), [@&#xFFF0;jbartosik](https://github.com/jbartosik))

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

<!-- - Disable log sampling when using json logging format. ([#102620](https://github.com/kubernetes/kubernetes/pull/102620), [@&#xFFF0;serathius](https://github.com/serathius)) -->
- JSON ロギングフォーマットが有効な場合は、`go.uber.org/zap` ロギングライブラリの機能である [Sampling](https://pkg.go.dev/go.uber.org/zap#SamplingConfig) を無効化しました([#102620](https://github.com/kubernetes/kubernetes/pull/102620), [@&#xFFF0;serathius](https://github.com/serathius))

<!-- - JSON logging now supports having information about source code location in the logging format, source code information is available under the key "caller". ([#102437](https://github.com/kubernetes/kubernetes/pull/102437), [@&#xFFF0;MadhavJivrajani](https://github.com/MadhavJivrajani))
-->
- JSON ロギングフォーマットでソースコードの位置情報を `caller` というキーで記録するようになりました :tada: ([#102437](https://github.com/kubernetes/kubernetes/pull/102437), [@&#xFFF0;MadhavJivrajani](https://github.com/MadhavJivrajani))
    - ex) `{"ts":1629262280084.1306,"caller":"kubelet/kubelet.go:2149","msg":"SyncLoop (housekeeping) end","v":4}`

<!-- - Migrate `proxy/ipvs/proxier.go` logs to structured logging. ([#97796](https://github.com/kubernetes/kubernetes/pull/97796), [@&#xFFF0;JornShen](https://github.com/JornShen)) -->
- `proxy/ipvs/proxier.go` のログを構造化ロギングに移行しました([#97796](https://github.com/kubernetes/kubernetes/pull/97796), [@&#xFFF0;JornShen](https://github.com/JornShen))

<!-- - Migrate `staging/src/k8s.io/apiserver/pkg/registry` logs to structured logging. ([#98287](https://github.com/kubernetes/kubernetes/pull/98287), [@&#xFFF0;lala123912](https://github.com/lala123912)) -->
- `staging/src/k8s.io/apiserver/pkg/registry` のログを構造化ロギングに移行しました([#98287](https://github.com/kubernetes/kubernetes/pull/98287), [@&#xFFF0;lala123912](https://github.com/lala123912))

<!-- - Migrate some log messages to structured logging in `pkg/volume/plugins.go`. ([#101510](https://github.com/kubernetes/kubernetes/pull/101510), [@&#xFFF0;huchengze](https://github.com/huchengze)) -->
- `pkg/volume/plugins.go` の一部のログを構造化ロギングに移行しました([#101510](https://github.com/kubernetes/kubernetes/pull/101510), [@&#xFFF0;huchengze](https://github.com/huchengze))

<!-- - Migrate some log messages to structured logging in `pkg/volume/volume_linux.go`. ([#99566](https://github.com/kubernetes/kubernetes/pull/99566), [@&#xFFF0;huchengze](https://github.com/huchengze)) -->
- `pkg/volume/volume_linux.go` の一部のログを構造化ロギングに移行しました([#99566](https://github.com/kubernetes/kubernetes/pull/99566), [@&#xFFF0;huchengze](https://github.com/huchengze))

<!-- ### メモ -->
<!-- - The `PodUnknown` phase is now deprecated. ([#95286](https://github.com/kubernetes/kubernetes/pull/95286), [@&#xFFF0;SergeyKanzhelev](https://github.com/SergeyKanzhelev))- -->
<!-- - Expose `/debug/flags/v` to allow dynamically setting log level for kube-proxy. ([#98306](https://github.com/kubernetes/kubernetes/pull/98306), [@&#xFFF0;borgerli](https://github.com/borgerli)) [SIG Network] -->
<!-- - New feature gate `ExpandedDNSConfig` is now available. This feature allows Kubernetes to have expanded DNS configuration. ([#100651](https://github.com/kubernetes/kubernetes/pull/100651), [@&#xFFF0;gjkim42](https://github.com/gjkim42)) -->