6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-13

はじめに

ここでは、Kubernetes 1.24 の CHANGELOG から Metrics の変更と SIG Instrumentation の取り組みについてまとめています。

今回 Kubernetes v1.24 で SIG Instrumentation が扱う主要なテーマと注目したいテーマについて紹介します。では確認していきます。

Contextual Logging

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

Kubernetes 1.24 has introduced contextual logging that enables the caller of a function to control all aspects of logging (output formatting, verbosity, additional values, and names).
Kubernetes 1.24 では関数の呼び出し元でロギングの設定(出力フォーマット、Verbosity、追加値、名前)を制御できる Contextual Logging が導入されました。

このテーマの KEP はこちらになります。

この KEP では現在利用しているグローバルロガーを置き換え、呼び出し元でコンテキスト情報を含んだインスタンスを生成し、呼び出し先でそのロガーインスタンスを利用する計画となっています。
この機能により klog ログ実装への強い依存を排除したり、トレース情報やコンポーネント名などのメタ情報を一元化できるなどのメリットがあります。個人的にはロガーを Dependency Injection(DI) できる点が嬉しい気がします。呼び出し先はロガーのインタフェースのみの依存となるため、テスト時のみログ出力の実装を変えるなどの対応が簡単になります。もちろん DI でも話題になりやすいコンテキストやロガーインスタンスの引き回しが発生するため、コードリーディングの観点から好みが分かれやすいトピックでもあるかなと思います。

v1.24 では開発者向けに Contextual Logging の関数が用意され利用できるようになっています。利用方法についてはこちらにサンプルがあります。

logger.go
func NewLoggerCommand() *cobra.Command {
...
			// Initialize contextual logging.
			logger := klog.Background().WithName("example").WithValues("foo", "bar")
			ctx := klog.NewContext(context.Background(), logger)

			runLogger(ctx)
...
}

func runLogger(ctx context.Context) {
...
	logger := klog.FromContext(ctx)
	logger.Info("another runtime", "duration", time.Hour, "duration", time.Minute)
...
}

上記のコードを Feature Gate 有り無しで実行すると次のような結果となります。

 ❯❯ $GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/component-base/logs/example/cmd/

# feature-gates なし
 ❯❯ go run .
...
I0512 16:05:26.791599   29789 logger.go:95] "another runtime" duration="1m0s"

# feature-gates あり
 ❯❯ go run . --feature-gates ContextualLogging=true
...
I0512 16:07:17.208820   30008 logger.go:95] "example: another runtime" foo="bar" duration="1m0s"

呼び出し元で設定された名前やキーペアがログに出力されていることが確認できました :tada:

Kubernetes のコンポーネントはまだ Contextual Logging に移行していないようで、計画では一部の kube-schduler フレームワークやプラグインから徐々に移行する予定のようです。

構造化ロギングと合わせて、公式から Contextual Logging のブログが出る予定です。公開されたら是非確認してみてください。また、こちらの移行ガイドには構造化ロギングに加え、Contextual Logging も追加されています。

その他にも KEP の追加やステージ変更があります。

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

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

追加

