OpenTelemetry 入门与 Kubernetes 部署指南
OpenTelemetry 入门与 Kubernetes 部署指南
版本:2026.10
适用:OpenTelemetry Operator v0.158.0+ · Collector Contrib · Java Agent 3.0 预览
标签:OpenTelemetryKubernetes可观测性分布式追踪OTLP
📖 目录
- 一、为什么需要分布式追踪?
- 二、OpenTelemetry 是什么?
- 三、检测(埋点)方式
- 四、传播器
- 五、采样
- 六、OpenTelemetry 协议(OTLP)
- 七、OpenTelemetry Collector
- 八、Collector 部署模式
- 九、在 Kubernetes 上使用 OpenTelemetry
- 十、关键变更速查表
- 十一、总结
一、为什么需要分布式追踪?
在微服务架构中,一个请求可能经过几十甚至上百次网络调用。仅靠日志和指标,很难追踪请求的完整路径。分布式追踪以 Span 的形式记录请求在整个服务链路中的交互过程,包含延迟、错误等元数据,帮助快速定位瓶颈和故障。
二、OpenTelemetry 是什么?
OpenTelemetry 是一组开源、与供应商无关的工具、API 和 SDK 的集合,用于检测、生成、收集和导出遥测数据。它是 CNCF 的毕业项目,涵盖可观测性三大支柱:
| 支柱 | 说明 |
|---|---|
| 追踪(Traces) | 服务请求在分布式系统中的完整路径 |
| 指标(Metrics) | 对一段时间内活动的测量 |
| 日志(Logs) | 系统或应用在特定时间点发生的事件的记录 |
核心优势:检测与后端解耦。开发者无需绑定特定商业供应商,可自由选择编程语言和存储后端。
三、检测(埋点)方式
- 自动检测:无需大量代码更改,Operator 通过注入 init 容器和配置实现零代码埋点。
- 手动检测:编写特定的埋点代码,可精确控制 Span 的属性和事件。
两者可混合使用:自动检测负责框架层埋点,手动检测补充业务级 Span。
四、传播器
传播器用于跨进程边界传递上下文数据。当前推荐使用 W3C Trace Context、Baggage 和 B3:
| 传播器 | 用途 |
|---|---|
| Trace Context | 在 HTTP headers 中编码 trace 数据 |
| Baggage | 在 span 之间传递键值对数据 |
| B3 | Zipkin 兼容的 trace 传递格式 |
五、采样
采样用于控制收集和发送到后端的追踪数据量,降低开销。常见方式包括:
- 头采样:在追踪开始时决定是否采样。
- 尾采样:根据完整追踪结果决定是否采样。
Collector 支持通过 tailsamplingprocessor 实现尾采样策略。
六、OpenTelemetry 协议(OTLP)
OTLP 是遥测数据在 SDK、Collector 和后端之间的标准传输协议。支持 gRPC 和 HTTP 两种传输方式,默认端口分别为:
| 传输方式 | 默认端口 |
|---|---|
| gRPC | 4317 |
| HTTP | 4318 |
七、OpenTelemetry Collector
Collector 是 OpenTelemetry 的核心组件,负责接收、处理和导出遥测数据。其架构包含以下部分:
7.1 Receivers(接收器)
接收器支持推送和拉取模式,标准配置同时在 gRPC 和 HTTP 端口上接受 OTLP 数据:
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
7.2 Processors(处理器)
处理器在接收和导出之间处理数据。强烈推荐将 memory_limiter 放在每个 pipeline 的第一个处理器位置,batch 紧随其后。
Memory Limiter 参数语义(2026 修正)
memory_limiter 的参数含义在官方文档中已明确:
| 参数 | 含义 | 建议值 |
|---|---|---|
limit_mib |
硬性内存上限(hard heap target) | 可用内存的 80–90% |
spike_limit_mib |
允许的瞬时内存增长缓冲区 | limit_mib 的 20–25% |
check_interval |
内存检查频率 | 生产环境 1–5 秒 |
当内存使用超过 limit_mib - spike_limit_mib(软限制)时,Collector 开始拒绝新数据;超过 limit_mib 时,强制触发 GC 并拒绝数据。
processors:
memory_limiter:
check_interval: 1s
limit_mib: 1800 # 硬限制
spike_limit_mib: 400 # 软限制 = 1800 - 400 = 1400 MiB
batch:
send_batch_size: 10000
timeout: 10s
示例:容器内存限制为 2GB 时,
limit_mib: 1800(90%),spike_limit_mib: 400(约 22%),软限制为 1400 MiB。当内存超过 1400 MiB 时 Collector 开始拒绝数据,为 GC 和恢复争取时间。
7.3 Exporters(导出器)
OTLP 导出器键名变更(重要)
OTLP 导出器的配置键名已更新:
| 传输方式 | 新键名 | 旧键名(已弃用) |
|---|---|---|
| gRPC | otlp_grpc |
otlp |
| HTTP | otlp_http |
otlphttp |
exporters:
debug:
verbosity: detailed
otlp_grpc:
endpoint: "central-collector-collector.observability.svc:4317"
tls:
insecure: true
otlp_http:
endpoint: "http://central-collector-collector.observability.svc:4318"
注意:
otlp_grpc默认使用gzip压缩,可配置为snappy以降低 CPU 占用。
兼容性:若你的 Collector 版本较旧,请将otlp_grpc替换为otlp,将otlp_http替换为otlphttp。
Jaeger 导出器已移除
专用的 jaeger 导出器在 Collector contrib v0.86.0(2023 年 9 月) 中已被完全移除。如需将追踪数据发送到 Jaeger,应使用 otlp_grpc/jaeger(旧版为 otlp/jaeger)导出器,指向 Jaeger 的 OTLP gRPC 端口 4317(而非旧的 14250 端口)。
exporters:
otlp_grpc/jaeger:
endpoint: "jaeger.example.com:4317"
tls:
insecure: true
logging 导出器已弃用
logging 导出器已被 debug 导出器取代,loglevel 字段替换为 verbosity。
exporters:
debug:
verbosity: detailed
7.4 Extensions(扩展)
扩展用于健康监控、服务发现等非遥测数据处理任务,是可选的:
extensions:
health_check:
pprof:
zpages:
八、Collector 部署模式
8.1 Agent 模式
Agent 模式将 Collector 部署为 sidecar 或 DaemonSet,与应用一起运行。应用通过 localhost 将数据发送到 Agent Collector,再由其转发到中心 Collector 或后端。
| 优点 | 缺点 |
|---|---|
| 启动简单,应用与 Collector 一对一映射清晰 | 对于团队和基础设施资源扩展性有限 |
8.2 Gateway 模式
Gateway 模式将数据发送到中心 Collector,再由其统一导出到后端。
优点:
- 消除对团队配置的依赖
- 集中执行批处理、重试、加密、压缩策略
- 统一身份验证和采样决策
- 通过 HPA 自动扩展
8.3 Kubernetes 部署模式对比
| 模式 | 说明 |
|---|---|
| Sidecar | Collector 作为 sidecar 容器注入应用 Pod,数据经 localhost 转发 |
| DaemonSet | 每个节点部署一个 Agent Pod |
| Deployment | 中心 Collector 以 Deployment 方式部署,支持 HPA 自动扩展 |
九、在 Kubernetes 上使用 OpenTelemetry
9.1 部署 OpenTelemetry Operator
当前 Operator 最新版本为 v0.158.0(2026 年 8 月发布)。推荐使用 Helm Chart 部署:
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm upgrade --install --set admissionWebhooks.certManager.enabled=false \
--set admissionWebhooks.certManager.autoGenerateCert=true \
opentelemetry-operator open-telemetry/opentelemetry-operator \
--namespace observability --create-namespace
9.2 创建中心 Collector(Gateway 模式)
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: central-collector
namespace: observability
spec:
config: |
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
processors:
memory_limiter:
check_interval: 1s
limit_mib: 1800
spike_limit_mib: 400
batch:
send_batch_size: 10000
timeout: 10s
exporters:
debug:
verbosity: detailed
otlp_grpc/jaeger:
endpoint: "jaeger.example.com:4317"
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [debug, otlp_grpc/jaeger]
Operator 会创建名为
central-collector-collector的 Service,暴露 4317/4318 端口。
9.3 创建 Sidecar Agent
Sidecar 模式的 Collector 配置需精简,批处理使用更小的批量和更短的超时以降低延迟:
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: otel-sidecar
namespace: observability
spec:
mode: sidecar
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 64Mi
config: |
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
processors:
memory_limiter:
check_interval: 1s
limit_mib: 100
spike_limit_mib: 30
batch:
timeout: 2s
send_batch_size: 500
exporters:
otlp_grpc:
endpoint: "central-collector-collector.observability.svc:4317"
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp_grpc]
Sidecar 容器与中心 Collector 在同一集群内通信,可使用
tls.insecure: true简化配置。
9.4 Sidecar 注入注解
在应用 Pod 的 metadata 中添加以下注解,触发 Sidecar 注入。注解值需匹配 OpenTelemetryCollector CR 的命名空间和名称:
annotations:
sidecar.opentelemetry.io/inject: "observability/otel-sidecar"
该注解可应用于 Pod 级别或命名空间级别。
9.5 自动检测配置(Instrumentation CRD)
创建 Instrumentation 资源以启用自动埋点注入:
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: otel-instrumentation
namespace: observability
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "0.25"
exporter:
endpoint: "http://localhost:4318"
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
Java Agent 3.0 即将发布:当前 2.32.0 是 3.0 的候选版本,3.0 计划于 2026 年 10 月发布。3.0 将更改遥测数据、配置和埋点默认行为,包括数据库、代码和消息传递的语义约定变更。建议在生产环境中先使用预览标志验证兼容性:
# 预览 3.0 的遥测默认行为
OTEL_INSTRUMENTATION_COMMON_V3_PREVIEW=true
OTEL_SEMCONV_STABILITY_OPT_IN=database/dup,code/dup
OTEL_SEMCONV_STABILITY_PREVIEW=messaging/dup
9.6 为应用启用自动检测
在应用 Deployment 的 Pod 模板中添加注解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
annotations:
instrumentation.opentelemetry.io/inject-java: "observability/otel-instrumentation"
sidecar.opentelemetry.io/inject: "observability/otel-sidecar"
spec:
containers:
- name: app
image: my-app:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://localhost:4318"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
inject-java 注解触发 Java Agent 的 init 容器注入;sidecar.opentelemetry.io/inject 注解触发 Collector Sidecar 注入。应用通过 localhost:4318 将遥测数据发送到同一 Pod 内的 Sidecar Collector。
9.7 验证追踪数据
查看 Sidecar Collector 日志,确认数据已接收并导出:
kubectl logs -f deploy/my-app -c otc-container -n default
预期输出示例:
TracesExporter {"kind": "exporter", "data_type": "traces", "name": "otlp_grpc", "resource spans": 1, "spans": 76}
查看中心 Collector 日志,确认数据已到达:
kubectl logs -f deploy/central-collector-collector -n observability
预期输出示例:
Everything is ready. Begin running and processing data.
TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 76}
十、关键变更速查表
| 变更项 | 旧方式(已弃用/移除) | 新方式(2026 最新) |
|---|---|---|
| OTLP 导出器键名 | otlp / otlphttp |
otlp_grpc / otlp_http |
| Jaeger 导出器 | jaeger(v0.86.0 移除) |
otlp_grpc/jaeger 指向端口 4317 |
| 调试导出器 | logging + loglevel |
debug + verbosity |
limit_mib 语义 |
模糊(曾被理解为软限制) | 硬性堆上限(hard heap target) |
| 软限制计算 | 不明确 | limit_mib - spike_limit_mib |
| Java Agent | 2.x 系列 | 3.0(2026 年 10 月发布) |
| Operator 版本 | 旧版 | v0.158.0 |
十一、总结
本文演示了基于 2026 年最新标准,使用 OpenTelemetry Operator 在 Kubernetes 上实现零代码追踪的完整流程:
- 使用 Helm 部署 OpenTelemetry Operator(v0.158.0)
- 创建中心 Collector(Gateway 模式),配置
memory_limiter+batch处理器和otlp_grpc导出器 - 以 Sidecar 模式部署 Agent Collector,将数据转发到中心 Collector
- 创建
Instrumentation资源,通过注解实现自动检测注入 - 部署业务应用,追踪数据自动生成并发送到后端
核心要点:使用新键名
otlp_grpc/otlp_http;用otlp_grpc/jaeger替代已移除的jaeger导出器;正确理解memory_limiter的硬限制与软限制语义;关注 Java Agent 3.0 的发布与迁移。

浙公网安备 33010602011771号