从 Alauda Container Platform Tracing 迁移
本文档介绍如何将现有的、基于旧版 Alauda Container Platform (ACP) Tracing 栈的 tracing 部署——即 Alauda Build of Jaeger(Jaeger 1.60.0)加上 Alauda Build of OpenTelemetry——迁移到基于 Jaeger v2(2.16.0)加上 Alauda Build of OpenTelemetry v2 的 Alauda Distributed Tracing。
迁移分为两个阶段:
-
OpenTelemetry 栈迁移。 将旧版
Alauda Build of OpenTelemetryOperator 和 Collector 替换为Alauda Build of OpenTelemetry v2。应用 Pod 会重新部署,以注入 v2 Java 智能体。完成此阶段后,telemetry 由 v2 Collector 收集,但仍写入旧版 Jaeger 后端。此阶段请参照 从 Alauda Build of OpenTelemetry 迁移到 Alauda Build of OpenTelemetry v2。 -
Jaeger 后端迁移。 在旧版 Jaeger 旁边部署一个新的
Jaeger v2实例,将 v2 Collector 的 trace exporter 切换到新后端,并在旧版保留期结束后卸载旧版 Jaeger。
切换完成后,新的 trace 数据会流入新的 Jaeger v2 后端,而旧版 Jaeger 仍会继续提供此前已存储的 traces。待旧版保留期结束(默认 7 天)后,旧版栈将被卸载。
目录
概述ACP Tracing 与 Alauda Distributed Tracing 之间的变化迁移中断窗口迁移流程概览trace 数据连续性策略前提条件迁移前任务将 Alauda Build of OpenTelemetry 迁移到 v2盘点旧版 Jaeger 部署备份旧版 Jaeger 资源验证 Elasticsearch 容量迁移操作步骤观察期清理(可选)为旧版 Jaeger 启用双写启用双写停止双写回滚FAQ概述
ACP Tracing 与 Alauda Distributed Tracing 之间的变化
关于 OpenTelemetry Operator、Collector 和 Instrumentation 资源的变更(包括现在必需的 spec.java.image 字段、Service Mesh v1 不兼容性,以及 Collector 配置 schema 迁移),请参见 OpenTelemetry v2 迁移指南中的 v1 与 v2 之间的变化。
旧版 Alauda Build of Jaeger Operator 管理着一个独立的 CRD(jaegertracing.io/v1.Jaeger),并且不会与 v2 OpenTelemetry Operator 冲突。因此,在迁移期间会保留其运行,以便旧版 Jaeger 继续提供历史 trace 数据。
迁移中断窗口
trace 采集会在两个位置中断:
-
在 OpenTelemetry v1 → v2 迁移期间,从旧版
OpenTelemetryCollector被删除开始,到 v2OpenTelemetryCollector变为 ready 结束。请参见 OpenTelemetry v2 迁移指南中的 迁移中断窗口。 -
在 Jaeger 切换期间,当对 v2 Collector 进行 patch,将其 trace exporter 从旧版 Jaeger 重定向到新的 Jaeger v2 后端时。Collector deployment 会重新滚动,因此在滚动期间可能会出现短暂的采集间隙。
在这两个窗口期间,应用 Pod 都会继续正常运行,但在间隙中生成的 telemetry 可能会被临时缓冲,并且如果无法及时导出,则可能会被丢弃。请将每个阶段安排在低流量窗口,并提前通知 telemetry 使用者(开发人员、SRE、Kiali 用户)。
在整个迁移过程中,旧版 Jaeger 查询路径始终可用,因此在新流水线启动期间,之前存储的 traces 仍可在旧版 Jaeger UI 中搜索。
迁移流程概览
trace 数据连续性策略
按照 OpenTelemetry v2 迁移指南中关于 重新创建 OpenTelemetryCollector 资源 的说明,在 OpenTelemetry v2 迁移期间,v2 OpenTelemetry Collector 会部署到相同的 namespace,并使用相同的 Service 名称(cpaas-system 中的 otel-collector)作为旧版 Collector。将 OTLP 导出到 otel-collector.cpaas-system 的应用无需更改配置即可继续工作。
在 Jaeger 切换完成后,trace 数据会按时间清晰分区:
- 在切换前采集的 traces 只保留在旧版 Jaeger 中。只要旧版
jaeger-es-index-cleaner仍保留它们,就可以通过<platform-url>/clusters/<cluster>/acp/jaeger这个旧版 Jaeger UI 查询;默认情况下,它们会在索引创建日期起 7 天后被清理。 - 在切换后采集的 traces 只会写入新的 Jaeger v2 后端。可以通过
<platform-url>/clusters/<cluster>/jaeger这个新的 Jaeger UI 查询。
在观察期内,旧版 Jaeger 实例及其 Operator 会有意 保持运行,以便用户可以继续通过旧版 UI 搜索最近的历史 traces。待旧版保留期完全过期(≥ 7 天)后,会在 清理 中卸载旧版栈。
请提前向用户说明这一点:新的 Jaeger UI 不包含切换前的 traces。 在观察期内,如果用户要搜索在切换前开始的 trace,应回退到旧版 Jaeger UI。
有些团队更倾向于在观察期内将每个 span 同时双写到新的 Jaeger 和旧版 Jaeger,这样切换后的 traces 会同时出现在 两个 UI 中。这对于并行验证、跨团队逐步切换 UI,或更快的原地回滚路径都很有用。这样会在观察期内将 Elasticsearch 写入负载和存储大约增加一倍,并且还会增加一个额外的清理步骤。请参见 (可选) 为旧版 Jaeger 启用双写。
双写不会将切换前的 traces 回填到新的 Jaeger 中;切换前的 traces 只能通过旧版 Jaeger UI 查询。
前提条件
- cluster administrator 角色的用户已建立有效的 ACP CLI(
kubectl)会话。 - 当前已安装旧版 ACP Tracing 栈(包含
Jaeger实例的Alauda Build of JaegerOperator,以及包含一个OpenTelemetryCollector和一个或多个Instrumentation资源的Alauda Build of OpenTelemetry)。 - Elasticsearch 8.x 可从集群访问,并且您拥有具备创建 ILM policy、index template 和 index alias 权限的 Elasticsearch 用户。
- 运行迁移命令的工作站上已安装
jq和envsubst命令行工具。 - 已通知 telemetry 使用者(开发人员、Kiali 用户、SRE 仪表板)以及应用所有者有关计划中的中断窗口。
迁移前任务
将 Alauda Build of OpenTelemetry 迁移到 v2
在迁移 Jaeger 后端之前,请先按照 从 Alauda Build of OpenTelemetry 迁移到 Alauda Build of OpenTelemetry v2 完成从 Alauda Build of OpenTelemetry 到 Alauda Build of OpenTelemetry v2 的迁移。该指南涵盖以下内容:
- 备份并卸载旧版
Alauda Build of OpenTelemetryOperator 及其OpenTelemetryCollector和Instrumentation资源。 - 安装 v2 Operator。
- 准备 Java 自动埋点镜像,并重新创建
OpenTelemetryCollector和Instrumentation资源,包括设置现在必需的spec.java.image字段。 - 重新部署应用 Pod,以便注入新的 Java 智能体。
在此阶段结束时:
- v2
Alauda Build of OpenTelemetryOperator 已安装,旧版 Operator 已卸载。 cpaas-system中的 v2OpenTelemetryCollector正在运行,其 trace exporter 仍指向旧版 Jaeger(这是根据 v1 备份重新创建 Collector 的自然结果)。- 所有
Instrumentation资源都已设置spec.java.image,并且应用 Pod 已重新部署并注入 v2 Java 智能体。
在本指南的 将 v2 OpenTelemetry Collector 切换到新的 Jaeger 之前,trace 采集会继续流向旧版 Jaeger。
盘点旧版 Jaeger 部署
请捕获旧版 Jaeger 的当前状态,以便了解迁移范围并生成用于回滚的备份。
-
列出旧版
Alauda Build of JaegerOperator 和Jaeger实例: -
记录旧版
Jaeger资源中引用的旧版 Elasticsearch endpoint、凭据和索引前缀。它们也将被新 Jaeger v2 实例复用。
备份旧版 Jaeger 资源
导出旧版 Jaeger 资源,以便在需要时重新构建它们(以及回滚):
这些备份文件仅用于配置参考和回滚工件。在 v2 上重新构建 Jaeger 时,请遵循 安装 Alauda Distributed Tracing 中描述的 v2 约定。
验证 Elasticsearch 容量
新的 Jaeger 会写入一组独立的索引家族(acp-<cluster>-jaeger-*),而旧索引家族(acp-tracing-<cluster>-jaeger-*)会在旧版保留期内逐步过期。请预留一份额外完整保留周期所需的 trace 存储空间。若启用 (可选) 为旧版 Jaeger 启用双写,则在观察期内请预留大约两倍的稳定态存储空间。
迁移操作步骤
部署新的 Jaeger v2 实例
请参照 Alauda Distributed Tracing 安装指南中的 部署 Alauda Build of Jaeger v2。新的 Jaeger v2 实例会部署到一个专用 namespace(默认是 jaeger-system),以避免与 cpaas-system 中旧版的 jaeger-prod 实例冲突。
这里只需遵循上面链接的 Deploying the Alauda Build of Jaeger v2 小节。不要执行同一安装指南中的 Deploying the OpenTelemetry Collector 小节——面向应用的 v2 OpenTelemetry Collector 已在 阶段 1(OpenTelemetry v2 迁移) 中部署到了 cpaas-system。执行该小节会在 jaeger-system 中创建一个重复的 otel Collector,但没有任何应用会连接它。
当您进入变量设置步骤时,请保留 默认索引前缀,以确保新的 Jaeger 写入的索引与旧索引清晰分离:
完成安装步骤后,请验证以下内容:
jaeger-system中的 Jaeger Pod 状态为Ready。- Jaeger UI 可通过
<platform-url>/clusters/<cluster>/jaeger访问。此时它是空的,因为尚无 exporter 向其写入数据。 - Service
jaeger-collector.jaeger-system.svc.cluster.local在端口4317上接受 OTLP gRPC——这将是下一步中 v2 OpenTelemetry Collector 的导出目标。
将 v2 OpenTelemetry Collector 切换到新的 Jaeger
在 OpenTelemetry v1 → v2 迁移 完成后,cpaas-system 中重新创建的 otel OpenTelemetryCollector 仍会将 traces 写入旧版 Jaeger,因为其 trace exporter 是从 v1 备份继承来的。其 spec.config 中与 trace 相关的部分通常如下所示(其他字段与此步骤无关,因此已省略):
- 继承自 v1 备份的旧版 Jaeger exporter 名为
otlp,其目标是cpaas-system中旧版 Jaeger collector 的 headless Service。balancer_name: round_robin会在 headless Service 的各个 endpoint 之间分发 spans。 - trace pipeline 会将 spans 发送到
debug(日志)和otlp(旧版 Jaeger)。
将 Collector patch 为:(1) 添加一个新的 otlp/jaeger-v2 exporter,指向 jaeger-system 中新的 Jaeger v2 collector Service;(2) 通过将旧的 otlp exporter 设为 null 来移除它;(3) 将 trace pipeline 的 exporter 列表替换为 [debug, otlp/jaeger-v2]:
service.pipelines.traces.exporters 是一个数组,而 merge patch 会整体替换数组,而不是追加。上面的 patch 列出了 trace pipeline 中必须保留的所有 exporter(debug、otlp/jaeger-v2)。如果您的 trace pipeline 中还有其他自定义 exporter,请在应用 patch 之前将它们添加到这个列表中。
如果您 Collector 上继承的旧版 Jaeger exporter 不叫 otlp(例如,您的 v1 备份使用的是 jaeger 或其他 OTLP 变体),则请在 null 移除步骤中相应地替换该名称。
新 exporter 命名为 otlp/jaeger-v2,而不是复用 otlp 这个名称,这样如果您之后还想在观察期内同时写入旧版 Jaeger,那么就可以用对称的方式把额外的 exporter 作为 otlp/jaeger-v1 再补回来。请参见 (可选) 为旧版 Jaeger 启用双写。
此时 trace 采集已恢复。新的 traces 会写入新的 Jaeger v2 后端,并且可以在新的 Jaeger UI 中进行搜索。
验证迁移
-
确认两个
OpenTelemetryCollector资源都处于健康状态:示例输出:
cpaas-system/otel(面向应用的 Collector,由 OpenTelemetry v1 → v2 迁移 重新部署)和jaeger-system/jaeger(在 部署新的 Jaeger v2 实例 中部署的新 Jaeger v2 后端)都必须报告READY为<ready>/<desired>,且<ready>等于<desired>(通常为1/1),MANAGEMENT为managed。如果READY列显示0/1或为空,请先检查相应 namespace 中的 Collector Pod 日志,然后再继续。 -
使用
telemetrygen生成示例 traces,并验证它们出现在新的 Jaeger UI 中:<platform-url>/clusters/<cluster>/jaeger上的新 Jaeger UI 应显示jaeger-migration-check服务及其 traces。 -
确认新的索引家族已在 Elasticsearch 中创建,并且旧索引家族保持完整:
您应该会看到匹配
acp-tracing-<cluster>-jaeger-*的旧索引(按日期命名,且不再增长)以及匹配acp-<cluster>-jaeger-*-000001的新索引(rollover,正在增长)。 -
抽样验证一次真实的业务请求会在新的 Jaeger UI 中产生 trace。选择一个或两个已完成埋点的应用,触发一个代表性请求,并在新的 Jaeger UI 中查找其 traceID。
观察期
在切换完成后,请让旧版 Jaeger 继续运行 至少 7 天,以匹配旧版 esIndexCleaner.numberOfDays 的保留策略。在这个窗口期间:
- 旧版 Jaeger UI 会继续提供所有尚未被旧版
jaeger-es-index-cleaner删除的切换前 traces。该 cleaner 会在每个索引创建约 7 天后将其移除;一旦所有切换前索引都被清理完毕,旧版 Jaeger 就不再保留任何有用数据,可以卸载。 - 新的 Jaeger 会累积切换后产生的 traces。请针对新的 Jaeger UI 和 v2 Java 智能体的指标名称验证仪表板、告警以及 Kiali 集成。
- 请清晰地传达这一分界:告诉用户新的 Jaeger UI 显示的是从切换开始之后的 traces,而较旧的 traces 仍保留在旧版 Jaeger UI 中。
如果切换前 traces 没有业务价值,您可以缩短或跳过观察期,直接进入 清理;代价是,一旦移除旧版栈,所有早于切换点的 traces 都将不再可访问。
一旦在 卸载旧版 Jaeger 实例 中删除了旧版 Jaeger 实例,切换前的 traces 将无法恢复。请在继续之前确认没有人仍然依赖这些数据。
清理
卸载旧版 Jaeger 实例
如果您选择了 (可选) 为旧版 Jaeger 启用双写,请先按照 停止双写 的说明,从 v2 Collector pipeline 中移除旧版 exporter。只要 v2 Collector 仍在引用旧版 Jaeger collector Service,那么该 Service 就必须继续存在;否则 OTLP exporter 会持续累积连接错误,直到 Collector 被 patch。
删除旧版 Jaeger 实例及其支持资源:
卸载 Alauda Build of Jaeger Operator:
如果集群中不再存在其他 Jaeger 资源,还可以删除 jaegers.jaegertracing.io CRD:
禁用旧版功能开关并清理旧索引
-
在 ACP Web 控制台中,打开 Feature Switch 并禁用
acp-tracing-ui。在旧版 Alauda Build of OpenTelemetry v1 Operator 被卸载后,平台定制的 Observability → Tracing 视图将不再可用。请更新内部文档和 runbook,改为指向 Jaeger UI URL<platform-url>/clusters/<cluster>/jaeger。 -
旧版
jaeger-es-index-cleanerCronJob 已随旧版Jaeger实例一起被删除,因此 Elasticsearch 中任何剩余的acp-tracing-<cluster>-jaeger-*索引都将不再自动轮转。请手动删除它们:
(可选)为旧版 Jaeger 启用双写
将 v2 OpenTelemetry Collector 配置为把每个 span 同时写入新的 Jaeger 和旧版 Jaeger,是一种可选方案,用来替代默认的单写 pipeline。以下场景可考虑启用:
- 并行验证。 您希望在完全信任新后端之前,使用生产流量将新的 Jaeger 与旧版 Jaeger 进行对比。
- 更快的原地回滚。 如果新 Jaeger 在观察期内出现问题,您只需通过一次 patch 将
otlp/jaeger-v2从 trace pipeline 中移除,旧版 Jaeger 就会继续不中断地接收 traces。 - 逐步切换 UI。 不同团队计划按各自节奏从旧版 UI 切换到新版 UI,而您希望在过渡期间两个 UI 都能显示切换后的数据。
权衡如下:
- 在观察期内,Elasticsearch 的写入负载和存储使用量大约会 翻倍,因为每个 span 都会被索引到两组索引家族中。
- 在卸载旧版 Jaeger 之前,必须通过 停止双写 中的额外 patch 回退 trace pipeline。
- 必须监控两个导出 pipeline 的失败情况(
otelcol_exporter_send_failed_spans_total,分别针对otlp/jaeger-v2和otlp/jaeger-v1)。
双写不会将切换前的 traces 回填到新的 Jaeger 中;切换前的 traces 只能通过旧版 Jaeger UI 查询。
启用双写
在 将 v2 OpenTelemetry Collector 切换到新的 Jaeger 收敛之后,otel Collector 只有 otlp/jaeger-v2 这一个向 Jaeger 后端写入 traces 的 exporter(trace pipeline 为 [debug, otlp/jaeger-v2])。请对 Collector 进行 patch,把旧版 Jaeger 作为第二个 exporter otlp/jaeger-v1 加回去,镜像恢复被切换步骤移除的原始 otlp exporter 的旧版 Jaeger endpoint、headless-Service 负载均衡和 TLS 设置:
service.pipelines.traces.exporters 是一个数组,而 merge patch 会整体替换数组,而不是追加。上面的 patch 列出了 trace pipeline 中必须保留的所有 exporter(debug、otlp/jaeger-v2、otlp/jaeger-v1)。如果您的 trace pipeline 中还有其他自定义 exporter,请在应用 patch 之前将它们添加到这个列表中。
应用 patch 后,每个 span 都会同时写入两个 Jaeger 后端。
停止双写
在观察期结束后、卸载旧版 Jaeger 实例之前,请从 trace pipeline 中移除旧版 exporter:
应用此 patch 后,v2 Collector 将只会把 traces 写入新的 Jaeger。此时即可继续执行 卸载旧版 Jaeger 实例。
回滚
关于 OpenTelemetry v1 → v2 阶段的回滚,请参见 OpenTelemetry v2 迁移指南中的 回滚。对于本文档中执行的 Jaeger 迁移阶段,请根据当前所处阶段选择相应的回滚路径:
FAQ
应用是否需要更新它们的 OTLP endpoint?
不需要。按照 OpenTelemetry v2 迁移指南中 重新创建 OpenTelemetryCollector 资源 的说明,v2 OpenTelemetry Collector 会部署在相同的 namespace(cpaas-system)中,使用相同的 Service 名称(otel-collector)和相同的端口(4317/4318)。导出到 otel-collector.cpaas-system:4317 的工作负载无需任何更改即可继续工作。
新的 Jaeger UI 会显示切换前的 traces 吗?
不会。切换前的 traces 只存储在旧版 Jaeger 中,并且在旧版保留窗口期间(默认 7 天)仍可通过旧版 Jaeger UI 查询。新的 Jaeger UI 从切换点开始才会显示 traces。请提前向用户说明这一点,并在观察期内将旧 traces 的查询引导到旧版 UI。
什么时候应该启用双写?
默认的单写路径足以满足大多数迁移场景。仅当以下情况之一成立时,才启用双写((可选) 为旧版 Jaeger 启用双写):
- 您需要在依赖新 Jaeger 之前,使用生产流量验证其与旧版 Jaeger 的一致性。
- 不同团队会按各自计划从旧版 UI 切换到新版 UI,并且您希望在过渡期间两个 UI 都显示切换后的数据。
- 您希望在观察期内拥有最快的原地回滚路径。
请注意,双写会在观察期内使 Elasticsearch 的写入负载和存储使用量大约翻倍,并且会在卸载旧版 Jaeger 之前额外增加一个 patch 步骤。
旧版和新 Jaeger 能共用同一个 Elasticsearch 索引吗?
不能。旧版 Jaeger 使用按日期命名的每日索引(acp-tracing-<cluster>-jaeger-span-YYYY-MM-DD),而 Jaeger v2 使用 rollover 别名(acp-<cluster>-jaeger-span-write / -read,其后端为 *-000001、*-000002,等等)。两者的 schema 和生命周期管理方式不同,因此两组索引家族必须保持分离。请保留 部署新的 Jaeger v2 实例 中显示的默认前缀,以避免冲突。
观察期需要额外多少 Elasticsearch 存储?
在默认单写路径下,新的索引家族会从零开始增长,而旧索引家族会在旧版保留期内逐步过期;请预留一份额外完整保留周期所需的 trace 存储作为稳定态缓冲。若启用双写,则在观察期内请为旧索引家族预留大约两倍的稳定态大小,并为重试和采集突发预留额外余量。
迁移过程中可以启用 Service Performance Monitoring(SPM)吗?
SPM 是可选功能,可以在 验证迁移 之后的任何时间启用。请参照 (可选) 启用 Service Performance Monitoring(SPM),为 v2 OpenTelemetry Collector 添加 spanmetrics connector,并在新的 Jaeger 中配置 metrics 后端。