Kubernetes 系统组件的跟踪

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

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

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

追踪收集

Kubernetes 组件内置了 OTLP 的 gRPC 导出器来导出追踪信息,可以使用 OpenTelemetry 收集器,也可以不使用 OpenTelemetry 收集器。

有关收集追踪信息和使用收集器的完整指南,请参阅 OpenTelemetry 收集器入门。 但是,有一些需要注意的事项是 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 请求以及对 webhook、etcd 和重入请求的传出请求生成 span。 它会使用传出请求传播 W3C 追踪上下文,但不会使用附加到传入请求的追踪上下文,因为 kube-apiserver 通常是一个公共端点。

在 kube-apiserver 中启用追踪

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

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

有关 TracingConfiguration 结构的更多信息,请参阅 API server config API (v1beta1)

kubelet 追踪

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

kubelet CRI 接口和经过身份验证的 http 服务器已进行检测以生成追踪 span。 与 apiserver 一样,端点和采样率是可配置的。 还配置了追踪上下文传播。 父 span 的采样决策始终受到尊重。 提供的追踪配置采样率将应用于没有父 span 的 span。 如果没有配置端点,则会设置默认的 OpenTelemetry 收集器接收器地址 “localhost:4317”。

在 kubelet 中启用追踪

要启用追踪,请应用 追踪配置。 这是一个 kubelet 配置的示例片段,它记录 1/10000 请求的 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.32 中的 kubelet 从垃圾回收、Pod 同步例程以及每个 gRPC 方法中收集 span。 kubelet 使用 gRPC 请求传播追踪上下文,以便具有追踪检测的容器运行时(例如 CRI-O 和 containerd)可以将它们导出的 span 与来自 kubelet 的追踪上下文相关联。 生成的追踪信息将在 kubelet 和容器运行时 span 之间具有父子链接,从而在调试节点问题时提供有用的上下文。

请注意,导出 span 始终会在网络和 CPU 方面带来很小的性能开销,具体取决于系统的整体配置。 如果集群中启用了追踪功能时出现任何类似问题,则可以通过降低 samplingRatePerMillion 或完全删除配置来禁用追踪来缓解问题。

稳定性

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

下一步

上次修改时间:太平洋标准时间 2024 年 4 月 10 日下午 9:31:修改文字以使其清晰 (494e36e983)