4. Jaeger 架构与部署:组件、模式与 Kubernetes 实践

Jaeger 作为 CNCF 毕业的分布式追踪系统,其架构设计遵循“采集-存储-查询”的经典可观测性链路。理解其组件职责与部署模式,是构建生产级 SLO 台账诊断能力的基础。本章将拆解 Jaeger 核心组件、对比部署模式,并给出 Kubernetes 环境下的生产级部署方案。

4.1 Jaeger 核心组件与职责

Jaeger 架构由四个主要组件构成,它们协同完成 Trace 数据的采集、处理、存储与可视化。下表总结了各组件的核心功能与部署位置:

组件 角色 部署位置 关键职责
Agent 边车代理 与业务容器同 Pod 接收应用 Span 数据,批量压缩后转发至 Collector;支持 UDP/gRPC 协议
Collector 数据处理器 独立 Deployment 验证、清洗、索引 Span;写入后端存储(Cassandra/Elasticsearch/Badger)
Query 查询服务 独立 Deployment 提供 gRPC/HTTP API 检索 Trace;聚合服务依赖关系与 SLO 指标
UI 可视化面板 与 Query 同 Pod 或独立 Trace 搜索、火焰图展示、服务拓扑图、SLO 台账看板
架构要点: Agent 是“无状态轻量代理”,只做数据转发,不参与存储;Collector 是“有状态处理节点”,负责数据持久化;Query 与 UI 通常部署在一起,对外暴露 16686 端口。

下图展示了 Jaeger 组件间的数据流与依赖关系:

Jaeger 组件架构与数据流 Jaeger 组件架构与数据流 微服务 A 微服务 B Agent (Sidecar) Agent (Sidecar) Collector (验证/索引/写入) 存储后端 Query + UI (16686 端口) 数据流方向 Span → Agent → Collector → 存储

4.2 Jaeger 部署模式对比

Jaeger 提供两种官方部署模式:All-in-One 用于开发测试,Production 用于生产环境。选择错误模式会导致性能瓶颈或资源浪费。

维度 All-in-One Production
组件整合 Agent + Collector + Query + UI 合并为单进程 各组件独立部署,可水平扩展
存储 内嵌 Badger(本地文件) 外部存储:Cassandra / Elasticsearch / OpenSearch
高可用 单点,无 HA Collector/Query 多副本 + 负载均衡
数据持久化 容器重启数据丢失 外部存储保证持久化
适用场景 本地开发、功能验证、Demo 生产环境、SLO 台账、长期存储
资源占用 低(单 Pod 即可) 中高(按组件独立分配)
生产避坑: 切勿在生产环境使用 All-in-One 模式!其内嵌 Badger 存储不支持集群扩展,且单进程故障会导致全链路追踪中断。生产环境必须使用 Production 模式 + 外部存储。

4.3 Kubernetes 环境下的 Jaeger 生产部署

在 Kubernetes 中部署 Jaeger Production 模式,推荐使用 Jaeger Operator 或 Helm Chart。以下给出基于 Helm 的部署步骤与关键配置。

4.3.1 部署前提

  • Kubernetes 集群版本 ≥ 1.19
  • 已部署存储后端(推荐 Elasticsearch 7.x+ 或 OpenSearch)
  • 已安装 Helm 3

4.3.2 Helm 部署命令

# 添加 Jaeger Helm 仓库
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update

# 创建命名空间
kubectl create namespace observability

# 部署 Jaeger Production 模式(使用 Elasticsearch 存储)
helm upgrade --install jaeger jaegertracing/jaeger \
  --namespace observability \
  --set provisionDataStore.cassandra=false \
  --set storage.type=elasticsearch \
  --set storage.elasticsearch.host=elasticsearch-master.elastic.svc.cluster.local \
  --set storage.elasticsearch.port=9200 \
  --set collector.replicas=2 \
  --set query.replicas=2 \
  --set agent.strategy=DaemonSet

4.3.3 关键配置说明

参数 推荐值 说明
storage.type elasticsearch 生产环境首选 ES/OpenSearch;Cassandra 已逐步弃用
collector.replicas 2~3 根据 Trace 吞吐量调整;建议与 ES 节点数匹配
agent.strategy DaemonSet 每个 Node 部署一个 Agent,减少 Sidecar 资源开销
query.replicas 2 保证 UI 查询高可用;可配置 HPA
storage.elasticsearch.createIndexTemplates true 自动创建 Jaeger 索引模板,优化 mapping

4.3.4 部署后验证

# 检查 Pod 状态
kubectl get pods -n observability -l app.kubernetes.io/instance=jaeger

# 预期输出(示例)
# NAME                                  READY   STATUS    RESTARTS   AGE
# jaeger-collector-7d8f9c6b4c-2xq9k    1/1     Running   0          5m
# jaeger-collector-7d8f9c6b4c-j4m5n    1/1     Running   0          5m
# jaeger-query-6b7f8c9d4f-8p2q3        1/1     Running   0          5m
# jaeger-query-6b7f8c9d4f-9r4s5        1/1     Running   0          5m
# jaeger-agent-2x9k4                    1/1     Running   0          5m
# jaeger-agent-j4m5n                    1/1     Running   0          5m

# 端口转发访问 UI
kubectl port-forward -n observability svc/jaeger-query 16686:16686

# 浏览器打开 http://localhost:16686 验证 UI 可访问
SRE 建议: 在 Production 模式下,建议为 Collector 和 Query 配置 PodDisruptionBudget(PDB),确保滚动更新期间至少保留一个可用副本。同时为 Elasticsearch 存储设置 ILM(索引生命周期管理),按 SLO 台账保留周期自动清理过期 Trace 数据。

4.4 部署模式选择决策树

根据团队规模与业务阶段,可参考以下决策逻辑选择部署模式:

Jaeger 部署模式选择决策树 Jaeger 部署模式选择决策树 是否生产环境? All-in-One 模式 开发/测试/Demo Production 模式 生产环境/SLO台账 存储后端选择 Elasticsearch / OpenSearch

4.5 本章小结

  • Agent 作为 Sidecar 或 DaemonSet 部署,负责 Span 采集与转发;Collector 负责数据清洗与写入;Query + UI 提供检索与可视化。
  • All-in-One 仅适用于开发测试;Production 模式必须使用外部存储,并配置多副本保证高可用。
  • Kubernetes 环境推荐使用 Helm Chart 或 Jaeger Operator 部署,关键参数包括 storage.type、collector.replicas、agent.strategy。
  • 生产部署后需验证 Pod 状态、UI 可访问性,并配置 PDB 与 ILM 策略保障稳定性。