Kubernetes 系统组件的跟踪

特性状态: Kubernetes v1.27 [beta]

系统组件跟踪记录了集群中操作的延迟及其关系。

Kubernetes 组件使用 gRPC 导出器通过 OpenTelemetry Protocol 发出跟踪,并可以使用 OpenTelemetry Collector 收集并路由到跟踪后端。

跟踪收集

Kubernetes 组件内置了用于 OTLP 的 gRPC 导出器,可以导出跟踪,可以通过 OpenTelemetry Collector,也可以不使用 OpenTelemetry Collector。

有关收集跟踪和使用收集器的完整指南,请参阅 OpenTelemetry Collector 入门。但是,有一些特定于 Kubernetes 组件的事项需要注意。

默认情况下,Kubernetes 组件使用 OTLP 的 grpc 导出器在 IANA OpenTelemetry 端口 4317 上导出跟踪。例如,如果收集器作为 Kubernetes 组件的 Sidecar 运行,则以下接收器配置将收集 Span 并将其记录到标准输出。

receivers:
  otlp:
    protocols:
      grpc:
exporters:
  # Replace this exporter with the exporter for your backend
  logging:
    logLevel: debug
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [logging]

若要不使用收集器直接将跟踪发送到后端,请在 Kubernetes 跟踪配置文件中指定 endpoint 字段,其中包含所需的跟踪后端地址。此方法无需收集器,并简化了整体结构。

对于跟踪后端头部配置,包括认证详细信息,可以使用环境变量 OTEL_EXPORTER_OTLP_HEADERS,请参阅 OTLP 导出器配置

此外,对于跟踪资源属性配置,例如 Kubernetes 集群名称、命名空间、Pod 名称等,也可以使用环境变量 OTEL_RESOURCE_ATTRIBUTES,请参阅 OTLP Kubernetes 资源

组件跟踪

kube-apiserver 跟踪

kube-apiserver 为传入的 HTTP 请求以及到 webhooks、etcd 和重入请求的传出请求生成 Span。它通过传出请求传播 W3C Trace Context,但不使用附加到传入请求的跟踪上下文,因为 kube-apiserver 通常是一个公共端点。

在 kube-apiserver 中启用跟踪

要启用跟踪,请通过 --tracing-config-file=<path-to-config> 为 kube-apiserver 提供跟踪配置文件。这是一个示例配置,它记录每 10000 个请求中的 1 个 Span,并使用默认的 OpenTelemetry 端点。

apiVersion: apiserver.config.k8s.io/v1beta1
kind: TracingConfiguration
# default value
#endpoint: localhost:4317
samplingRatePerMillion: 100

有关 TracingConfiguration 结构的更多信息,请参阅 API 服务器配置 API (v1beta1)

kubelet 跟踪

特性状态: Kubernetes v1.27 [beta] (默认启用: true)

kubelet 的 CRI 接口和认证过的 HTTP 服务器都已插装,可生成跟踪 Span。与 apiserver 一样,端点和采样率是可配置的。跟踪上下文传播也已配置。父 Span 的采样决定始终被遵循。提供的跟踪配置采样率将应用于没有父 Span 的 Span。如果在未配置端点的情况下启用,则会设置默认的 OpenTelemetry Collector 接收器地址 "localhost:4317"。

在 kubelet 中启用跟踪

要启用跟踪,请应用 跟踪配置。这是 kubelet 配置的一个示例片段,它记录每 10000 个请求中的 1 个 Span,并使用默认的 OpenTelemetry 端点。

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
  KubeletTracing: true
tracing:
  # default value
  #endpoint: localhost:4317
  samplingRatePerMillion: 100

如果 samplingRatePerMillion 设置为一百万 (1000000),那么每个 Span 都将发送到导出器。

Kubernetes v1.33 中的 kubelet 从垃圾回收、Pod 同步例程以及每个 gRPC 方法收集 Span。kubelet 通过 gRPC 请求传播跟踪上下文,以便具有跟踪插装的容器运行时(例如 CRI-O 和 containerd)可以将其导出的 Span 与来自 kubelet 的跟踪上下文关联起来。由此产生的跟踪将在 kubelet 和容器运行时 Span 之间建立父子链接,这在调试节点问题时提供了有用的上下文。

请注意,导出 Span 总是会对网络和 CPU 侧带来少量性能开销,具体取决于系统的整体配置。如果在使用跟踪功能的集群中遇到此类问题,可以通过减少 samplingRatePerMillion 或完全移除配置来禁用跟踪功能来缓解问题。

稳定性

跟踪插装仍在积极开发中,并且可能在多种方面发生变化。这包括 Span 名称、附加属性、插装的端点等。在此功能达到稳定状态之前,不保证跟踪插装的向后兼容性。

下一步

上次修改时间:2025 年 1 月 22 日下午 4:29 PST:修复 OpenTelemetry Protocol 超链接,直接指向 OTLP 规范 (6e5826ed31)