部署
另请参阅
Jaeger 后端主要组件作为 Docker 镜像发布在 Docker Hub 和 Quay 上
上面列出的镜像是主要发布版本。大多数组件还有额外的镜像发布:
${component}-debug
镜像包含 Delve 调试器${component}-snapshot
镜像从主分支的最新提交发布,允许测试未发布版本${component}-debug-snapshot
快照镜像,包含 Delve 调试器
存在用于运行 Jaeger 的编排模板:
- Kubernetes: github.com/jaegertracing/jaeger-kubernetes ,
- OpenShift: github.com/jaegertracing/jaeger-openshift 。
配置选项
Jaeger 二进制文件可以通过多种方式配置(优先级递减顺序):
- 命令行参数,
- 环境变量,
- JSON、TOML、YAML、HCL 或 Java 属性格式的配置文件。
要查看完整的选项列表,请使用 help
命令运行二进制文件或参阅 CLI 标志页面以获取更多信息。特定于某个存储后端的选项仅在选择了存储类型时列出。例如,要在使用 Cassandra 存储的 Collector 中查看所有可用选项:
$ docker run --rm \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-collector:1.71.0 \
help
为了通过环境变量提供配置参数,请找到相应的命令行选项并将其名称转换为 UPPER_SNAKE_CASE 格式,例如:
命令行选项 | 环境变量 |
---|---|
--cassandra.connections-per-host | CASSANDRA_CONNECTIONS_PER_HOST |
--metrics-backend | METRICS_BACKEND |
一体化部署
Jaeger all-in-one 是一种特殊的发行版,它将 Jaeger 的三个组件(collector 和 query service/UI)组合在一个二进制文件或容器镜像中。它适用于单节点部署,在这些部署中,跟踪量足以由单个实例处理。默认情况下,all-in-one 使用 memory
存储启动,这意味着它在重启后会丢失所有数据。所有其他span 存储后端也可以与 all-in-one 一起使用,但 memory
和 badger
是 all-in-one 独有的,因为它们无法在实例之间共享。
All-in-one 监听与其所包含组件(如下所述)相同的端口,管理端口除外。
端口 | 协议 | 功能 |
---|---|---|
14269 | HTTP | 管理端口:/ 提供健康检查,/metrics 提供指标 |
## make sure to expose only the ports you use in your deployment scenario!
docker run -d --name jaeger \
-e COLLECTOR_OTLP_ENABLED=true \
-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 4317:4317 \
-p 4318:4318 \
-p 9411:9411 \
jaegertracing/all-in-one:1.71.0
您可以导航到 https://:16686
以访问 Jaeger UI。
Collector
jaeger-collector 是无状态的,因此可以并行运行许多 jaeger-collector 实例。jaeger-collector 几乎不需要配置,除了存储位置,例如 --cassandra.keyspace
和 --cassandra.servers
选项,或者 Elasticsearch 集群的位置(通过 --es.server-urls
),具体取决于指定的存储。有关所有命令行选项,请参阅 CLI 标志。
在默认设置下,jaeger-collector 暴露以下端口:
端口 | 协议 | 端点 | 功能 |
---|---|---|---|
4317 | gRPC | 不适用 | 接受 OpenTelemetry OTLP 格式 (Protobuf)的跟踪数据。 |
4318 | HTTP | /v1/traces | 接受 OpenTelemetry OTLP 格式 (Protobuf 和 JSON)的跟踪数据。 |
14268 | HTTP | /api/sampling | 提供采样策略(请参阅远程采样)。 |
/api/traces | 接受 jaeger.thrift 格式的 span,使用 binary thrift 协议(POST )。 | ||
14269 | HTTP | / | 管理端口:健康检查(GET )。 |
/metrics | Prometheus 风格的指标(GET )。 | ||
9411 | HTTP | /api/v1/spans 和 /api/v2/spans | 接受 Thrift、JSON 和 Proto 格式的 Zipkin span(默认禁用)。 |
14250 | gRPC | 不适用 | 接受 model.proto Protobuf 格式的 span。 |
Ingester
jaeger-ingester 是一项服务,它从 Kafka 主题读取 span 数据并将其写入另一个存储后端(Elasticsearch 或 Cassandra)。
端口 | 协议 | 功能 |
---|---|---|
14270 | HTTP | 管理端口:/ 提供健康检查,/metrics 提供指标 |
要查看所有暴露的配置选项,请运行以下命令:
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-ingester:1.71.0
--help
查询服务与 UI
jaeger-query 提供 API 端点和基于 React/Javascript 的 UI。该服务是无状态的,通常运行在负载均衡器(例如 NGINX )后面。
在默认设置下,jaeger-query 服务暴露以下端口:
端口 | 协议 | 功能 |
---|---|---|
16685 | gRPC | Protobuf/gRPC QueryService |
16686 | HTTP | /api/* 端点和 / 处的 Jaeger UI |
16687 | HTTP | 管理端口:/ 提供健康检查,/metrics 提供指标 |
最小部署示例(Elasticsearch 后端)
docker run -d --rm \
-p 16685:16685 \
-p 16686:16686 \
-p 16687:16687 \
-e SPAN_STORAGE_TYPE=elasticsearch \
-e ES_SERVER_URLS=http://<ES_SERVER_IP>:<ES_SERVER_PORT> \
jaegertracing/jaeger-query:1.71.0
时钟偏差调整
Jaeger 后端聚合来自通常在不同主机上运行的应用程序的跟踪数据。主机上的硬件时钟经常发生相对漂移,称为时钟偏差效应 。时钟偏差会使分析跟踪变得困难,例如,当服务器 span 可能看起来比客户端 span 更早开始时,这本不应该发生。jaeger-query 服务实现了一种时钟偏差调整算法(代码 ),利用 span 之间的因果关系知识来纠正时钟漂移。所有调整后的 span 都会在 UI 中显示警告,提供应用于其时间戳的精确时钟偏差增量。
有时这些调整本身会使跟踪难以理解。例如,当在父 span 的范围内重新定位服务器 span 时,Jaeger 不知道请求和响应延迟之间的确切关系,因此它假设它们相等并将子 span 放置在父 span 的中间(请参阅 issue #961 )。
jaeger-query 服务支持一个配置标志 --query.max-clock-skew-adjustment
,它控制允许的时钟偏差调整量。将此参数设置为零(0s
)将完全禁用时钟偏差调整。此设置适用于从给定查询服务检索到的所有跟踪。目前有一个开放的 issue #197 ,旨在支持在 UI 中直接切换调整。
UI 基本路径
所有 jaeger-query HTTP 路由的基本路径可以设置为非根值,例如 /jaeger
将使所有 UI URL 以 /jaeger
开头。这在反向代理后运行 jaeger-query 时非常有用。
基本路径可以通过 --query.base-path
命令行参数或 QUERY_BASE_PATH
环境变量进行配置。
UI 自定义和嵌入
请参阅专用的前端/UI 页面。
远程存储(组件)
jaeger-remote-storage 实现了 远程存储 gRPC API ,并将其代理到常规 Jaeger 后端之一。当我们希望运行完整的 Jaeger 组件部署(例如,分离的 collector 和 query 服务),但使用单节点存储后端(如内存存储或 Badger)时,这会很有用。如果没有远程存储,单节点后端只能与 all-in-one 一起使用,因为它们无法在多个进程之间共享。
在默认设置下,服务监听以下端口:
端口 | 协议 | 功能 |
---|---|---|
17271 | gRPC | 远程存储 API |
17270 | HTTP | 管理端口:/ 提供健康检查,/metrics 提供指标 |
Span 存储后端
Jaeger 需要持久存储后端。Cassandra 和 Elasticsearch/OpenSearch 是主要支持的分布式存储后端。此处讨论 了其他后端。
存储类型可以通过 SPAN_STORAGE_TYPE
环境变量传递。有效值为:cassandra
、elasticsearch
、kafka
(仅作为缓冲区)、badger
和 memory
。
从 1.6.0 版本开始,可以通过向 SPAN_STORAGE_TYPE
环境变量提供逗号分隔的有效类型列表来同时使用多种存储类型。需要注意的是,所有列出的存储类型都用于写入,但列表中只有第一个类型将用于读取和归档。
对于大规模生产部署,Jaeger 团队推荐使用 OpenSearch 后端而非 Cassandra。
内存
内存存储不适用于生产工作负载。它旨在作为快速入门的简单解决方案,并且数据在进程退出后会丢失。
默认情况下,内存中存储的跟踪量没有限制,但可以通过 --memory.max-traces
传递整数值来设置限制。
Badger - 本地存储
- 自 Jaeger v1.9 起
Badger 是一种嵌入式本地存储,仅适用于 all-in-one 分发版。默认情况下,它作为临时存储使用临时文件系统。这可以通过使用 --badger.ephemeral=false
选项来覆盖。
docker run \
-e SPAN_STORAGE_TYPE=badger \
-e BADGER_EPHEMERAL=false \
-e BADGER_DIRECTORY_VALUE=/badger/data \
-e BADGER_DIRECTORY_KEY=/badger/key \
-v <storage_dir_on_host>:/badger \
-p 16686:16686 \
jaegertracing/all-in-one:1.71.0
Cassandra
- 支持的版本:4.x, 5.x
部署 Cassandra 本身超出我们的文档范围。一个好的文档来源是 Apache Cassandra 文档 。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
-e CASSANDRA_SERVERS=<...> \
jaegertracing/jaeger-collector:1.71.0
注意:CASSANDRA_SERVERS
中允许使用空格字符。例如:服务器可以设置为 CASSANDRA_SERVERS=“1.2.3.4, 5.6.7.8”
以提高可读性。
所有选项
要查看完整的配置选项列表,您可以运行以下命令:
docker run \
-e SPAN_STORAGE_TYPE=cassandra \
jaegertracing/jaeger-collector:1.71.0 \
--help
模式脚本
提供了一个脚本,用于使用 Cassandra 的交互式 shell cqlsh
MODE=test sh ./internal/storage/v1/cassandra/schema/create.sh | cqlsh
或者使用已发布的 Docker 镜像(请确保提供正确的 IP 地址):
docker run \
-e CQLSH_HOST={server IP address} \
jaegertracing/jaeger-cassandra-schema:1.71.0
对于生产部署,请将 MODE=prod DATACENTER={datacenter}
参数传递给脚本,其中 {datacenter}
是 Cassandra 配置/网络拓扑中使用的名称。
该脚本还允许覆盖 TTL、键空间名称、复制因子等。不带参数运行脚本可查看所有可识别参数的完整列表。
注意:有关 Cassandra 模式管理的更多详细信息,请参阅 README 。
TLS 支持
只要您正确配置了 Cassandra 集群,Jaeger 就支持 TLS 客户端到节点连接。例如,通过 cqlsh
验证后,您可以这样配置 collector 和 query:
docker run \
-e CASSANDRA_SERVERS=<...> \
-e CASSANDRA_TLS=true \
-e CASSANDRA_TLS_SERVER_NAME="CN-in-certificate" \
-e CASSANDRA_TLS_KEY=<path to client key file> \
-e CASSANDRA_TLS_CERT=<path to client cert file> \
-e CASSANDRA_TLS_CA=<path to your CA cert file> \
jaegertracing/jaeger-collector:1.71.0
模式工具也支持 TLS。您需要创建一个自定义的 cqlshrc 文件,如下所示:
# Creating schema in a cassandra cluster requiring client TLS certificates.
#
# Create a volume for the schema docker container containing four files:
# cqlshrc: this file
# ca-cert: the cert authority for your keys
# client-key: the keyfile for your client
# client-cert: the cert file matching client-key
#
# if there is any sort of DNS mismatch and you want to ignore server validation
# issues, then uncomment validate = false below.
#
# When running the container, map this volume to /root/.cassandra and set the
# environment variable CQLSH_SSL=--ssl
[ssl]
certfile = ~/.cassandra/ca-cert
userkey = ~/.cassandra/client-key
usercert = ~/.cassandra/client-cert
# validate = false
兼容的后端
- ScyllaDB 可以作为 Cassandra 的直接替代品使用 ,因为它使用相同的数据模型和查询语言。
Elasticsearch
- 自 Jaeger v0.6.0 起支持
- 支持的 ES 版本:7.x, 8.x (自 Jaeger v1.52.0 起)
Elasticsearch 版本会自动从 root/ping 端点获取。根据此版本,Jaeger 使用兼容的索引映射和 Elasticsearch REST API。可以通过 --es.version=
标志显式提供版本。
Elasticsearch 除了安装和运行 Elasticsearch 之外,不需要其他初始化。一旦它运行起来,将正确的配置值传递给 jaeger-collector 和 jaeger-query。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=elasticsearch \
-e ES_SERVER_URLS=<...> \
jaegertracing/jaeger-collector:1.71.0
所有选项
要查看完整的配置选项列表,您可以运行以下命令:
docker run \
-e SPAN_STORAGE_TYPE=elasticsearch \
jaegertracing/jaeger-collector:1.71.0 \
--help
Elasticsearch 索引的分片和副本
分片和副本是需要特别注意的配置值,因为它们在索引创建时决定。本文 提供了更多关于如何选择分片数量以进行优化的信息。
Elasticsearch 滚动更新
Elasticsearch 滚动更新 是一种索引管理策略,可优化分配给索引的资源使用。例如,不包含任何数据的索引仍然会分配分片,反之,单个索引可能包含比其他索引多得多的数据。Jaeger 默认将数据存储在每日索引中,这可能无法最佳地利用资源。可以通过 --es.use-aliases=true
启用滚动更新功能。
滚动更新允许您根据以下一个或多个标准配置何时滚动更新到新索引:
max_age
- 索引的最大年龄。它使用时间单位 :d
,h
,m
。max_docs
- 索引中的最大文档数。max_size
- 主分片的最大估计大小(自 Elasticsearch 6.x 起)。它使用字节大小单位tb
,gb
,mb
。
滚动更新索引管理策略比使用默认的每日索引更复杂,它需要一个初始化作业来准备存储,以及两个 cron 作业来管理索引。
要了解更多关于 Jaeger 中滚动更新索引管理的信息,请参阅本文 。
对于自动化滚动更新,请参阅Elasticsearch ILM 支持。
初始化
以下命令通过创建索引别名、索引和索引模板来为 Elasticsearch 滚动更新部署做准备:
docker run -it --rm --net=host jaegertracing/jaeger-es-rollover:latest init https://:9200 # <1>
如果您需要初始化存档存储,请添加 -e ARCHIVE=true
。
初始化后,可以使用 --es.use-aliases=true
部署 Jaeger。
滚动更新到新索引
下一步是定期执行滚动更新 API,该 API 根据提供的条件将写入别名滚动更新到新索引。此命令还会将新索引添加到读取别名中,以使新数据可供搜索。
docker run -it --rm --net=host -e CONDITIONS='{"max_age": "2d"}' jaegertracing/jaeger-es-rollover:latest rollover https://:9200 # <1>
<1> 如果当前写入索引的年龄超过 2 天,该命令会将别名滚动更新到新索引。有关更多条件,请参阅Elasticsearch 文档 。
下一步是从读取别名中移除旧索引。这意味着旧数据将无法用于搜索。这模仿了默认的每日索引部署中使用的 --es.max-span-age
标志的行为。此步骤可以是可选的,旧索引也可以在下一步中由索引清理器直接移除。
docker run -it --rm --net=host -e UNIT=days -e UNIT_COUNT=7 jaegertracing/jaeger-es-rollover:latest lookback https://:9200 # <1>
<1> 从读取别名中移除超过 7 天的索引。
移除旧数据
历史数据可以使用 jaeger-es-index-cleaner
移除,该工具也用于每日索引。
docker run -it --rm --net=host -e ROLLOVER=true jaegertracing/jaeger-es-index-cleaner:latest 14 https://:9200 # <1>
<1> 移除超过 14 天的索引。
Elasticsearch ILM 支持
在 v1.22.0 版本 中添加的实验性功能。
支持的 Elasticsearch 版本:7.x
例如
- 根据大小(字节或文档数量)或年龄滚动更新到新索引,并归档以前的索引
- 删除过时索引以执行数据保留标准
启用 ILM 支持
在 Elasticsearch 中创建一个名为
jaeger-ilm-policy
的 ILM 策略。例如,以下策略将在“活动”索引超过 1 分钟时进行滚动更新,并删除超过 2 分钟的索引。
curl -X PUT https://:9200/_ilm/policy/jaeger-ilm-policy \ -H 'Content-Type: application/json; charset=utf-8' \ --data-binary @- << EOF { "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_age": "1m" }, "set_priority": { "priority": 100 } } }, "delete": { "min_age": "2m", "actions": { "delete": {} } } } } } EOF
使用
ES_USE_ILM=true
运行 Elasticsearch 初始化程序:docker run -it --rm --net=host -e ES_USE_ILM=true jaegertracing/jaeger-es-rollover:latest init https://:9200 # <1>
<1> 如果您需要初始化存档存储,请添加
-e ARCHIVE=true
。在启用 ILM 支持进行初始化时,请确保事先在 Elasticsearch 中创建了一个名为
jaeger-ilm-policy
的 ILM 策略(请参阅上一步),否则将显示以下错误消息:“ILM 策略
jaeger-ilm-policy
在 Elasticsearch 中不存在。请创建它并重新运行初始化”初始化后,使用
--es.use-ilm=true
和--es.use-aliases=true
部署 Jaeger。
升级 Elasticsearch 版本
Elasticsearch 定义了线性和索引兼容性版本。索引兼容性定义了节点可以读取数据的最低版本。例如,Elasticsearch 8 可以读取由 Elasticsearch 7 创建的索引,但无法读取由 Elasticsearch 6 创建的索引,即使它们使用相同的索引映射。因此,从 Elasticsearch 7 升级到 8 不需要任何数据迁移。然而,从 Elasticsearch 6 升级到 8 必须通过 Elasticsearch 7 进行,并等待 ES 6.x 创建的索引被移除或明确重新索引。
有关线性和索引兼容性版本,请参阅 Elasticsearch 文档 。通常,此信息可以从 root/ping REST 端点获取。
重新索引
当从 Elasticsearch 6 升级到 8(通过 Elasticsearch 7)时,可以使用手动重新索引,而无需等待 Elasticsearch 6 创建的索引被移除。
将所有 span 索引重新索引到带有后缀
-1
的新索引curl -ivX POST -H "Content-Type: application/json" https://:9200/_reindex -d @reindex.json { "source": { "index": "jaeger-span-*" }, "dest": { "index": "jaeger-span" }, "script": { "lang": "painless", "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length())) + '-1'" } }
删除具有旧映射的索引
curl -ivX DELETE -H "Content-Type: application/json" https://:9200/jaeger-span-\*,-\*-1
创建不带
-1
后缀的索引curl -ivX POST -H "Content-Type: application/json" https://:9200/_reindex -d @reindex.json { "source": { "index": "jaeger-span-*" }, "dest": { "index": "jaeger-span" }, "script": { "lang": "painless", "source": "ctx._index = 'jaeger-span-' + (ctx._index.substring('jaeger-span-'.length(), ctx._index.length() - 2))" } }
移除带后缀的索引
curl -ivX DELETE -H "Content-Type: application/json" https://:9200/jaeger-span-\*-1
对其他 Jaeger 索引类似地运行这些命令。
可能存在更有效的迁移过程。请与社区分享任何发现。
Kafka
- 自 Jaeger 1.6.0 起支持
- 支持的 Kafka 版本:0.9+
Kafka 可以用作 collector 和实际存储之间的中间缓冲区。jaeger-collector 配置为 SPAN_STORAGE_TYPE=kafka
,使其将所有接收到的 span 写入 Kafka 主题。jaeger-ingester 用于从 Kafka 读取并将 span 存储到另一个存储后端(Elasticsearch 或 Cassandra)。
写入 Kafka 对于构建后处理数据管道特别有用。
配置
最小配置
docker run \
-e SPAN_STORAGE_TYPE=kafka \
-e KAFKA_PRODUCER_BROKERS=<...> \
-e KAFKA_TOPIC=<...> \
jaegertracing/jaeger-collector:1.71.0
所有选项
要查看完整的配置选项列表,您可以运行以下命令:
docker run \
-e SPAN_STORAGE_TYPE=kafka \
jaegertracing/jaeger-collector:1.71.0 \
--help
主题与分区
除非您的 Kafka 集群配置为自动创建主题,否则您需要提前创建它。您可以参考Kafka 快速入门文档 了解如何操作。
您可以在官方文档 中找到有关主题和分区的更多信息。本文 提供了更多关于如何选择分区数量的详细信息。
远程存储
Jaeger 支持基于 gRPC 的 远程存储 API ,允许使用项目不直接支持的自定义存储后端扩展 Jaeger 生态系统。这些存储后端可以作为远程 gRPC 服务器部署(自 Jaeger v1.30 起)。作为 sidecar 插件的旧部署模式将从 v1.58 版本开始不再支持。
要将远程存储用作 Jaeger 存储后端,请使用 grpc
作为存储类型并指定远程 gRPC 服务器地址。有关更多信息,请参阅 internal/storage/v1/grpc 。
示例
docker run \
-e SPAN_STORAGE_TYPE=grpc \
-e GRPC_STORAGE_SERVER=<...> \
jaegertracing/all-in-one:1.71.0
已知远程存储后端
指标存储后端
Jaeger Query 能够从存储后端查询聚合的 R.E.D 指标,并在监控选项卡上进行可视化。需要强调的是,配置的指标存储类型仅用于读取,因此仅适用于 Jaeger Query 组件(以及包含 Jaeger Query 的 All In One)。
存储类型可以通过 METRICS_STORAGE_TYPE
环境变量传递。有效值为:prometheus
。
Prometheus
Jaeger Query 支持任何 PromQL 兼容的后端。Julius Volz 在以下文章中整理了这些后端的列表:https://promlabs.com/blog/2020/11/26/an-update-on-promql-compatibility-across-vendors
配置
最小配置
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
jaegertracing/jaeger-query:1.71.0
所有选项
要查看完整的配置选项列表,您可以运行以下命令:
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
jaegertracing/jaeger-query:1.71.0 \
--help
TLS 支持
只要您正确配置了 Prometheus 服务器 ,Jaeger 就支持 TLS 客户端到 Prometheus 服务器的连接。您可以这样配置 jaeger-query:
docker run \
-e METRICS_STORAGE_TYPE=prometheus \
-e PROMETHEUS_SERVER_URL=<...> \
-e PROMETHEUS_TLS_ENABLED=true \
-e PROMETHEUS_TLS_CA=<path to your CA cert file> \
jaegertracing/jaeger-query:1.71.0
服务依赖聚合作业
生产部署需要一个外部进程来聚合数据并创建服务之间的依赖关系链接。spark-dependencies 项目是一个 Spark 作业,它派生依赖关系链接并直接将其写入存储。