Миграция с Alauda Build of OpenTelemetry на Alauda Build of OpenTelemetry v2
В этом документе описано, как выполнить миграцию существующего развертывания Alauda Build of OpenTelemetry (построенного на upstream OpenTelemetry Operator/Collector 0.108.0) на Alauda Build of OpenTelemetry v2 (построенного на upstream 0.147.0).
Оба дистрибутива поставляются через разные пакеты OLM — opentelemetry-operator и opentelemetry-operator2 — но владеют одними и теми же Custom Resource Definitions (OpenTelemetryCollector и Instrumentation). OLM не позволяет двум Operators одновременно владеть одними и теми же CRD, поэтому миграцию необходимо выполнять как uninstall v1 → install v2, а не как параллельное обновление.
Содержание
ОбзорЧто изменилось между v1 и v2Окно простоя при миграцииСхема миграцииПредварительные требованияПредварительные задачи перед миграциейИнвентаризация существующего развертыванияСоздание резервной копии ресурсов v1Подготовка образа Java agentПроверка совместимости конфигурации CollectorПроцедура миграцииRollbackУстранение неполадокОбзор
Что изменилось между v1 и v2
- Поскольку Operator v1 (
opentelemetry-operator) и Operator v2 (opentelemetry-operator2) разделяют владение CRD, установить v2 нельзя, пока v1 полностью не удалён. Сами CRD сохраняются в ходе миграции; после установки v2 Operator подхватывает и обновляет их.
Окно простоя при миграции
Сбор телеметрии прерывается в промежутке между удалением v1 OpenTelemetryCollector и моментом, когда v2 OpenTelemetryCollector становится готовым. Pod’ы приложений продолжают работать нормально, но телеметрия, сгенерированная в этот промежуток, может временно буферизоваться и быть потеряна, если её не удастся вовремя экспортировать. Планируйте миграцию на окно с низкой нагрузкой и заранее уведомите потребителей телеметрии.
Схема миграции
Предварительные требования
- Активная сессия ACP CLI (
kubectl) у администратора кластера с рольюcluster-admin. - Установлен командный JSON-процессор
jq. - Alauda Build of OpenTelemetry (v1) в настоящее время установлен в кластере.
- Если какой-либо сервис использует OTel Java auto-instrumentation, в реестре, доступном из кластера, доступен образ Java auto-instrumentation. См. Подготовка образа Java agent. Сервисам, которые не используют OTel Java auto-injection, этот образ не нужен.
- Потребители телеметрии (например, Jaeger, Prometheus, консоль Tracing платформы) и владельцы приложений уведомлены о планируемом окне простоя.
Предварительные задачи перед миграцией
Инвентаризация существующего развертывания
Перед внесением изменений зафиксируйте текущее состояние, чтобы понимать объём миграции и подготовить резервные копии для rollback.
-
Выведите список ресурсов v1 Operator:
-
Выведите список существующих custom resources OpenTelemetry:
-
Выведите список workloads, которые в настоящее время используют Java auto-instrumentation:
Создание резервной копии ресурсов v1
Экспортируйте ресурсы v1, чтобы затем можно было восстановить их в v2 (и при необходимости выполнить rollback).
Файлы резервной копии используются только как эталон конфигурации и как артефакт для rollback. Резервные копии ServiceMonitor, ServiceAccount и ClusterRoleBinding в cpaas-system нужны только в том случае, если позже вы будете откатывать интеграции, зависящие от этих ресурсов v1. При восстановлении ресурсов на v2 следуйте соглашениям v2, описанным в Установка Alauda Build of OpenTelemetry v2, и при необходимости вносите изменения.
Подготовка образа Java agent
В v1 Alauda поставляет вместе с Operator кастомизированный образ Java auto-instrumentation, и Operator автоматически внедряет его; обычно пользователи оставляют Instrumentation.spec.java.image не заданным. В v2 Operator больше не поставляет образ Java agent, и вы должны явно задать spec.java.image для каждого ресурса Instrumentation, который применяется к Java workloads. Подробности см. в Java Auto-instrumentation.
OpenTelemetry Java agent перешёл с серии 1.x на серию 2.x. Некоторые автоматически сгенерированные имена метрик и атрибуты отличаются от тех, которые создавались в v1. Если ваши dashboards или alerts зависят от конкретных имён метрик, изучите изменения в upstream release notes для Java agent и обновите их соответствующим образом.
Проверка совместимости конфигурации Collector
Alauda Build of OpenTelemetry v2 поддерживает компоненты, перечисленные в v2.0.0 Release Notes. Проверьте каждый receiver, processor, exporter, connector и extension, указанный в существующих ресурсах OpenTelemetryCollector, и убедитесь, что:
- Каждый компонент включён в списки поддерживаемых компонентов v2.
- Синтаксис конфигурации соответствует схеме upstream
0.147.0. В диапазоне upstream-версий некоторые поля изменились. Например, структура конфигурацииspec.config.service.telemetry.metricsотличается между двумя версиями.
Если у вас есть staging environment, примените конфигурацию v1 к freshly installed v2 Operator там — это хороший способ выявить несовместимости до миграции production.
Процедура миграции
Удаление ресурсов Instrumentation v1
-
Выведите список существующих ресурсов
Instrumentation: -
Удалите каждый ресурс
Instrumentation. Замените<namespace>и<name>значениями из предыдущего шага:TIPУдаление
Instrumentationне влияет на pod’ы приложений, которые уже были изменены webhook’ом — ранее внедрённый init container, переменные окружения иJAVA_TOOL_OPTIONSостаются в работающих pod’ах. Удаление лишь предотвращает внедрение этих настроек v1 Operator в новые создаваемые pod’ы.
Удаление ресурсов OpenTelemetryCollector v1
-
Выведите список существующих ресурсов
OpenTelemetryCollector: -
Удалите каждый ресурс
OpenTelemetryCollector:
После этого шага OTLP, Jaeger и Zipkin endpoints, предоставляемые v1 Collector, будут недоступны. Pod’ы приложений, которые продолжают экспортировать телеметрию, будут получать ошибки экспорта до тех пор, пока в Шаге 5 не будет создан v2 Collector.
Удаление v1 Operator
-
Удалите
Subscription: -
Удалите RBAC и monitoring resources, которые v1 deployment создал в
cpaas-system(пропустите этот шаг, если ваше v1 deployment их не создавало). Эти ресурсы сохранены в Создание резервной копии ресурсов v1 для rollback. -
Дождитесь, пока в кластере не останется ни одного CSV v1 Operator. Эта проверка важна — если какой-либо CSV v1 всё ещё присутствует, OLM отклонит установку v2 Operator в Шаге 4 из-за конфликта владельца CRD.
Ожидаемый вывод — пустой.
Не удаляйте CRD opentelemetrycollectors.opentelemetry.io и instrumentations.opentelemetry.io. v2 Operator подхватывает и обновляет эти CRD при установке. Их сохранение также позволяет выполнить rollback на v1, используя файлы резервной копии, созданные в Создание резервной копии ресурсов v1.
Установка v2 Operator
Следуйте инструкции Установка Operator Alauda Build of OpenTelemetry v2. Сокращённый поток CLI выглядит так:
-
Проверьте доступные версии v2 Operator:
-
Создайте namespace Operator:
-
Создайте
Subscription. ЗаменитеstartingCSVна версию, возвращённую на шаге 1. -
Одобрите
InstallPlan: -
Дождитесь, пока CSV v2 не перейдёт в состояние
Succeeded:
Воссоздание ресурсов OpenTelemetryCollector
Что меняется в этой миграции
При восстановлении манифестов OpenTelemetryCollector из резервной копии v1 необходимо внести следующие изменения, прежде чем применять их в v2.
-
Namespace Collector. Namespace Collector должен отличаться от namespace Operator (
opentelemetry-operator2). Выберите namespace в зависимости от сценария развертывания:- Standalone Collector: отдельный namespace, например
opentelemetry-collector. - Интеграция Alauda Container Platform Tracing: продолжайте использовать тот же namespace Collector (обычно
cpaas-system), чтобы downstream services, ссылающиеся на service Collector, не требовали изменений. - Интеграция Alauda Service Mesh v2: оставьте Collector в
istio-system, чтобы существующийIstiomeshConfig.extensionProviders[].opentelemetry.serviceоставался действительным.
- Standalone Collector: отдельный namespace, например
-
Совместимость компонентов. Каждый компонент, используемый в
spec.config, должен поддерживаться в v2. Для рекомендуемой конфигурации Collector при интеграции сAlauda Distributed Tracingсм. Развёртывание OpenTelemetry Collector в документации Alauda Distributed Tracing. Для других сценариев следуйте Развёртывание OpenTelemetry Collector и адаптируйте пример под вашу среду. -
Feature gates. v1 Collectors часто передают Collector feature gates через
spec.args.feature-gates. Многие из этих gates либо были стабилизированы (и, следовательно, больше не могут переключаться), либо полностью удалены в более новых версиях Collector, поэтому повторное использование списка v1 может помешать запуску pod Collector в v2. Удалитеspec.args.feature-gatesиз резервной копии и добавьте только те gates, которые явно документированы для используемой версии v2 Collector. -
Внутренний Prometheus endpoint метрик. Поле
service.telemetry.metrics.addressбольше не является поддерживаемым способом экспонирования внутреннего Prometheus endpoint метрик. Настройте его черезservice.telemetry.metrics.readers[].pull.exporter.prometheus, как описано в OpenTelemetry Collector internal telemetry documentation. Типичный backup v1 выглядит так: -
Подробность внутренних метрик.
level: detailedвключает histogram buckets и labels по каждому экземпляру для внутренних метрик самого Collector, что существенно увеличивает cardinality в Prometheus и стоимость хранения — особенно в развертываниях Gateway-mode с большим количеством экземпляров receiver/exporter. Для production рекомендуется значение по умолчаниюlevel: normal: оно по-прежнему показывает использование ресурсов процесса и счётчики sent/received/refused/dropped по каждому компоненту, чего достаточно для большинства требований SRE по alerting и capacity. Возвращайтесь кdetailedтолько временно при исследовании распределений задержек exporter или размера batch. -
Метаданные, управляемые сервером. Поля, записываемые API server (
metadata.creationTimestamp,metadata.resourceVersion,metadata.uid,metadata.generation,metadata.managedFields,metadata.finalizers, annotationkubectl.kubernetes.io/last-applied-configurationиstatus), нельзя повторно использовать при create; их необходимо удалить из резервной копии. -
RBAC и scraping Prometheus, управляемые Operator. v2 Operator автоматически создаёт ресурсы
ServiceAccountиClusterRoleBinding, необходимые Collector. Удалите поле v1spec.serviceAccountиз резервной копии, чтобы Operator мог создать новый ServiceAccount с корректными правами; обычно не требуется вручную воссоздавать ресурсы RBAC v1. Чтобы Operator также создавалServiceMonitorдля внутреннего Prometheus endpoint, установитеspec.observability.metrics.enableMetrics: trueи добавьте discovery label (например,prometheus: kube-prometheus) вmetadata.labels, чтобы ваш Prometheus Operator подхватил ресурс. Если компонент Collector требует дополнительных cluster-level RBAC (например, processork8sattributesили receiverk8sobjects), следуйте инструкции Автоматическое создание необходимых RBAC ресурсов.
Процедура миграции
-
Воссоздайте ресурс
OpenTelemetryCollectorиз резервной копии. В следующем примере./otel-v1-backup/collectors.yamlкопируется в новый рабочий каталог, удаляются server-managed metadata, поля v1spec.serviceAccountиspec.args.feature-gates, значениеlevel: detailedпонижается до стандартногоlevel: normal, устаревшее полеaddressзаменяется новой конфигурациейreaders, включается scraping метрик под управлением Operator через установкуspec.observability.metrics.enableMetrics: trueи добавление labelprometheus: kube-prometheus, чтобы стек kube-prometheus подхватил автоматически созданныйServiceMonitor, после чего результат применяется.jqне читает YAML напрямую, поэтому в примереkubectl patch --local -p='[]' -o jsonиспользуется только как локальный декодер YAML-to-JSON перед передачей ресурсов вjq. -
Дождитесь, пока pod’ы Collector не станут ready:
Воссоздание ресурсов Instrumentation
Для каждого ресурса Instrumentation, который вы сохранили в резервной копии, воссоздайте его на v2, указав новое поле spec.java.image. Endpoint экспортера и другие переменные окружения имеют ту же структуру, что и в v1, но Java auto-instrumentation теперь использует образ autoinstrumentation-java серии 2.x. В этой версии протокол OTLP exporter по умолчанию — http/protobuf, поэтому endpoints, которые ранее указывали на gRPC port Collector 4317, необходимо изменить на HTTP port Collector 4318, если только вы явно не настроите OTEL_EXPORTER_OTLP_PROTOCOL=grpc. При необходимости обновите также значение host, если изменились namespace Collector или имя service.
Используйте тот же рабочий каталог, созданный на предыдущем шаге. В следующем примере ./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 workloads не будут инструментированы. autoinstrumentation-java2.x по умолчанию экспортирует сhttp/protobuf, поэтому endpoint должен использовать OTLP HTTP receiver Collector, обычно порт4318. Если вы намеренно оставляете gRPC receiver на порту4317, добавьтеOTEL_EXPORTER_OTLP_PROTOCOL=grpcв конфигурацию переменных окружения Java.
Перевод application pods на новый rollout
Pod’ы приложений, которые ранее были инструментированы v1 Operator, по-прежнему содержат v1 init container, путь к agent и JAVA_TOOL_OPTIONS. Поскольку Collector, на который опирались эти pod’ы, был заменён, экспорт телеметрии из них больше не работает. Выполните rollout затронутых workloads, чтобы mutating webhook v2 внедрил новый образ Java agent и переменные окружения.
-
Выведите список deployments, которые включили Java auto-instrumentation:
-
Перезапустите каждый instrumented deployment и дождитесь завершения rollout. Выберите один из двух подходов ниже в зависимости от того, насколько осторожно вам нужно выполнить проверку.
Option A — По одному deployment за раз. Выполняйте rollout для каждого Deployment отдельно. Для крупных наборов ресурсов перезапускайте deployments волнами, упорядоченными по критичности, чтобы можно было приостановиться и выполнить проверку после каждой волны.
Option B — Все instrumented deployments одной командой. Пройдитесь по каждому Deployment, который включил Java auto-instrumentation. Это быстрее, но не даёт встроенной точки паузы, поэтому подходит для небольших наборов ресурсов или после проверки изменения на canary.
Проверка миграции
-
Убедитесь, что существует только CSV v2 Operator и что он достиг фазы
Succeeded: -
Убедитесь, что workloads v2 Operator работают:
-
Убедитесь, что ресурсы
OpenTelemetryCollectorздоровы и сообщают версию v2: -
Убедитесь, что у ресурсов
Instrumentationнастроеноspec.java.image: -
Убедитесь, что instrumented application pod использует новый init container Java agent:
В выводе должно присутствовать изображение, настроенное в
Instrumentation.spec.java.image. -
Убедитесь, что в pod spec присутствуют переменные окружения OpenTelemetry. Эта проверка выполняется непосредственно на Kubernetes object и не требует, чтобы application container поддерживал
kubectl execили включал командуenv. -
Отправьте тестовый запрос в instrumented application и подтвердите, что полученные traces и metrics отображаются в вашем tracing backend (например, Jaeger UI или консоль Tracing платформы) и в Prometheus.
Rollback
Если проблема обнаружена во время миграции или вскоре после неё, вы можете откатиться к развертыванию v1. То же ограничение OLM по владению CRD действует и в обратную сторону: перед повторной установкой v1 необходимо полностью удалить v2 Operator.
Удаление ресурсов v2
Дождаться полного удаления v2 Operator
Ожидаемый вывод — пустой.
Повторная установка v1 Operator
Следуйте процедуре установки v1, описанной в Установка OpenTelemetry Operator.
Воссоздание ресурсов v1 из резервной копии
Воссоздайте ресурсы OpenTelemetryCollector, Instrumentation, ServiceAccount, ClusterRoleBinding и ServiceMonitor из YAML-файлов, сохранённых в Создание резервной копии ресурсов v1.
Повторный rollout application pods
Перезапустите workloads с помощью kubectl rollout restart, чтобы mutating webhook v1 повторно внедрил v1 Java agent.
Устранение неполадок
Для более глубокого устранения неполадок в потоке auto-instrumentation см. Устранение неполадок в instrumentation.