升级 Auto-instrumentation Agents
每个 Instrumentation 资源都会在 spec.<language>.image 中指定其注入的 agent 镜像,而该 agent 会通过一个 init container 复制到 application pod 中;当 pod 被准入时,Operator 会注入这个 init container。因此,升级 agent 由两部分组成:
- 更新
Instrumentation资源中的镜像引用 - 重启已进行自动插桩的 workload,因为正在运行的 pod 会继续使用其启动时所带的 agent 版本
下面的示例将 Java agent 从 2.26.1 升级到 2.30.0。对于其他受支持的语言,只需替换对应字段即可,同样适用:spec.python.image、spec.nodejs.image、spec.dotnet.image、spec.go.image 或 spec.apacheHttpd.image。
Operator 会在 instrumentation.opentelemetry.io/default-auto-instrumentation-<language>-image 注解中记录默认情况下它将注入的镜像,并在启动时为任何其镜像仍与该默认值匹配的语言重写 spec.<language>.image。你自己提供的镜像永远不会匹配,因此会保持不变。这里始终如此,因为 Operator 只提供注入机制,不包含预构建的 instrumentation 镜像:每个 spec.<language>.image 都保存的是你自行构建或获取的镜像。
前提条件
- 如 升级 Alauda Build of OpenTelemetry v2 所述,Alauda Build of OpenTelemetry v2 Operator 已升级到 0.157.0。
- 要升级到的 agent 镜像由你自行构建或获取,并且可以从集群中拉取。Operator 不包含预构建的 instrumentation libraries 或 container images;请参见 Instrumentation Options。
- 由具有
cluster-admin角色的 cluster administrator 持有的有效 ACP CLI (kubectl) 会话。
更新 Instrumentation 资源
-
列出
Instrumentation资源以及每个资源注入的 Java agent 镜像:示例输出
-
设置后续命令使用的环境变量:
-
更新镜像引用:
NOTEInstrumentation资源仅在 pod 被准入时读取,因此此 patch 对已在运行的 pod 不会产生影响,它们也不会重启。Operator 会为其支持的每种语言填充默认镜像,而不仅仅是你配置的那一种;当这些默认值中的某一个过旧而无法自动升级时,Operator 会发出警告——例如
dotnet image ... 1.2.0 is at a version that cannot be automatically upgraded。该警告与正在升级的语言无关,也不会阻止该 patch 被应用。
重启已进行自动插桩的 Workloads
-
列出更新后的
Instrumentation资源所适用的 workloads:NOTE注入注解也可以设置在 namespace 上,此时该 namespace 中的每个 workload 都会被插桩,上面的命令将不会返回任何结果。请根据你部署中启用注入的方式调整选择条件,并以相同方式覆盖
DaemonSet和StatefulSetworkloads。 -
重启每个 workload,并等待其变为 ready:
WARNING重启 workloads 会中断它们所提供的流量。如果应用无法容忍滚动重启,请在维护窗口期间进行发布,或者一次只重启一个。
验证
-
确认注入的 init container 运行的是新的 agent 镜像:
示例输出
如果某个 pod 列出时没有镜像,则说明它未进行自动插桩,原因可能是它没有携带注入注解,或者是在添加该注解之前就已经被准入。
-
确认 agent 已加载到 application JVM 中。Operator 会将 agent 挂载到一个以其所插桩 container 命名的目录下:
示例输出
-
生成 application 流量,并确认 traces 仍然到达 Collector。如果 Collector 使用
debugexporter,则 span batches 会出现在其日志中:示例输出
版本注意事项
- 此版本中的
InstrumentationAPI 没有变化。新增了两个可选字段:spec.initContainerSecurityContext,用于设置注入的 init containers 的 security context;以及spec.go.securityContext,用于覆盖 Go sidecar 的默认值。请参见 Security Context Configuration。 - agent 的发布独立于 Operator,并遵循各自的版本流。在将其发布到 production 之前,请先查看你要升级的 agent 的 release notes,了解行为变化,例如新增或重命名的 span attributes。
- 在
spec.exporter.endpoint中配置的 exporter endpoint 不受此次升级影响。Java agent 仍默认使用http/protobufprotocol,因此除非显式设置OTEL_EXPORTER_OTLP_PROTOCOL=grpc,否则该 endpoint 必须指向端口4318上的 Collector OTLP HTTP receiver。