はじめに
ここでは、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-3077: contextual logging
- Feature Gate: ContextualLogging
- Stage: alpha
この KEP では現在利用しているグローバルロガーを置き換え、呼び出し元でコンテキスト情報を含んだインスタンスを生成し、呼び出し先でそのロガーインスタンスを利用する計画となっています。
この機能により klog ログ実装への強い依存を排除したり、トレース情報やコンポーネント名などのメタ情報を一元化できるなどのメリットがあります。個人的にはロガーを Dependency Injection(DI) できる点が嬉しい気がします。呼び出し先はロガーのインタフェースのみの依存となるため、テスト時のみログ出力の実装を変えるなどの対応が簡単になります。もちろん DI でも話題になりやすいコンテキストやロガーインスタンスの引き回しが発生するため、コードリーディングの観点から好みが分かれやすいトピックでもあるかなと思います。
v1.24 では開発者向けに Contextual Logging の関数が用意され利用できるようになっています。利用方法についてはこちらにサンプルがあります。
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"
呼び出し元で設定された名前やキーペアがログに出力されていることが確認できました 。
Kubernetes のコンポーネントはまだ Contextual Logging に移行していないようで、計画では一部の kube-schduler フレームワークやプラグインから徐々に移行する予定のようです。
構造化ロギングと合わせて、公式から Contextual Logging のブログが出る予定です。公開されたら是非確認してみてください。また、こちらの移行ガイドには構造化ロギングに加え、Contextual Logging も追加されています。
その他にも KEP の追加やステージ変更があります。
- Add: KEP-2831: Kubelet Tracing
- Feature Gate: KubeletTracing
- Stage: alpha
- APIServer Tracing に加え、kubelet にも Tracing が入るようです。
- Update: KEP-2845: Deprecate klog specific flags in Kubernetes Compnents
- Kubernetes 1.23 SIG Instrumentation の変更内容
- 今のところ 1.26 で GA となり、そのタイミングでフラグが削除される予定です。
- Stage: beta
- Update: KEP-647: APIServer Tracing
- FEATURE GATES: APIServerTracing
- Stage: beta
- Update: KEP-1753: Kubernetes system components logs sanitization
- Stage: 非推奨となり機能が削除されました。
- 今後は KEP-1933: Defend Against Logging Secrets via Static Analysisの静的解析のアプローチを試みます。
それでは 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"}
- Counter:
- 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
- Histogram:
- 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"}
- Counter:
- 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"}
- Histogram:
- 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"}
- Counter:
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 から利用できるように対応しています。
- Counter:
- エンドツーエンドのボリュームマウントのタイミングを記録する、operation_name ラベル値に
overall_volume_mount
を持つメトリクスを追加しました(#107006, @gnufied)。- Histogram:
volume_operation_total_seconds
- Labels: {"plugin_name", "operation_name"}
- Histogram:
- ボリュームディスク統計の計算を行う時間を記録するメトリクスが追加されました(#107201, @pacoxu)
- Histogram:
kubelet_volume_metric_collection_duration_seconds
- Help: Duration in seconds to calculate volume stats
- Labels: {"metric_source"}
- Histogram:
- ボリュームのヘルス状態を記録するメトリクスが追加されました(#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"}
- Gauge:
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"}
- Gauge:
その他
- 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"}
- Histogram:
変更
kube-apiserver
- 次のメトリクスに
type
ラベルが追加されました。type
ラベル値には、ロングランでないリクエストのregular
とウォッチリクエストのwatch
が記録されます(#105517, @tkashem)- Histogram:
apiserver_flowcontrol_request_execution_seconds
- Labels: {"priority_level", "flow_schema", "type"}
- Histogram:
kube-controller-manager
- 次のメトリクスがリネームされ StabilityLevel が Stable になりました。元のメトリクスは引き続き利用できますが、非推奨となりました(#106366, @cyclinder)
- Counter:
node_collector_evictions_number
=>node_collector_evictions_total
- Counter:
その他
- client-go: 次のメトリクスのバケットが変更となりました(#106911, @aojea)
-
rest_client_request_duration_seconds
、rest_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
- Counter:
その他
- メトリクスの増大を防ぐため、url ラベルを host ラベルに置き換えました。これは、セキュリティ上の理由から必要な変更です(#106539, @dgrisonnet)
rest_client_request_duration_seconds
rest_client_rate_limiter_duration_seconds
アップグレード前の注意事項 (Urgent Upgrade Notes)
-
Kubernetes 1.20: Metrics Changes と SIG Instrumentation の変更内容で紹介した logs-sanitization が削除されました(#107207, @ehashman)
- 今後は KEP-1933: Defend Against Logging Secrets via Static Analysisの静的解析のアプローチを試みます。
種類別の変更点(Changes by Kind)
機能追加(Feature)
不具合の修正(Bug or Regression)
- ログの出力フォーマットが JSON の場合、都度標準出力にシンクしていたため修正し性能を改善しました(#107035, @serathius)
- Metrics Server が v0.5.2 にアップデートされました(#106492, @serathius)