Kubernetes 系统组件的跟踪
Kubernetes v1.27 [测试版]
系统组件跟踪记录集群中操作的延迟和关系。
Kubernetes 组件使用 OpenTelemetry 协议 和 gRPC 导出器发出跟踪,并且可以使用 OpenTelemetry 收集器 收集并路由到跟踪后端。
跟踪收集
Kubernetes 组件具有用于 OTLP 的内置 gRPC 导出器,可以使用 OpenTelemetry 收集器或不使用 OpenTelemetry 收集器导出跟踪。
有关收集跟踪和使用收集器的完整指南,请参阅 OpenTelemetry 收集器入门。但是,需要注意一些特定于 Kubernetes 组件的事项。
默认情况下,Kubernetes 组件使用 OTLP 的 grpc 导出器在 IANA OpenTelemetry 端口(4317)上导出跟踪。例如,如果收集器作为 Kubernetes 组件的边车运行,则以下接收器配置将收集 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 中启用跟踪
要启用跟踪,请使用 --tracing-config-file=<路径到配置文件>
为 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 [测试版]
kubelet CRI 接口和经过身份验证的 http 服务器经过检测以生成跟踪 span。与 apiserver 一样,端点和采样率是可配置的。还配置了跟踪上下文传播。始终遵循父 span 的采样决策。提供的跟踪配置采样率将应用于没有父级的 span。如果在未配置端点的情况下启用,则设置默认的 OpenTelemetry 收集器接收器地址“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.30 中的 kubelet 从垃圾收集、pod 同步例程以及每个 gRPC 方法收集 span。kubelet 使用 gRPC 请求传播跟踪上下文,以便具有跟踪检测的容器运行时(例如 CRI-O 和 containerd)可以将其导出的 span 与来自 kubelet 的跟踪上下文相关联。生成的跟踪将在 kubelet 和容器运行时 span 之间具有父子链接,在调试节点问题时提供有用的上下文。
请注意,导出 span 始终会带来网络和 CPU 方面的少量性能开销,具体取决于系统的整体配置。如果在启用了跟踪的集群中出现任何此类问题,请通过降低 samplingRatePerMillion
或通过删除配置完全禁用跟踪来缓解该问题。
稳定性
跟踪检测仍在积极开发中,并且可能会以多种方式发生变化。这包括 span 名称、附加属性、检测到的端点等。在该功能升级到稳定版之前,不保证跟踪检测的向后兼容性。
下一步
- 阅读有关 OpenTelemetry 收集器入门 的信息
- 阅读有关 OTLP 导出器配置 的信息