Kubernetes 系统组件跟踪

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

系统组件跟踪记录集群中操作的延迟和它们之间的关系。

Kubernetes 组件使用 OpenTelemetry 协议(带有 gRPC 导出器)发出跟踪,并可以使用 OpenTelemetry 收集器 收集和路由到跟踪后端。

跟踪收集

Kubernetes 组件内置了用于 OTLP 的 gRPC 导出器,以导出跟踪,无论是否使用 OpenTelemetry 收集器。

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

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

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 请求生成跨度,以及为传出的 webhook、etcd 和重新进入请求生成跨度。它与传出请求一起传播 W3C 跟踪上下文,但不使用附加到传入请求的跟踪上下文,因为 kube-apiserver 通常是公共端点。

在 kube-apiserver 中启用跟踪

要启用跟踪,请向 kube-apiserver 提供一个带有 --tracing-config-file=<path-to-config> 的跟踪配置文件。这是一个记录每 10000 个请求中 1 个请求的跨度的示例配置,并使用默认的 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]

kubelet CRI 接口和经过身份验证的 http 服务器被检测到以生成跟踪跨度。与 apiserver 一样,端点和采样率是可配置的。跟踪上下文传播也被配置。始终会尊重父跨度的采样决定。提供的跟踪配置采样率将应用于没有父级的跨度。启用没有配置的端点时,将设置默认的 OpenTelemetry 收集器接收器地址 "localhost:4317"。

在 kubelet 中启用跟踪

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

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

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

Kubernetes v1.31 中的 kubelet 收集来自垃圾收集、Pod 同步例程以及每个 gRPC 方法的跨度。kubelet 使用 gRPC 请求传播跟踪上下文,以便具有跟踪检测的容器运行时(如 CRI-O 和 containerd)可以将其导出的跨度与来自 kubelet 的跟踪上下文关联起来。生成的跟踪将在 kubelet 和容器运行时跨度之间具有父子链接,在调试节点问题时提供有用的上下文。

请注意,导出跨度始终会在网络和 CPU 方面带来少量性能开销,具体取决于系统的整体配置。如果在启用跟踪的集群中遇到此类问题,则可以通过降低 samplingRatePerMillion 或通过删除配置完全禁用跟踪来缓解问题。

稳定性

跟踪检测仍在积极开发中,可能会以多种方式发生变化。这包括跨度名称、附加属性、检测到的端点等。在该功能升级到稳定版本之前,不保证跟踪检测的向后兼容性。

下一步

最后修改时间为 2024 年 4 月 10 日下午 9:31 PST:修改措辞以使内容更清晰 (494e36e983)