kube-apiserver

  • OpenAPI V3 で利用されるメトリクスが追加されました(#109128, @￰Jefftree)
    • Counter: apiextensions_openapi_v3_regeneration_count
      • Help: Counter of OpenAPI v3 spec regeneration count broken down by group, version, causing CRD and reason.
      • Labels: {"group", "version", "crd", "reason"}
  • API リクエストに関連する Estimated Seats の数を記録するための API Priority and Fairness のメトリクスが追加されました(#106628, @￰tkashem)
    • Histogram: apiserver_flowcontrol_work_estimate_seats_samples
      • Help: Number of estimated seats (maximum of initial and final seats) associated with requests in API Priority and Fairness
  • API リクエストのディスパッチを試みた結果、利用可能な空きがないために no-accommodation な状態となった回数を記録する API Priority and Fairness のメトリクスが追加されました(#106629, @￰tkashem)。
    • Counter: apiserver_flowcontrol_request_dispatch_no_accommodation_total
      • Help: Number of times a dispatch attempt resulted in a non accommodation due to lack of available seats
      • Labels: {"priority_level", "flow_schema"}
  • fieldValidation クエリーパラメータ値とサーバーサイド検証の有効無効をラベル値に持つ、バリデーションの時間を計測するメトリクスが追加されました(#109120, @￰kevindelgado)
    • Histogram: field_validation_request_duration_seconds
      • Help: Response latency distribution in seconds for each field validation value and whether field validation is enabled or not
      • Labels: {"field_validation", "enabled"}
  • Admission webhooks の呼び出しに失敗した数を記録します(#107171, @￰ltagliamonte-dd)
    • Counter: apiserver_admission_webhook_fail_open_count
      • Help: Admission webhook fail open count, identified by name and broken out for each admission type (validating or mutating).
      • Labels: {"name", "type"}

kubelet

  • コンテナの Out Of Memory(OOM) を記録するメトリクスが追加されました(#108004, @￰jonkerj)
    • Counter: container_oom_events_total
      • Help: Count of out of memory events observed for the container
      • Labels: {"container", "id", "image", "name", "namespace", "pod"}
    • cAdvisor(since 0.40.0) には入っていましたが、1.24 で kubelet から利用できるように対応しています。
  • エンドツーエンドのボリュームマウントのタイミングを記録する、operation_name ラベル値に overall_volume_mount を持つメトリクスを追加しました(#107006, @￰gnufied)。
    • Histogram: volume_operation_total_seconds
      • Labels: {"plugin_name", "operation_name"}
  • ボリュームディスク統計の計算を行う時間を記録するメトリクスが追加されました(#107201, @￰pacoxu)
    • Histogram: kubelet_volume_metric_collection_duration_seconds
      • Help: Duration in seconds to calculate volume stats
      • Labels: {"metric_source"}
  • ボリュームのヘルス状態を記録するメトリクスが追加されました(#108758, @￰fengzixu)
    • Gauge: kubelet_volume_stats_health_abnormal
      • Help: Abnormal volume health status. The count is either 1 or 0. 1 indicates the volume is unhealthy, 0 indicates volume is healthy
      • Labels: {"namespace", "persistentvolumeclaim"}

kube-proxy

  • インターナルエンドポイントを持たないサービス数を記録するメトリクスが追加されました。traffic_policy ラベル値には internal または external が記録されます(#108930, @￰MaxRenaud)
    • Gauge: sync_proxy_rules_no_local_endpoints_total
      • Help: Number of services with a Local traffic policy and no endpoints
      • Labels: {"traffic_policy"}

その他

  • client-go にリクエストとレスポンスのボディサイズを記録するメトリクスが追加されました(#108296, @￰aojea)
    • Histogram: rest_client_request_size_bytes
      • Help: Request size in bytes. Broken down by verb and host.
      • Labels: {"verb", "host"}
    • Histogram: rest_client_response_size_bytes
      • Help: Response size in bytes. Broken down by verb and host.
      • Labels: {"verb", "host"}

変更

kube-apiserver

  • 次のメトリクスに type ラベルが追加されました。type ラベル値には、ロングランでないリクエストの regular とウォッチリクエストの watch が記録されます(#105517, @￰tkashem)
    • Histogram: apiserver_flowcontrol_request_execution_seconds
      • Labels: {"priority_level", "flow_schema", "type"}

kube-controller-manager

  • 次のメトリクスがリネームされ StabilityLevel が Stable になりました。元のメトリクスは引き続き利用できますが、非推奨となりました(#106366, @￰cyclinder)
    • Counter: node_collector_evictions_number => node_collector_evictions_total

その他

  • client-go: 次のメトリクスのバケットが変更となりました(#106911, @￰aojea)
    • rest_client_request_duration_secondsrest_client_rate_limiter_duration_seconds
      • [0.001, 0.002, 0.004, 0.008, 0.016, 0.032, 0.064, 0.128, 0.256, 0.512] => [0.005, 0.025, 0.1, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 15.0, 30.0, 60.0]

非推奨

kube-apiserver

  • 次のメトリクスが非推奨となりました(#109018, @￰wojtek-t)
    • apiserver_dropped_requests_total
    • 代わりに apiserver_request_terminations_total メトリクスを利用してください。

削除

  • 削除されたメトリクスは見当たりませんでした。

修正

kube-apiserver

  • HTTP ステータスコード 429 でリジェクトされたリクエストも記録されるように修正されました(#108927, @￰wojtek-t)
    • Counter: apiserver_request_total

その他

  • メトリクスの増大を防ぐため、url ラベルを host ラベルに置き換えました。これは、セキュリティ上の理由から必要な変更です(#106539, @￰dgrisonnet)
    • rest_client_request_duration_seconds
    • rest_client_rate_limiter_duration_seconds

アップグレード前の注意事項 (Urgent Upgrade Notes)

種類別の変更点(Changes by Kind)

  • Contextual Logging のインフラが完成(フィーチャーゲートの実装と JSON バックエンドの準備が完了)(#108995, @￰pohly)

機能追加(Feature)

不具合の修正(Bug or Regression)

  • ログの出力フォーマットが JSON の場合、都度標準出力にシンクしていたため修正し性能を改善しました(#107035, @￰serathius)
  • 高いレベルのデバッグメッセージだが、JSON 出力で "v":0 と記録されていたログメッセージを修正しました(#106978, @￰pohly)
  • Windows のカーネルモードでも kube-proxy のメトリクスが公開されるように修正しました(#106581, @￰knabben)

その他(Cleanup or Flake)

  • StatefulSet のコントローラーは構造化ロギングに移行しました(#106109, @￰h4ghhh)
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?