この記事は英語の原文を日本語に翻訳したものです。原文: https://opentelemetry.io/docs/specs/semconv/non-normative/k8s-migration/

翻訳元: open-telemetry/semantic-conventions v1.44.0(コミット e10a930

K8sセマンティック規約の安定化に伴う移行

note K8sセマンティック規約の安定化は、まだWip(作業中)です。 このガイドでは、その過程で生じる破壊的変更をまとめており、ユーザーが今後の変更について事前に把握できるようにしています。

変更点の数が多く、影響を受けるユーザーの範囲が広いため、OpenTelemetryが公開している既存のK8s計装は、ユーザーが安定版のK8sセマンティック規約へ移行できるよう支援する移行計画を実装する必要があります。

OpenTelemetryが公開している既存のK8s計装が安定版のK8sセマンティック規約へ更新される際は、次のようになります。

  • 既存のメジャーバージョンに環境変数OTEL_SEMCONV_STABILITY_OPT_INを導入すべきです(SHOULD)。この環境変数は次の値を受け付けます。
    • k8s — 安定版のK8s規約を出力し、それまで計装が出力していた古いK8s規約の出力を停止する。
    • k8s/dup — 古い規約と安定版の規約の両方を出力し、安定版のセマンティック規約への段階的な移行を可能にする。
    • これらの値がいずれも指定されない場合の既定の動作は、その計装がそれまで出力していた古いK8s規約のバージョンをそのまま出力し続けることです。
  • 両方の規約セットを出力するようになった時点から少なくとも6か月間は、既存のメジャーバージョンを(少なくともセキュリティパッチについて)保守する必要があります。
  • 次のメジャーバージョンでこの環境変数を削除し、安定版のK8s規約のみを出力するようにしてもよいでしょう。

特にOpenTelemetry Collectorについては次のとおりです。

移行は、2つの異なるフィーチャーゲートを通じて行われます。新しいスキーマを有効にするsemconv.k8s.enableStableと、古いスキーマを無効にするsemconv.k8s.disableLegacyです。それぞれの挙動は次のとおりです。

  • alpha版では、古いスキーマが既定で有効(semconv.k8s.disableLegacyの既定値はfalse)であり、新しいスキーマは既定で無効(semconv.k8s.enableStableの既定値はfalse)です。
  • beta版・stable版では、古いスキーマが既定で無効(semconv.k8s.disableLegacyの既定値はtrue)であり、新しいスキーマは既定で有効(semconv.k8s.enableStableの既定値はtrue)です。
  • 両方のスキーマを無効にするのはエラーです。
  • --feature-gates=-semconv.k8s.disableLegacy,+semconv.k8s.enableStableとすることで、両方のスキーマを有効にできます。

変更点のまとめ

このセクションでは、複数のバージョンにわたるK8sセマンティック規約への変更をまとめます。それぞれの開始バージョンには、その規約を安定版にするために必要なすべての変更を示しています。

K8sのネットワークメトリクス

Collectorで実装されているK8sのネットワークメトリクス、具体的にはkubeletstatsレシーバーのメトリクスは、v1.29.0でセマンティック規約として導入されました。

その属性の変更点は次のとおりです。

旧(Collector) changed
interfacenetwork.interface.name
directionnetwork.io.direction

K8s Nodeのallocatableメトリクス

Collectorで実装されているK8s Nodeのallocatableメトリクス、具体的にはk8sclusterレシーバーのメトリクスです。

Collectorの実装とセマンティック規約の間の変更点は次のとおりです。

旧(Collector) changed
k8s.node.allocatable_cpu (type: gaugek8s.node.cpu.allocatable (type: updowncounter
k8s.node.allocatable_memory (type: gaugek8s.node.memory.allocatable (type: updowncounter
k8s.node.allocatable_ephemeral_storage (type: gaugek8s.node.ephemeral_storage.allocatable (type: updowncounter
k8s.node.allocatable_pods (type: gaugek8s.node.pod.allocatable (type: updowncounter

K8s Deploymentのメトリクス

Collectorで実装されているK8s Deploymentのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクス名と型の変更点は次のとおりです。

旧(Collector) changed
k8s.deployment.desired (type: gaugek8s.deployment.pod.desired (type: updowncounter
k8s.deployment.available (type: gaugek8s.deployment.pod.available (type: updowncounter

K8s ReplicaSetのメトリクス

Collectorで実装されているK8s ReplicaSetのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクス名と型の変更点は次のとおりです。

旧(Collector) changed
k8s.replicaset.desired (type: gaugek8s.replicaset.pod.desired (type: updowncounter
k8s.replicaset.available (type: gaugek8s.replicaset.pod.available (type: updowncounter

K8s ReplicationControllerのメトリクス

Collectorで実装されているK8s ReplicationControllerのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクス名と型の変更点は次のとおりです。

旧(Collector) changed
k8s.replication_controller.desired (type: gaugek8s.replicationcontroller.pod.desired (type: updowncounter
k8s.replication_controller.available (type: gaugek8s.replicationcontroller.pod.available (type: updowncounter

K8s StatefulSetのメトリクス

Collectorで実装されているK8s StatefulSetのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクスの型の変更点は次のとおりです。

旧(Collector) changed
k8s.statefulset.desired_pods (type: gaugek8s.statefulset.pod.desired (type: updowncounter
k8s.statefulset.ready_pods (type: gaugek8s.statefulset.pod.ready (type: updowncounter
k8s.statefulset.current_pods (type: gaugek8s.statefulset.pod.current (type: updowncounter
k8s.statefulset.updated_pods (type: gaugek8s.statefulset.pod.updated (type: updowncounter

K8s HorizontalPodAutoscalerのメトリクス

Collectorで実装されているK8s HorizontalPodAutoscalerのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクス名と型の変更点は次のとおりです。

旧(Collector) changed
k8s.hpa.desired_replicas (type: gaugek8s.hpa.pod.desired (type: updowncounter
k8s.hpa.current_replicas (type: gaugek8s.hpa.pod.current (type: updowncounter
k8s.hpa.max_replicas (type: gaugek8s.hpa.pod.max (type: updowncounter
k8s.hpa.min_replicas (type: gaugek8s.hpa.pod.min (type: updowncounter

K8s DaemonSetのメトリクス

Collectorで実装されているK8s DaemonSetのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクスの型の変更点は次のとおりです。

旧(Collector) changed
k8s.daemonset.current_scheduled_nodes (type: gaugek8s.daemonset.node.current_scheduled (type: updowncounter
k8s.daemonset.desired_scheduled_nodes (type: gaugek8s.daemonset.node.desired_scheduled (type: updowncounter
k8s.daemonset.misscheduled_nodes (type: gaugek8s.daemonset.node.misscheduled (type: updowncounter
k8s.daemonset.ready_nodes (type: gaugek8s.daemonset.node.ready (type: updowncounter

K8s Jobのメトリクス

Collectorで実装されているK8s Jobのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクスの型の変更点は次のとおりです。

旧(Collector) changed
k8s.job.active_pods (type: gaugek8s.job.pod.active (type: updowncounter
k8s.job.failed_pods (type: gaugek8s.job.pod.failed (type: updowncounter
k8s.job.desired_successful_pods (type: gaugek8s.job.pod.desired_successful (type: updowncounter
k8s.job.max_parallel_pods (type: gaugek8s.job.pod.max_parallel (type: updowncounter

K8s Cronjobのメトリクス

Collectorで実装されているK8s Cronjobのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクスの型の変更点は次のとおりです。

旧(Collector) changed
k8s.cronjob.active_jobs (type: gaugek8s.cronjob.job.active (type: updowncounter

K8s Namespaceのメトリクス

Collectorで実装されているK8s Namespaceのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、v1.30.0でセマンティック規約として導入されました。

そのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.namespace.phase (type: gauge)。activeは1、terminatingは0k8s.namespace.phase (type: updowncounter)。フェーズを示すk8s.namespace.phase属性を伴う

K8s ResourceQuotaリソース

Collectorで実装されているK8s ResourceQuotaの属性、具体的にはk8sclusterレシーバーの属性は、v1.31.0でセマンティック規約として導入されました。

変更点は次のとおりです。

旧(Collector) changed
k8s.resource_quota.{name,uid}k8s.resourcequota.{name,uid}

K8s ReplicationControllerリソース

Collectorで実装されているK8s Replication Controllerの属性、具体的にはk8sclusterレシーバーの属性は、v1.31.0でセマンティック規約として導入されました。

変更点は次のとおりです。

旧(Collector) changed
k8s.replication_controller.{name,uid}k8s.replicationcontroller.{name,uid}

K8s Containerのメトリクス

Collectorで実装されているK8s Containerのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、以下でセマンティック規約として導入されました。

  • #2178(TODO: SemConvのバージョンが利用可能になったら差し替える)
  • #2074
  • #2197
  • #3558(CPUとメモリのリサイズ: desired/currentの分割)
  • #3559(CPUメトリクス)
  • #3646(メモリメトリクス)

そのメトリクスの変更点は次のとおりです。

旧(Collector) changed新(SemConv)
k8s.container.cpu_limit(type: gaugek8s.container.cpu.limit.desiredk8s.container.cpu.limit.current(type: updowncounter
k8s.container.cpu_request(type: gaugek8s.container.cpu.request.desiredk8s.container.cpu.request.current(type: updowncounter
k8s.container.memory_limit(type: gaugek8s.container.memory.limit.desiredk8s.container.memory.limit.current(type: updowncounter
k8s.container.memory_request(type: gaugek8s.container.memory.request.desiredk8s.container.memory.request.current(type: updowncounter
k8s.container.storage_limit(type: gaugek8s.container.storage.limit(type: updowncounter
k8s.container.storage_request(type: gaugek8s.container.storage.request(type: updowncounter
k8s.container.ephemeralstorage_limit(type: gaugek8s.container.ephemeral_storage.limit(type: updowncounter
k8s.container.ephemeralstorage_request(type: gaugek8s.container.ephemeral_storage.request(type: updowncounter
k8s.container.restarts(type: gaugek8s.container.restart.count(type: updowncounter
k8s.container.ready(type: gaugek8s.container.ready(type: updowncounter
k8s.container.cpu_limit_utilization(type: gaugek8s.container.cpu.limit.utilization(type: gauge
k8s.container.cpu_request_utilization(type: gaugek8s.container.cpu.request.utilization(type: gauge

注: CPUとメモリのlimitおよびrequestについて、SemConvはそれぞれをdesired(specから取得)とcurrent(コンテナのstatusから取得)に分割しています。これは、K8sコンテナのリソースリサイズをサポートするためです。

K8s ResourceQuotaのメトリクス

Collectorで実装されているK8s ResourceQuotaのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、github.com/open-telemetry/semantic-conventions/pull/2113でセマンティック規約として導入されました。

これらのメトリクスは完全に再設計されました。変更点は次のとおりです。

旧(Collector) changed
k8s.resource_quota.hard_limitk8s.resourcequota.{resource}.hard
k8s.resource_quota.usedk8s.resourcequota.{resource}.used
{resource}属性種類ごとに異なるメトリクスへ分割

OpenShift ClusterResourceQuotaのメトリクス

Collectorで実装されているOpenShift ClusterResourceQuotaのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、github.com/open-telemetry/semantic-conventions/pull/2779でセマンティック規約として導入されました。

これらのメトリクスは完全に再設計されました。変更点は次のとおりです。

旧(Collector) changed
openshift.clusterquota.hard_limitopenshift.clusterquota.{resource}.hard
openshift.clusterquota.usedopenshift.clusterquota.{resource}.used
{resource}属性種類ごとに異なるメトリクスへ分割

K8s Nodeのconditionメトリクス

Collectorで実装されているK8s Nodeのconditionメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#2077でセマンティック規約として導入されました。

そのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.node.condition_*k8s.node.condition.statusメトリクス [0,1]。異なるconditionを示すk8s.node.condition.type属性と、true/false/unknownを示すk8s.node.condition.status属性を伴う

K8s Filesystemのメトリクス

Collectorで実装されているK8s Filesystemのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#2392でセマンティック規約として導入されました。

そのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.node.filesystem.available gaugek8s.node.filesystem.available updowncounter
k8s.node.filesystem.capacity gaugek8s.node.filesystem.capacity updowncounter
k8s.node.filesystem.usage gaugek8s.node.filesystem.usage updowncounter
k8s.pod.filesystem.available gaugek8s.pod.filesystem.available updowncounter
k8s.pod.filesystem.capacity gaugek8s.pod.filesystem.capacity updowncounter
k8s.pod.filesystem.usage gaugek8s.pod.filesystem.usage updowncounter
container.filesystem.available gaugecontainer.filesystem.available updowncounter
container.filesystem.capacity gaugecontainer.filesystem.capacity updowncounter
container.filesystem.usage gaugecontainer.filesystem.usage updowncounter

K8s Pod Volumeのメトリクス

Collectorで実装されているK8s Pod Volumeのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#2319でセマンティック規約として導入されました。

これらのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.volume.availablek8s.pod.volume.available
k8s.volume.capacityk8s.pod.volume.capacity
k8s.volume.inodesk8s.pod.volume.inode.count
k8s.volume.inodes.freek8s.pod.volume.inode.free
k8s.volume.inodes.usedk8s.pod.volume.inode.used

K8s Pod Memoryのメトリクス

Collectorで実装されているK8s Pod Memoryのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#1490でセマンティック規約として導入されました。

これらのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.pod.memory.page_faultssystem.paging.fault.type属性をminorに設定したk8s.pod.paging.faults
k8s.pod.memory.major_page_faultssystem.paging.fault.type属性をmajorに設定したk8s.pod.paging.faults

Containerのメモリメトリクス

Collectorで実装されているContainerのメモリメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#1490でセマンティック規約として導入されました。

これらのメトリクスの変更点は次のとおりです。

旧(Collector) changed
container.memory.page_faultssystem.paging.fault.type属性をminorに設定したcontainer.paging.faults
container.memory.major_page_faultssystem.paging.fault.type属性をmajorに設定したcontainer.paging.faults

K8s Nodeのメモリメトリクス

Collectorで実装されているK8s Nodeのメモリメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#1490でセマンティック規約として導入されました。

これらのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.node.memory.page_faultssystem.paging.type属性をminorに設定したk8s.node.paging.faults
k8s.node.memory.major_page_faultssystem.paging.type属性をmajorに設定したk8s.node.paging.faults

コンテナランタイム

コンテナランタイムは、v1.Y.Zでセマンティック規約に導入された変更により、より詳細になりました。

その属性の変更点は次のとおりです。

旧属性 changed新属性
container.runtimecontainer.runtime.name

K8s PodのStatus PhaseとReason

Collectorで実装されているK8s PodのStatus PhaseとReasonのメトリクス、具体的にはk8sclusterレシーバーのメトリクスは、#2075でセマンティック規約として導入されました。

そのメトリクスの変更点は次のとおりです。

旧(Collector) changed
k8s.pod.status_reason メトリクス [1,6]異なるreasonを示すk8s.pod.status.reason属性を伴うk8s.pod.status.reasonメトリクス [0,1]
k8s.pod.phase メトリクス [1, 5]異なるphaseを示すk8s.pod.phase属性を伴うk8s.pod.status.phaseメトリクス [0,1]

K8sのラベルとアノテーション

Collectorで実装されているK8sのラベルとアノテーションの属性、具体的にはk8sattributesプロセッサーの属性は、#625(Pod)、#2130(Node)、#2166(Namespace)でセマンティック規約として導入されました。

上記のレシーバーとは異なり、k8sattributesプロセッサーはOTEL_SEMCONV_STABILITY_OPT_IN環境変数ではなく、独自のフィーチャーゲートprocessor.k8sattributes.EmitV1K8sConventionsprocessor.k8sattributes.DontEmitV0K8sConventionsによってこの移行を制御します。詳細は、プロセッサーのSemantic Conventions Compatibilityのドキュメントを参照してください。

これらの属性の変更点は次のとおりです。

旧(Collector) changed
k8s.pod.labels.<key>k8s.pod.label.<key>
k8s.pod.annotations.<key>k8s.pod.annotation.<key>
k8s.node.labels.<key>k8s.node.label.<key>
k8s.node.annotations.<key>k8s.node.annotation.<key>
k8s.namespace.labels.<key>k8s.namespace.label.<key>
k8s.namespace.annotations.<key>k8s.namespace.annotation.<key>

K8s Pod/Nodeおよびコンテナのメモリ使用量

Collectorで実装されているメモリ使用量のメトリクス、具体的にはkubeletstatsレシーバーのメトリクスは、プロジェクト全体の整合性を取るため#3889でInstrumentの型が変更されました。

変更点は次のとおりです。

旧(Collector) changed
k8s.pod.memory.usage gaugek8s.pod.memory.usage updowncounter
k8s.node.memory.usage gaugek8s.node.memory.usage updowncounter
container.memory.usage countercontainer.memory.usage updowncounter