从 Alauda Build of OpenTelemetry 迁移到 Alauda Build of OpenTelemetry v2
本文档介绍如何将现有的 Alauda Build of OpenTelemetry(基于上游 OpenTelemetry Operator/Collector 0.108.0 构建)部署迁移到 Alauda Build of OpenTelemetry v2(基于上游 0.147.0 构建)。
这两个发行版通过不同的 OLM 包——opentelemetry-operator 和 opentelemetry-operator2——交付,但它们拥有相同的 Custom Resource Definitions(OpenTelemetryCollector 和 Instrumentation)。OLM 不允许两个 Operator 同时拥有相同的 CRD,因此迁移必须按 卸载 v1 → 安装 v2 的方式进行,而不是并行升级。
目录
概述v1 和 v2 之间有哪些变化迁移停机窗口迁移流程总览前提条件迁移前任务清点现有部署备份 v1 资源准备 Java agent 镜像检查 Collector 配置兼容性迁移操作步骤回滚故障排查概述
v1 和 v2 之间有哪些变化
- 由于 v1 Operator(
opentelemetry-operator)和 v2 Operator(opentelemetry-operator2)共享 CRD 所有权,因此必须先完全卸载 v1,才能安装 v2。迁移过程中会保留这些 CRD;v2 Operator 在安装时会接管并升级它们。
迁移停机窗口
在删除 v1 OpenTelemetryCollector 到 v2 OpenTelemetryCollector 就绪之间,遥测采集会中断。应用 Pod 会继续正常运行,但在空档期间生成的遥测数据可能会暂存,并且如果无法及时导出则可能丢失。请在低流量窗口执行迁移,并提前通知遥测消费者。
迁移流程总览
前提条件
- 由具有
cluster-admin角色的集群管理员登录的活动 ACP CLI(kubectl)会话。 - 已安装
jq命令行 JSON 处理器。 - 集群中当前已安装 Alauda Build of OpenTelemetry (v1)。
- 如果有服务使用 OTel Java auto-instrumentation,则集群可访问的镜像仓库中应存在一个 Java auto-instrumentation 镜像。详情请参见 准备 Java agent 镜像。不使用 OTel Java 自动注入的服务不需要此镜像。
- 已通知遥测消费者(例如 Jaeger、Prometheus、平台 Tracing 控制台)和应用所有者有关计划中的停机窗口。
迁移前任务
清点现有部署
在进行任何更改之前,请先捕获当前状态,以便了解迁移范围并为回滚制作备份。
-
列出 v1 Operator 资源:
-
列出现有的 OpenTelemetry 自定义资源:
-
列出当前依赖 Java auto-instrumentation 的工作负载:
备份 v1 资源
导出 v1 资源,以便在 v2 中重新构建它们(并在需要时回滚)。
备份文件仅用于配置参考和回滚工件。cpaas-system 中的 ServiceMonitor、ServiceAccount 和 ClusterRoleBinding 备份,仅在你之后需要回滚依赖这些 v1 资源的集成时才需要。在 v2 上重建资源时,请遵循 安装 Alauda Build of OpenTelemetry v2 中描述的 v2 约定,并按需调整。
准备 Java agent 镜像
在 v1 中,Alauda 会随 Operator 一起提供定制的 Java auto-instrumentation 镜像,并由 Operator 自动注入;用户通常将 Instrumentation.spec.java.image 保持为空。在 v2 中,Operator 不再提供 Java agent 镜像,因此你必须在每个面向 Java 工作负载的 Instrumentation 资源上显式设置 spec.java.image。详情请参见 Java 自动埋点。
OpenTelemetry Java agent 已从 1.x 系列迁移到 2.x 系列。一些自动生成的指标名称和属性与 v1 生成的不同。如果你的仪表盘或告警依赖特定指标名称,请查阅上游 Java agent release notes 中的变更,并据此更新。
检查 Collector 配置兼容性
Alauda Build of OpenTelemetry v2 支持 v2.0.0 Release Notes 中列出的组件。请检查现有 OpenTelemetryCollector 资源中引用的每个 receiver、processor、exporter、connector 和 extension,并确认:
- 每个组件都包含在 v2 支持的组件列表中。
- 配置语法与上游
0.147.0schema 一致。上游版本范围内有些字段已经发生变化。例如,spec.config.service.telemetry.metrics的配置结构在两个版本之间不同。
如果你有 staging 环境,可以先在该环境中将 v1 配置应用到新安装的 v2 Operator 上,这样可以在生产迁移前尽早暴露不兼容问题。
迁移操作步骤
删除 v1 Instrumentation 资源
-
列出现有的
Instrumentation资源: -
删除每个
Instrumentation资源。将<namespace>和<name>替换为上一步中的值:TIP删除
Instrumentation不会影响已经被 webhook 修改过的应用 Pod——之前注入的 init container、环境变量和JAVA_TOOL_OPTIONS仍然保留在运行中的 Pod 中。删除操作只会阻止 v1 Operator 将它们注入到新创建的 Pod 中。
删除 v1 OpenTelemetryCollector 资源
-
列出现有的
OpenTelemetryCollector资源: -
删除每个
OpenTelemetryCollector资源:
执行完此步骤后,v1 Collector 暴露的 OTLP、Jaeger 和 Zipkin 端点将不再存在。继续导出遥测的应用 Pod 会看到导出错误,直到在 步骤 5 中创建 v2 Collector。
卸载 v1 Operator
-
删除
Subscription: -
删除 v1 部署在
cpaas-system中创建的 RBAC 和监控资源(如果你的 v1 部署没有创建这些资源,则跳过此步骤)。这些资源已在 备份 v1 资源 中备份,用于回滚。 -
等待集群中不再存在任何 v1 Operator CSV。此检查非常重要——如果仍有任何 v1 CSV 存在,由于 CRD 所有者冲突,OLM 会在 步骤 4 中拒绝安装 v2 Operator。
预期输出为空。
不要删除 opentelemetrycollectors.opentelemetry.io 和 instrumentations.opentelemetry.io CRD。v2 Operator 安装时会接管并升级这些 CRD。保留它们也有助于你在需要时使用 备份 v1 资源 中捕获的备份文件回滚到 v1。
安装 v2 Operator
请遵循 安装 Alauda Build of OpenTelemetry v2 Operator。简化后的 CLI 流程如下:
-
确认可用的 v2 Operator 版本:
-
创建 Operator 命名空间:
-
创建
Subscription。将startingCSV替换为第 1 步返回的版本。 -
批准
InstallPlan: -
等待 v2 CSV 达到
Succeeded:
重新创建 OpenTelemetryCollector 资源
此迁移会带来哪些变化
使用 v1 备份重建 OpenTelemetryCollector manifest 时,在应用到 v2 之前必须调整以下方面。
-
Collector 命名空间。Collector 命名空间必须与 Operator 命名空间(
opentelemetry-operator2)不同。请根据部署场景选择命名空间:- Standalone Collector:使用专用命名空间,例如
opentelemetry-collector。 - Alauda Container Platform Tracing 集成:继续使用相同的 Collector 命名空间(通常是
cpaas-system),这样引用 Collector service 的下游服务就无需修改。 - Alauda Service Mesh v2 集成:继续将 Collector 放在
istio-system中,以便现有的IstiomeshConfig.extensionProviders[].opentelemetry.service仍然有效。
- Standalone Collector:使用专用命名空间,例如
-
组件兼容性。
spec.config中使用的每个组件都必须被 v2 支持。对于与Alauda Distributed Tracing集成时推荐的 Collector 配置,请参见 Alauda Distributed Tracing 文档中的 部署 OpenTelemetry Collector。对于其他场景,请遵循 部署 OpenTelemetry Collector 并根据你的环境调整示例。 -
Feature gates。v1 Collector 通常通过
spec.args.feature-gates传递 Collector feature gates。随着 Collector 版本升级,许多 gate 已经稳定化(因此不再可切换)或者被完全移除,因此直接复用 v1 列表可能会导致 v2 Collector Pod 无法启动。请从备份中移除spec.args.feature-gates,并且只重新引入 v2 Collector 版本明确记录的 gate。 -
内部指标 Prometheus 端点。
service.telemetry.metrics.address字段不再是暴露内部指标 Prometheus 端点的受支持方式。请改为按照 OpenTelemetry Collector 内部遥测文档 的说明,在service.telemetry.metrics.readers[].pull.exporter.prometheus下进行配置。典型的 v1 备份如下: -
内部指标详细程度。
level: detailed会为 Collector 自身的内部指标启用 histogram bucket 和按实例标签,这会显著增加 Prometheus 的 cardinality 和存储成本——尤其是在具有大量 receiver/exporter 实例的 Gateway 模式部署中。生产环境推荐使用默认的level: normal:它仍会暴露进程资源使用情况以及按组件划分的 sent/received/refused/dropped counter,这对于大多数 SRE 告警和容量需求已经足够。只有在调查 exporter 延迟分布或 batch 大小问题时,才临时切换回detailed。 -
由 API server 管理的元数据。由 API server 写入的字段(
metadata.creationTimestamp、metadata.resourceVersion、metadata.uid、metadata.generation、metadata.managedFields、metadata.finalizers、kubectl.kubernetes.io/last-applied-configuration注解以及status)不能在创建时复用,必须从备份中删除。 -
Operator 管理的 RBAC 和 Prometheus 抓取。v2 Operator 会自动创建 Collector 所需的
ServiceAccount和ClusterRoleBinding资源。从备份中删除 v1spec.serviceAccount字段,这样 Operator 就可以使用正确的权限创建一个新的 ServiceAccount;通常无需手动重建 v1 RBAC 资源。若希望 Operator 也为内部 Prometheus 端点创建ServiceMonitor,请设置spec.observability.metrics.enableMetrics: true,并向metadata.labels添加一个发现标签(例如prometheus: kube-prometheus),以便你的 Prometheus Operator 实例拾取该资源。如果某个 Collector 组件需要额外的集群级 RBAC(例如k8sattributesprocessor 或k8sobjectsreceiver),请参见 自动创建所需的 RBAC 资源。
迁移操作步骤
-
从备份中重新创建
OpenTelemetryCollector资源。以下示例会将./otel-v1-backup/collectors.yaml复制到新的工作目录,去除由 server 管理的元数据,删除 v1spec.serviceAccount和spec.args.feature-gates字段,将level: detailed降级为默认的level: normal,用新的readers配置替换已弃用的address字段,通过设置spec.observability.metrics.enableMetrics: true并添加prometheus: kube-prometheus标签来启用由 Operator 管理的 metrics 抓取,以便 kube-prometheus stack 发现自动创建的ServiceMonitor,最后应用结果。jq不能直接读取 YAML,因此示例中仅使用kubectl patch --local -p='[]' -o json作为本地 YAML 到 JSON 的解码器,然后再将资源传递给jq。 -
等待 Collector Pod 就绪:
重新创建 Instrumentation 资源
对于你备份的每个 Instrumentation 资源,请在 v2 上重新创建,并设置新的 spec.java.image 字段。导出器端点和其他环境变量的结构与 v1 中保持一致,但 Java auto-instrumentation 现在使用 autoinstrumentation-java 2.x 镜像。在此版本中,默认的 OTLP exporter 协议是 http/protobuf,因此之前指向 Collector gRPC 端口 4317 的端点必须改为 Collector HTTP 端口 4318,除非你显式配置 OTEL_EXPORTER_OTLP_PROTOCOL=grpc。如果 Collector 命名空间或 service 名称发生变化,也请更新 host 值。
使用上一步创建的相同工作目录。以下示例会复制 ./otel-v1-backup/instrumentations.yaml,将 spec.java.image 设置为 JAVA_AUTO_INSTRUMENTATION_IMAGE 变量的值,把备份中的 OTEL_EXPORTER_OTLP_ENDPOINT 从端口 4317 改为 4318,并创建 Instrumentation 资源:
- 将
JAVA_AUTO_INSTRUMENTATION_IMAGE设置为你在 准备 Java agent 镜像 中准备好的镜像。该命令会把此值写入spec.java.image。如果没有这个字段,就不会注入 Java agent,Java 工作负载也不会被埋点。 autoinstrumentation-java2.x 默认使用http/protobuf导出,因此端点必须使用 Collector 的 OTLP HTTP receiver,通常是端口4318。如果你有意保留 gRPC receiver 在端口4317,请在 Java 环境配置中添加OTEL_EXPORTER_OTLP_PROTOCOL=grpc。
重新滚动应用 Pod
之前由 v1 Operator 注入埋点的应用 Pod 仍然保留 v1 init container、agent 路径和 JAVA_TOOL_OPTIONS。由于这些 Pod 依赖的 Collector 已被替换,这些 Pod 的遥测导出已不再可用。请重新滚动受影响的工作负载,以便 v2 mutating webhook 注入新的 Java agent 镜像和环境变量。
-
列出启用了 Java auto-instrumentation 的 Deployment:
-
重启每个已埋点的 Deployment,并等待滚动更新完成。根据你需要的验证谨慎程度,从下面两种方法中选择一种。
选项 A — 一次一个 Deployment。 对每个 Deployment 单独执行 rollout。对于大型集群,建议按关键性分批重启 Deployment,这样可以在每一批之后暂停并验证。
选项 B — 一条命令重启所有已埋点的 Deployment。 遍历所有启用 Java auto-instrumentation 的 Deployment。该方式更快,但没有内置的暂停点,因此更适合小型集群,或者在你已在金丝雀环境验证过更改之后使用。
验证迁移
-
验证集群中只存在 v2 Operator CSV,且其状态已达到
Succeeded: -
验证 v2 Operator 工作负载正在运行:
-
验证
OpenTelemetryCollector资源健康,并报告 v2 版本: -
验证
Instrumentation资源已配置spec.java.image: -
验证某个已埋点的应用 Pod 使用新的 Java agent init container:
输出中必须包含在
Instrumentation.spec.java.image中配置的镜像。 -
验证 Pod spec 中存在 OpenTelemetry 环境变量。此检查直接针对 Kubernetes 对象,无需应用容器支持
kubectl exec或包含env命令。 -
向已埋点的应用发送测试请求,并确认生成的 traces 和指标已出现在你的 tracing 后端(例如 Jaeger UI 或平台 Tracing 控制台)以及 Prometheus 中。
回滚
如果在迁移过程中或迁移后不久发现问题,可以回滚到 v1 部署。相同的 OLM CRD 所有权约束在回滚时同样适用:在重新安装 v1 之前,必须先完全卸载 v2 Operator。
删除 v2 资源
等待 v2 Operator 完全移除
预期输出为空。
重新安装 v1 Operator
请遵循 安装 OpenTelemetry Operator 中记录的 v1 安装操作步骤。
从备份中重新创建 v1 资源
根据 备份 v1 资源 中捕获的 YAML 文件,重新创建 OpenTelemetryCollector、Instrumentation、ServiceAccount、ClusterRoleBinding 和 ServiceMonitor 资源。
再次滚动应用 Pod
使用 kubectl rollout restart 重启工作负载,以便 v1 mutating webhook 重新注入 v1 Java agent。
故障排查
如需深入排查 auto-instrumentation 流程,请参见 排查 instrumentation 问题。