4. Jaeger 部署模式:All-in-one、生产级 Kubernetes 部署、存储后端选型

Jaeger 的部署模式直接决定了其可用性、扩展性与资源消耗。本章将系统讲解三种主流部署模式:面向开发测试的 All-in-one、面向生产环境的 Kubernetes 原生部署,以及两种核心存储后端 Elasticsearch 与 Cassandra 的选型对比。

4.1 部署模式总览

下表从适用场景、组件完整性、持久化能力与资源开销四个维度,对三种模式进行横向对比:

部署模式 适用场景 组件完整性 持久化存储 资源开销
All-in-one 本地开发、功能验证、Demo Agent + Collector + Query + UI 单进程 内存(默认)或 Badger(本地文件) 低(单节点 1-2 GB 内存)
Kubernetes 生产部署 生产环境、微服务集群、高可用 Agent(DaemonSet)+ Collector(Deployment)+ Query(Deployment)+ 存储后端 外部存储(ES / Cassandra) 中高(按流量水平扩展)
Docker Compose 简易集群 小团队、预生产环境 组件分离但单实例 外部存储(ES / Cassandra) 中(多容器共享主机)
建议: 生产环境务必使用 Kubernetes 部署模式,并搭配外部持久化存储。All-in-one 模式仅用于快速上手,重启后数据丢失,不适合任何需要追溯历史链路的场景。

4.2 All-in-one 模式详解

All-in-one 将 Jaeger 的所有核心组件(Agent、Collector、Query、UI)打包在同一个二进制文件中,使用内存或本地 Badger 作为存储后端。启动命令极为简洁:

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.60

启动后,访问 http://localhost:16686 即可打开 Jaeger UI。该模式适合以下场景:

  • 本地开发环境快速验证链路采集是否正常
  • 集成测试中临时启用链路追踪
  • 教学演示与概念验证(PoC)
注意: All-in-one 默认使用内存存储,重启后所有 trace 数据丢失。如需保留数据,可挂载本地卷并启用 Badger 存储(--badger.directory-key=/data --badger.directory-value=/data),但仍不具备高可用能力。

4.3 生产级 Kubernetes 部署

生产环境推荐使用 Jaeger Operator 或 Helm Chart 在 Kubernetes 上部署。Operator 模式通过 CRD(Custom Resource Definition)管理 Jaeger 实例的生命周期,支持自动扩缩容、滚动升级与健康检查。

4.3.1 架构组件与部署拓扑

下图展示了生产级 Kubernetes 部署的核心组件及其交互关系:

Jaeger 生产级 Kubernetes 部署架构 Jaeger 生产级 Kubernetes 部署架构 应用 Pod 业务容器(App) Jaeger Agent(Sidecar) 端口:6831/udp, 5778 gRPC / Thrift Collector 集群(Deployment) Collector 实例 1 Collector 实例 2 端口:14250, 14268 写入 存储后端 Elasticsearch Cassandra Query 服务(Deployment) 端口:16686(UI) 端口:16687(gRPC) 读取 HTTP 用户 / 运维人员 说明: Agent 以 DaemonSet 或 Sidecar 模式部署; Collector 与 Query 通过 HPA 自动扩缩容。

4.3.2 使用 Helm Chart 快速部署

以下命令使用 Jaeger Helm Chart 在 Kubernetes 集群中部署生产级实例:

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

# 部署 Jaeger(使用 Elasticsearch 作为存储后端)
helm upgrade --install jaeger jaegertracing/jaeger \
  --namespace observability \
  --create-namespace \
  --set provisionDataStore.cassandra=false \
  --set provisionDataStore.elasticsearch=true \
  --set storage.elasticsearch.host=elasticsearch-master.observability.svc.cluster.local \
  --set storage.elasticsearch.port=9200 \
  --set collector.replicas=3 \
  --set query.replicas=2
关键参数说明:
  • provisionDataStore:控制是否自动部署存储后端。生产环境通常使用外部已有 ES 或 Cassandra 集群。
  • collector.replicas:根据 trace 吞吐量设置副本数,建议至少 2 个以保证高可用。
  • query.replicas:UI 查询服务副本数,建议与 Collector 持平或略少。

4.4 存储后端选型:Elasticsearch vs Cassandra

存储后端是 Jaeger 生产部署中最关键的决策点。Elasticsearch 与 Cassandra 在数据模型、查询能力、运维复杂度上存在显著差异。

4.4.1 核心特性对比

对比维度 Elasticsearch Cassandra
数据模型 文档型(JSON),天然支持嵌套与全文检索 宽列存储,基于分区键与排序键
查询能力 丰富:全文搜索、聚合、范围查询、高亮 有限:仅支持按分区键 + 排序键查询,不支持 Join
写入性能 中等,受索引刷新间隔影响 极高,线性扩展,适合海量写入
运维复杂度 中高:需管理分片、副本、索引生命周期(ILM) 中:需管理节点拓扑、一致性级别、压缩策略
存储效率 较低,倒排索引占用额外空间 较高,LSM-Tree 压缩比好
Jaeger 集成成熟度 官方首选,功能最全(支持服务依赖图、Span 对比) 成熟,但部分高级功能(如 TraceQL)支持较弱
典型场景 需要复杂查询、日志与链路联动、中小规模集群 超大规模写入、多数据中心、写入密集型场景

4.4.2 选型决策树

以下决策流程可帮助团队快速确定存储后端:

Jaeger 存储后端选型决策树 Jaeger 存储后端选型决策树 日均 Trace 量? < 1 亿 / 天 ≥ 1 亿 / 天 需要复杂查询? (全文检索/聚合) 写入优先? (低延迟/高吞吐) Elasticsearch Cassandra Cassandra 提示: 日均 Trace 量超过 1 亿时, Cassandra 的写入优势更为明显。

4.4.3 存储后端配置示例

Elasticsearch 配置(values.yaml 片段):

storage:
  type: elasticsearch
  elasticsearch:
    host: elasticsearch-master.observability.svc.cluster.local
    port: 9200
    user: "elastic"
    password: "changeme"
    indexPrefix: "jaeger"
    indexDateSeparator: "-"
    createIndexTemplates: true
    maxSpanAge: 168h  # 保留 7 天
    numShards: 5
    numReplicas: 1
    es.version: 7

Cassandra 配置(values.yaml 片段):

storage:
  type: cassandra
  cassandra:
    hosts:
      - cassandra-0.cassandra.observability.svc.cluster.local
      - cassandra-1.cassandra.observability.svc.cluster.local
      - cassandra-2.cassandra.observability.svc.cluster.local
    port: 9042
    keyspace: jaeger_v1_dc1
    consistency: QUORUM
    connectionsPerHost: 4
    maxRetryAttempts: 3
    timeout: 10s
    replicationFactor: 3
生产注意事项:
  • Elasticsearch 需配置索引生命周期管理(ILM),避免索引无限增长导致磁盘满。
  • Cassandra 需提前创建 keyspace 并设置合适的复制因子(RF),RF=3 是生产最低要求。
  • 两种存储后端均建议使用独立集群,避免与业务系统争抢 I/O 资源。

4.5 本章小结

  • All-in-one 模式适合开发测试,启动快但无持久化保障。
  • Kubernetes 生产部署 通过 Operator/Helm 实现组件解耦与水平扩展,是生产环境的唯一推荐方案。
  • Elasticsearch 适合中小规模、需要复杂查询的场景;Cassandra 适合超大规模写入、写入密集型场景。
  • 存储后端选型应综合考虑 Trace 吞吐量、查询需求、运维能力与成本预算。