Kubernetes 系统组件的跟踪

功能状态: Kubernetes v1.27 [beta]

系统组件追踪记录集群中操作的延迟和关系。

Kubernetes 组件使用 OpenTelemetry 协议,通过 gRPC 导出器发出追踪,可以使用 OpenTelemetry Collector 收集和路由到追踪后端。

追踪收集

Kubernetes 组件内置了用于 OTLP 的 gRPC 导出器,可以导出追踪,无论是使用 OpenTelemetry Collector,还是不使用 OpenTelemetry Collector。

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

默认情况下,Kubernetes 组件使用 gRPC 导出器通过 IANA OpenTelemetry 端口 4317 导出追踪。例如,如果收集器作为 Kubernetes 组件的 sidecar 运行,则以下接收器配置将收集 span 并将其记录到标准输出

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

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

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

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

组件追踪

kube-apiserver 追踪

kube-apiserver 为传入 HTTP 请求以及传出的 webhook 请求、etcd 和重入请求生成 span。它使用 W3C Trace Context 传播传出的请求,但不会使用附加到传入请求的 trace context,因为 kube-apiserver 通常是一个公共端点。

启用 kube-apiserver 中的追踪

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

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

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

kubelet 追踪

功能状态: Kubernetes v1.34 [稳定](默认启用)

kubelet CRI 接口和经过身份验证的 http 服务器被工具化以生成追踪 span。与 apiserver 一样,端点和采样率是可配置的。还配置了 trace context 传播。始终尊重父 span 的采样决策。如果提供追踪配置采样率,则该采样率将应用于没有父 span 的 span。如果没有配置端点,则默认 OpenTelemetry Collector 接收器地址设置为“localhost:4317”。

启用 kubelet 中的追踪

要启用追踪,请应用 追踪配置。这是一个 kubelet 配置片段示例,用于记录 1/10000 请求的 span,并使用默认 OpenTelemetry 端点

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

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

Kubernetes v1.35 中的 kubelet 收集垃圾回收、pod 同步例程以及每个 gRPC 方法的 span。kubelet 使用 trace context 传播 gRPC 请求,以便具有追踪工具的容器运行时,例如 CRI-O 和 containerd,可以将它们导出的 span 与 kubelet 的 trace context 关联。生成的追踪将具有 kubelet 和容器运行时 span 之间的父子链接,在调试节点问题时提供有用的上下文。

请注意,导出 span 始终会对网络和 CPU 方面带来一些性能开销,具体取决于系统的整体配置。如果集群中启用了追踪出现任何问题,则通过减少 samplingRatePerMillion 或完全禁用追踪(通过删除配置)来缓解问题。

稳定性

追踪工具仍在积极开发中,可能会以各种方式发生变化。这包括 span 名称、附加属性、工具化端点等。在 此功能毕业到稳定版本之前,无法保证追踪工具的向后兼容性。

接下来

最后修改时间:2025 年 7 月 2 日下午 12:05 PST:KEP-2831:kubelet tracing 在 1.34 中 GA (f8d1342d61)