• Русский
  • Миграция с Alauda Container Platform Tracing

    В этом документе описывается, как выполнить миграцию существующего развертывания трассировки на основе устаревшего стека Alauda Container Platform (ACP) TracingAlauda Build of Jaeger (Jaeger 1.60.0) в сочетании с Alauda Build of OpenTelemetry — на Alauda Distributed Tracing на базе Jaeger v2 (2.16.0) в сочетании с Alauda Build of OpenTelemetry v2.

    Миграция выполняется в два этапа:

    1. Миграция стека OpenTelemetry. Замените устаревшие Operator и Collector Alauda Build of OpenTelemetry на Alauda Build of OpenTelemetry v2. Поды приложений пересобираются так, чтобы внедрялся агент Java v2. После этого этапа телеметрия собирается Collector v2, но по-прежнему записывается в устаревший backend Jaeger. Этот этап выполняется по инструкции Миграция с Alauda Build of OpenTelemetry на Alauda Build of OpenTelemetry v2.

    2. Миграция backend Jaeger. Разверните новый экземпляр Jaeger v2 рядом с устаревшим Jaeger, переключите trace exporter Collector v2 на новый backend и удалите устаревший Jaeger после истечения периода хранения устаревших данных.

    После переключения новый трафик трассировки поступает в новый backend Jaeger v2, а устаревший Jaeger продолжает обслуживать ранее сохраненные трассы. После истечения периода хранения устаревших данных (по умолчанию 7 дней) устаревший стек удаляется.

    Обзор

    Что меняется между ACP Tracing и Alauda Distributed Tracing

    ЭлементAlauda Container Platform Tracing (устаревший вариант)Alauda Distributed Tracing (целевой вариант)
    Версия Jaeger1.60.02.16.0
    Jaeger OperatorOperator Alauda Build of Jaeger (CRD: jaegertracing.io/v1.Jaeger)Operator Alauda Build of OpenTelemetry v2 (Jaeger v2 развертывается как opentelemetry.io/v1beta1.OpenTelemetryCollector)
    Префикс индекса Elasticsearch по умолчаниюacp-tracing-<cluster> (ежедневные индексы с датой в имени)acp-<cluster> (write/read alias с rollover)
    Хранение в Elasticsearchjaeger-es-index-cleaner CronJob удаляет ежедневные индексы старше numberOfDays (по умолчанию 7)Политика Index Lifecycle Management (ILM) jaeger-ilm-policy автоматически выполняет rollover и удаление индексов (по умолчанию удаление через 7d)
    Точка входа в UI трассировкиНастраиваемый платформой вид Observability → Tracing, доступ к которому управляется feature switch acp-tracing-uiНативный Jaeger UI, доступный через Ingress с sidecar OAuth2 Proxy

    Ознакомьтесь с изменениями в ресурсах OpenTelemetry Operator, Collector и Instrumentation (включая теперь обязательное поле spec.java.image, несовместимость с Service Mesh v1 и миграцию схемы конфигурации Collector) в разделе Что изменилось между v1 и v2 руководства по миграции OpenTelemetry v2.

    NOTE

    Устаревший Operator Alauda Build of Jaeger управляет отдельным CRD (jaegertracing.io/v1.Jaeger) и не конфликтует с Operator OpenTelemetry v2. Поэтому он остается запущенным во время миграции, чтобы устаревший Jaeger продолжал обслуживать исторические данные трассировки.

    Окна недоступности при миграции

    Сбор трассировки прерывается в двух местах:

    1. Во время миграции OpenTelemetry v1 → v2, в промежутке между удалением устаревшего OpenTelemetryCollector и моментом, когда OpenTelemetryCollector v2 становится готов. См. Окно недоступности при миграции в руководстве по миграции OpenTelemetry v2.

    2. Во время переключения Jaeger, когда Collector v2 получает патч для перенаправления trace exporter с устаревшего Jaeger на новый backend Jaeger v2. Развертывание Collector выполняется заново, поэтому во время rollout возможен короткий разрыв в сборе данных.

    Поды приложений продолжают работать в штатном режиме на протяжении обоих окон, но телеметрия, сгенерированная в эти промежутки, может временно буферизоваться и быть потеряна, если ее не удастся экспортировать вовремя. Планируйте каждый этап на период низкой нагрузки и заранее уведомляйте потребителей телеметрии (разработчиков, SRE, пользователей Kiali).

    Путь запроса к устаревшему Jaeger остается доступным на протяжении всей миграции, поэтому ранее сохраненные трассы можно по-прежнему искать в старом Jaeger UI, пока поднимается новый pipeline.

    Схема миграции в общих чертах

    [Stage 1] Migrate Alauda Build of OpenTelemetry to v2 (per external guide)
                  ↓ v2 Collector keeps writing traces to the legacy Jaeger
    [Step 1]  Deploy the new Jaeger v2 instance (jaeger-system)
    [Step 2]  Switch the v2 OpenTelemetry Collector to write to the new Jaeger
                  ↓ trace ingestion cutover; new traces go to the new Jaeger
    [Step 3]  Verify the migration
    
    [Observation] ≤ 7 days — legacy Jaeger remains queryable for historical traces
    
    [Step 4]  Uninstall the legacy Jaeger instance and Operator
    [Step 5]  Disable the legacy feature switch and clean up legacy ES indices

    Стратегия непрерывности данных трассировки

    Если следовать рекомендациям Воссоздание ресурсов OpenTelemetryCollector во время миграции OpenTelemetry v2, Collector v2 развертывается в том же namespace и с тем же именем Service (otel-collector в cpaas-system), что и устаревший Collector. Приложения, которые экспортируют OTLP в otel-collector.cpaas-system, продолжают работать без каких-либо изменений конфигурации.

    После переключения Jaeger трассировочные данные строго разделяются по времени:

    • Трассы, поступившие до переключения, остаются только в устаревшем Jaeger. Их можно запрашивать через устаревший Jaeger UI по адресу <platform-url>/clusters/<cluster>/acp/jaeger до тех пор, пока устаревший jaeger-es-index-cleaner их хранит — по умолчанию 7 дней с даты создания индекса.
    • Трассы, поступившие после переключения, записываются только в новый backend Jaeger v2. Их можно запрашивать через новый Jaeger UI по адресу <platform-url>/clusters/<cluster>/jaeger.

    Экземпляр устаревшего Jaeger и его Operator намеренно остаются запущенными в течение периода наблюдения, чтобы пользователи могли продолжать искать недавние исторические трассы через старый UI. После полного истечения срока хранения устаревших данных (≥ 7 дней) устаревший стек удаляется в разделе Очистка.

    NOTE

    Заранее сообщите пользователям о таком разделении: в новом Jaeger UI нет трасс, созданных до переключения. В течение периода наблюдения пользователи, ищущие трассу, начавшуюся до переключения, должны обращаться к устаревшему Jaeger UI.

    TIP

    Некоторые команды предпочитают в период наблюдения отправлять каждый span одновременно в новый Jaeger и в устаревший Jaeger, чтобы трассы после переключения отображались в обоих UI. Это полезно для параллельной проверки, постепенного переключения UI между командами или более быстрого пути отката на месте. Такой подход примерно вдвое увеличивает нагрузку на запись в Elasticsearch и объем хранилища в период наблюдения, а также добавляет дополнительный шаг очистки. См. (Необязательно) Включение двойного экспорта в устаревший Jaeger.

    Двойной экспорт не выполняет backfill трасс, созданных до переключения, в новый Jaeger; трассы до переключения по-прежнему доступны только через устаревший Jaeger UI.

    Предварительные требования

    • Активная сессия ACP CLI (kubectl) у администратора кластера с ролью cluster-admin.
    • В данный момент установлен устаревший стек ACP Tracing (Alauda Build of Jaeger Operator с экземпляром Jaeger и Alauda Build of OpenTelemetry с OpenTelemetryCollector и одним или несколькими ресурсами Instrumentation).
    • Elasticsearch 8.x доступен из кластера, и у вас есть пользователь Elasticsearch с правами на создание политик ILM, шаблонов индексов и alias индексов.
    • На рабочей станции, с которой выполняются команды миграции, установлены утилиты командной строки jq и envsubst.
    • Потребители телеметрии (разработчики, пользователи Kiali, SRE dashboards) и владельцы приложений уведомлены о запланированных окнах недоступности.

    Подготовительные задачи

    Миграция Alauda Build of OpenTelemetry на v2

    Перед миграцией backend Jaeger завершите миграцию с Alauda Build of OpenTelemetry на Alauda Build of OpenTelemetry v2, следуя инструкции Миграция с Alauda Build of OpenTelemetry на Alauda Build of OpenTelemetry v2. В этом руководстве рассматриваются:

    • Создание резервной копии и удаление устаревших Operator Alauda Build of OpenTelemetry и его ресурсов OpenTelemetryCollector и Instrumentation.
    • Установка Operator v2.
    • Подготовка образа для автоматической Java-инструментации и воссоздание ресурсов OpenTelemetryCollector и Instrumentation, включая задание теперь обязательного поля spec.java.image.
    • Пересборка подов приложений так, чтобы внедрялся новый агент Java.

    В конце этого этапа:

    • Установлен Operator Alauda Build of OpenTelemetry v2, а устаревший Operator удален.
    • OpenTelemetryCollector v2 в cpaas-system запущен, но его trace exporter по-прежнему указывает на устаревший Jaeger (что является естественным результатом воссоздания Collector на основе резервной копии v1).
    • Во всех ресурсах Instrumentation задано поле spec.java.image, а поды приложений пересобраны с агентом Java v2.

    Сбор трассировки продолжает поступать в устаревший Jaeger до выполнения шага Переключите Collector OpenTelemetry v2 на новый Jaeger в этом руководстве.

    Снимите инвентаризацию развертывания устаревшего Jaeger

    Зафиксируйте текущее состояние устаревшего Jaeger, чтобы понимать масштаб миграции и иметь возможность подготовить резервные копии для отката.

    1. Перечислите устаревшие экземпляры Alauda Build of Jaeger Operator и Jaeger:

      kubectl get csv -A | grep -i jaeger
      kubectl get jaeger -A
    2. Запишите endpoint Elasticsearch, учетные данные и префикс индекса, указанные в устаревшем ресурсе Jaeger. Они также будут повторно использованы новым экземпляром Jaeger v2.

    Создайте резервную копию ресурсов устаревшего Jaeger

    Экспортируйте ресурсы устаревшего Jaeger, чтобы затем можно было восстановить их заново (и при необходимости выполнить откат):

    mkdir -p ./acp-tracing-backup
    
    # Jaeger CR (covers the jaeger-prod instance in cpaas-system).
    kubectl get jaeger -A -o yaml \
      > ./acp-tracing-backup/jaegers.yaml
    
    # Alauda Build of Jaeger Operator Subscription and CSV.
    kubectl get subscription -n jaeger-operator jaeger-operator -o yaml \
      > ./acp-tracing-backup/jaeger-v1-subscription.yaml || true
    kubectl -n jaeger-operator get csv -o yaml \
      > ./acp-tracing-backup/jaeger-v1-csv.yaml || true
    
    # Supporting resources for jaeger-prod in cpaas-system. Each is removed in
    # Cleanup, so back them up here so rollback can restore them. Skip silently
    # (|| true) if a resource is not present in this environment.
    kubectl -n cpaas-system get ingress     jaeger-prod-query         -o yaml \
      > ./acp-tracing-backup/jaeger-prod-ingress.yaml             || true
    kubectl -n cpaas-system get podmonitor  jaeger-prod-monitor       -o yaml \
      > ./acp-tracing-backup/jaeger-prod-podmonitor.yaml          || true
    kubectl -n cpaas-system get rolebinding jaeger-prod-rb            -o yaml \
      > ./acp-tracing-backup/jaeger-prod-rolebinding.yaml         || true
    kubectl -n cpaas-system get role        jaeger-prod-role          -o yaml \
      > ./acp-tracing-backup/jaeger-prod-role.yaml                || true
    kubectl -n cpaas-system get sa          jaeger-prod-sa            -o yaml \
      > ./acp-tracing-backup/jaeger-prod-sa.yaml                  || true
    kubectl -n cpaas-system get secret      jaeger-prod-oauth2-proxy  -o yaml \
      > ./acp-tracing-backup/jaeger-prod-oauth2-proxy-secret.yaml || true
    kubectl -n cpaas-system get secret      jaeger-prod-es-basic-auth -o yaml \
      > ./acp-tracing-backup/jaeger-prod-es-basic-auth-secret.yaml || true
    kubectl -n cpaas-system get configmap   jaeger-prod-oauth2-proxy  -o yaml \
      > ./acp-tracing-backup/jaeger-prod-oauth2-proxy-configmap.yaml || true
    NOTE

    Файлы резервной копии используются только как конфигурационные ориентиры и артефакты для отката. При восстановлении Jaeger на v2 следуйте соглашениям v2, описанным в Установка Alauda Distributed Tracing.

    Проверьте емкость Elasticsearch

    Новый Jaeger записывает данные в отдельное семейство индексов (acp-<cluster>-jaeger-*), а устаревшие индексы (acp-tracing-<cluster>-jaeger-*) постепенно исчезают по мере истечения периода хранения устаревших данных. Запланируйте дополнительный объем хранилища в Elasticsearch, равный одному полному периоду хранения трасс. Если вы включаете (Необязательно) Включение двойного экспорта в устаревший Jaeger, планируйте примерно удвоенный объем постоянного хранилища на время периода наблюдения.

    Порядок миграции

    Разверните новый экземпляр Jaeger v2

    Следуйте разделу Развертывание Alauda Build of Jaeger v2 в руководстве по установке Alauda Distributed Tracing. Новый экземпляр Jaeger v2 развертывается в выделенном namespace (jaeger-system по умолчанию), чтобы не конфликтовать с устаревшим экземпляром jaeger-prod в cpaas-system.

    WARNING

    Следуйте только разделу Deploying the Alauda Build of Jaeger v2, на который дана ссылка выше. Не выполняйте раздел Deploying the OpenTelemetry Collector из того же руководства по установке — ориентированный на приложения Collector OpenTelemetry v2 уже был развернут в cpaas-system на этапе Этап 1 (миграция OpenTelemetry v2). Выполнение этого раздела создаст дублирующий Collector otel в jaeger-system, к которому ни одно приложение не обращается.

    Когда дойдете до шага настройки переменных, оставьте префикс индекса по умолчанию, чтобы новый Jaeger записывал данные в индексы, явно отделенные от устаревших:

    export JAEGER_NS="jaeger-system"
    export JAEGER_INSTANCE_NAME="jaeger"
    export JAEGER_ES_INDEX_PREFIX="acp-${CLUSTER_NAME}"      # different from the legacy "acp-tracing-${CLUSTER_NAME}"
    export JAEGER_BASEPATH="/clusters/${CLUSTER_NAME}/jaeger"  # different from the legacy "/clusters/${CLUSTER_NAME}/acp/jaeger"

    После завершения шагов установки убедитесь, что:

    • Pod Jaeger в jaeger-system находится в состоянии Ready.
    • Jaeger UI доступен по адресу <platform-url>/clusters/<cluster>/jaeger. На этом этапе он пуст, поскольку пока ни один exporter не записывает в него данные.
    • Service jaeger-collector.jaeger-system.svc.cluster.local принимает OTLP gRPC на порту 4317 — это endpoint, в который Collector OpenTelemetry v2 будет экспортировать данные на следующем шаге.

    Переключите Collector OpenTelemetry v2 на новый Jaeger

    После миграции OpenTelemetry v1 → v2 воссозданный OpenTelemetryCollector otel в cpaas-system по-прежнему пишет трассы в устаревший Jaeger, поскольку его trace exporter был унаследован из резервной копии v1. Часть spec.config, относящаяся к трассировке, обычно выглядит так (другие поля не относятся к этому шагу и опущены):

    otel collector — post-OpenTelemetry-migration state
    spec:
      config:
        exporters:
          debug: {}
          otlp:
            balancer_name: round_robin
            endpoint: dns:///jaeger-prod-collector-headless.cpaas-system:4317
            tls:
              insecure: true
        service:
          pipelines:
            traces:
              receivers:  [otlp]
              processors: [memory_limiter, batch]
              exporters:  [debug, otlp] 
    1. Exporter для устаревшего Jaeger — унаследованный из резервной копии v1 — называется otlp и направлен на headless Service коллектора устаревшего Jaeger в cpaas-system. balancer_name: round_robin распределяет spans между endpoints headless Service.
    2. Pipeline трассировки отправляет spans в debug (логи) и otlp (устаревший Jaeger).

    Примените патч к Collector, чтобы (1) добавить новый exporter otlp/jaeger-v2, указывающий на Service коллектора нового Jaeger v2 в jaeger-system, (2) удалить устаревший exporter otlp, установив для него значение null, и (3) заменить список exporter в pipeline трассировки на [debug, otlp/jaeger-v2]:

    kubectl -n cpaas-system patch opentelemetrycollector otel --type=merge -p '
    spec:
      config:
        exporters:
          otlp/jaeger-v2:
            endpoint: jaeger-collector.jaeger-system.svc.cluster.local:4317
            tls:
              insecure: true
          otlp: null
        service:
          pipelines:
            traces:
              exporters: [debug, otlp/jaeger-v2]
    '
    kubectl rollout status deployment/otel-collector -n cpaas-system --timeout=180s
    WARNING

    service.pipelines.traces.exporters — это массив, а merge patch заменяет массивы целиком, а не дополняет их. Приведенный выше патч перечисляет все exporter, которые должны остаться в pipeline трассировки (debug, otlp/jaeger-v2). Если pipeline трассировки содержит дополнительные пользовательские exporter, добавьте их в этот список перед применением патча.

    Если унаследованный exporter для устаревшего Jaeger в вашем Collector называется не otlp (например, ваша резервная копия v1 использовала jaeger или другой вариант OTLP), укажите это имя в шаге удаления через null соответствующим образом.

    TIP

    Новый exporter называется otlp/jaeger-v2, а не повторно использует имя otlp, чтобы при необходимости позже можно было также писать в устаревший Jaeger в период наблюдения и добавить дополнительный exporter симметрично как otlp/jaeger-v1. См. (Необязательно) Включение двойного экспорта в устаревший Jaeger.

    Сбор трассировки на этом этапе восстанавливается. Новые трассы записываются в новый backend Jaeger v2 и становятся доступными для поиска в новом Jaeger UI.

    Проверьте миграцию

    1. Убедитесь, что оба ресурса OpenTelemetryCollector находятся в рабочем состоянии:

      kubectl get opentelemetrycollector -A

      Пример вывода:

      NAMESPACE       NAME     MODE         VERSION   READY   AGE   IMAGE                                                           MANAGEMENT
      cpaas-system    otel     deployment   0.147.0   1/1     5h    build-harbor.alauda.cn/asm/opentelemetry-collector:0.147.0-r0   managed
      jaeger-system   jaeger   deployment   0.147.0   1/1     33m   build-harbor.alauda.cn/asm/jaeger:2.16.0-r2                     managed

      И cpaas-system/otel (ориентированный на приложения Collector, повторно развернутый в ходе миграции OpenTelemetry v1 → v2), и jaeger-system/jaeger (новый backend Jaeger v2, развернутый в разделе Разверните новый экземпляр Jaeger v2) должны иметь READY в формате <ready>/<desired>, где <ready> равно <desired> (обычно 1/1), а MANAGEMENTmanaged. Если в столбце READY указано 0/1 или он пустой, прежде чем продолжить, проверьте журналы pod Collector в соответствующем namespace.

    2. Сгенерируйте тестовые трассы с помощью telemetrygen и убедитесь, что они отображаются в новом Jaeger UI:

      kubectl apply -n cpaas-system -f - <<EOF
      apiVersion: v1
      kind: Pod
      metadata:
        name: jaeger-migration-check
      spec:
        restartPolicy: Never
        containers:
          - name: telemetrygen
            image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:latest
            args:
              - traces
              - --otlp-endpoint=otel-collector.cpaas-system.svc.cluster.local:4317
              - --otlp-insecure
              - --duration=120s
              - --service=jaeger-migration-check
              - --rate=2
      EOF
      
      kubectl wait -n cpaas-system --for=jsonpath='{.status.phase}'=Succeeded \
        pod/jaeger-migration-check --timeout=10m
      kubectl delete -n cpaas-system pod/jaeger-migration-check

      В новом Jaeger UI по адресу <platform-url>/clusters/<cluster>/jaeger должен отображаться сервис jaeger-migration-check и его трассы.

    3. Убедитесь, что в Elasticsearch создается новое семейство индексов и что устаревшее семейство индексов остается неизменным:

      curl -k -sS -u "${ES_USER}:${ES_PASS}" "${ES_ENDPOINT}/_cat/indices?v" \
        | grep -E 'acp-tracing-|acp-' | sort

      Вы должны увидеть устаревшие индексы, соответствующие acp-tracing-<cluster>-jaeger-* (с датой в имени, больше не растут), и новые индексы, соответствующие acp-<cluster>-jaeger-*-000001 (rollover, растут).

    4. Выполните выборочную проверку, что реальный бизнес-запрос создает трассу в новом Jaeger UI. Выберите одно или два уже инструментированных приложения, отправьте репрезентативный запрос и найдите его traceID в новом Jaeger UI.

    Период наблюдения

    Оставьте устаревший Jaeger запущенным как минимум на 7 дней после переключения, что соответствует периоду хранения esIndexCleaner.numberOfDays у устаревшей системы. В течение этого окна:

    • Устаревший Jaeger UI продолжает обслуживать любые трассы до переключения, которые еще не были удалены устаревшим jaeger-es-index-cleaner. Cleaner удаляет каждый индекс примерно через ~7 дней после даты создания; когда все индексы до переключения будут очищены, в устаревшем Jaeger не останется полезных данных, и его можно будет удалить.
    • Новый Jaeger накапливает трассы, созданные после переключения. Проверяйте dashboards, alerts и интеграции Kiali с новым Jaeger UI и именами метрик нового агента Java v2.
    • Четко объясните пользователям разделение: сообщите, что новый Jaeger UI показывает трассы начиная с момента переключения, а более старые трассы остаются в устаревшем Jaeger UI.

    Если трассы до переключения не представляют ценности для бизнеса, вы можете сократить или пропустить период наблюдения и сразу перейти к Очистка; компромисс состоит в том, что любые трассы, созданные до переключения, станут недоступны сразу после удаления устаревшего стека.

    WARNING

    После удаления устаревшего экземпляра Jaeger в разделе Удалите устаревший экземпляр Jaeger трассы до переключения больше нельзя будет восстановить. Прежде чем продолжить, убедитесь, что на них больше никто не полагается.

    Очистка

    Удалите устаревший экземпляр Jaeger

    TIP

    Если вы выбрали (Необязательно) Включение двойного экспорта в устаревший Jaeger, сначала удалите устаревший exporter из pipeline Collector v2, как описано в разделе Остановите двойной экспорт. Service коллектора устаревшего Jaeger должен существовать до тех пор, пока на него ссылается Collector v2; иначе exporter OTLP будет накапливать ошибки подключения, пока Collector не будет обновлен патчем.

    Удалите устаревший экземпляр Jaeger и связанные с ним ресурсы:

    kubectl -n cpaas-system delete ingress      jaeger-prod-query         --ignore-not-found
    kubectl -n cpaas-system delete podmonitor   jaeger-prod-monitor       --ignore-not-found
    kubectl -n cpaas-system delete jaeger       jaeger-prod               --ignore-not-found
    kubectl -n cpaas-system delete rolebinding  jaeger-prod-rb            --ignore-not-found
    kubectl -n cpaas-system delete role         jaeger-prod-role          --ignore-not-found
    kubectl -n cpaas-system delete sa           jaeger-prod-sa            --ignore-not-found
    kubectl -n cpaas-system delete secret       jaeger-prod-oauth2-proxy  --ignore-not-found
    kubectl -n cpaas-system delete secret       jaeger-prod-es-basic-auth --ignore-not-found
    kubectl -n cpaas-system delete configmap    jaeger-prod-oauth2-proxy  --ignore-not-found

    Удалите Alauda Build of Jaeger Operator:

    kubectl -n jaeger-operator delete subscription jaeger-operator --ignore-not-found
    TIP

    CRD jaegers.jaegertracing.io также можно удалить, если в кластере не осталось других ресурсов Jaeger:

    kubectl get jaeger -A
    kubectl delete crd jaegers.jaegertracing.io

    Отключите устаревший feature switch и очистите устаревшие индексы

    1. В веб-консоли ACP откройте Feature Switch и отключите acp-tracing-ui. Настраиваемый платформой вид Observability → Tracing больше не работает после удаления устаревшего Operator Alauda Build of OpenTelemetry v1. Обновите внутреннюю документацию и runbook, указав URL Jaeger UI <platform-url>/clusters/<cluster>/jaeger.

    2. Устаревший CronJob jaeger-es-index-cleaner был удален вместе с устаревшим экземпляром Jaeger, поэтому оставшиеся в Elasticsearch индексы acp-tracing-<cluster>-jaeger-* больше не ротируются автоматически. Удалите их вручную:

      # The legacy index prefix is "acp-tracing-${CLUSTER_NAME}" by default, 
      # but if your legacy Jaeger used a custom prefix, substitute it in the pattern below.
      JAEGER_ES_INDEX_PREFIX="acp-tracing-${CLUSTER_NAME}"
      # Inspect first. _cat/indices/<pattern>?v restricts the table to indices
      # matching the legacy prefix.
      curl -k -sS -u "${ES_USER}:${ES_PASS}" \
        "${ES_ENDPOINT}/_cat/indices/${JAEGER_ES_INDEX_PREFIX}-jaeger-*?v"
      # Delete after confirming. ?h=index returns just the index-name column
      # (no table header), which the for-loop iterates over.
      for idx in $(curl -k -sS -u "${ES_USER}:${ES_PASS}" \
                     "${ES_ENDPOINT}/_cat/indices/${JAEGER_ES_INDEX_PREFIX}-jaeger-*?h=index"); do
        curl -k -sS -u "${ES_USER}:${ES_PASS}" -X DELETE "${ES_ENDPOINT}/${idx}"
        echo
      done

    (Необязательно) Включение двойного экспорта в устаревший Jaeger

    Настройка Collector OpenTelemetry v2 на запись каждого span одновременно в новый Jaeger и в устаревший Jaeger — это альтернативный, включаемый вручную вариант вместо стандартного конвейера с одиночным экспортом. Рассмотрите его, если применимо одно из следующих условий:

    • Параллельная проверка. Вы хотите сравнить новый Jaeger с устаревшим Jaeger на боевом трафике в период наблюдения, прежде чем полностью полагаться на новый backend.
    • Более быстрый откат на месте. Если в период наблюдения у нового Jaeger обнаружатся проблемы, вы можете одним патчем убрать otlp/jaeger-v2 из pipeline трассировки, и устаревший Jaeger продолжит получать трассы без перерыва.
    • Постепенное переключение UI. Разные команды планируют переход с устаревшего UI на новый UI по собственным графикам, и вам нужно, чтобы оба UI отображали данные после переключения в переходный период.

    Компромиссы:

    • Нагрузка на запись в Elasticsearch и использование хранилища примерно удваиваются в период наблюдения, поскольку каждый span индексируется в обоих семействах индексов.
    • Перед удалением устаревшего Jaeger pipeline трассировки нужно будет вернуть дополнительным патчем в разделе Остановите двойной экспорт.
    • Необходимо отслеживать сбои в двух export pipeline (otelcol_exporter_send_failed_spans_total и для otlp/jaeger-v2, и для otlp/jaeger-v1).

    Двойной экспорт не выполняет backfill трасс до переключения в новый Jaeger; трассы до переключения по-прежнему доступны только через устаревший Jaeger UI.

    Включите двойной экспорт

    После того как Переключите Collector OpenTelemetry v2 на новый Jaeger завершился, Collector otel имеет otlp/jaeger-v2 как единственный trace exporter, записывающий в backend Jaeger (pipeline трассировки — [debug, otlp/jaeger-v2]). Примените патч к Collector, чтобы снова добавить устаревший Jaeger как второй exporter otlp/jaeger-v1, повторяя endpoint устаревшего Jaeger, балансировку нагрузки headless Service и TLS-настройки исходного exporter otlp, удаленного на шаге переключения:

    kubectl -n cpaas-system patch opentelemetrycollector otel --type=merge -p '
    spec:
      config:
        exporters:
          otlp/jaeger-v1:
            endpoint: dns:///jaeger-prod-collector-headless.cpaas-system:4317
            balancer_name: round_robin
            tls:
              insecure: true
        service:
          pipelines:
            traces:
              exporters: [debug, otlp/jaeger-v2, otlp/jaeger-v1]
    '
    kubectl rollout status deployment/otel-collector -n cpaas-system --timeout=180s
    WARNING

    service.pipelines.traces.exporters — это массив, а merge patch заменяет массивы целиком, а не дополняет их. Приведенный выше патч перечисляет все exporter, которые должны остаться в pipeline трассировки (debug, otlp/jaeger-v2, otlp/jaeger-v1). Если pipeline трассировки содержит дополнительные пользовательские exporter, добавьте их в этот список перед применением патча.

    После применения патча каждый span записывается в оба backend Jaeger.

    Остановите двойной экспорт

    После периода наблюдения, перед Удалите устаревший экземпляр Jaeger, удалите устаревший exporter из pipeline трассировки:

    kubectl -n cpaas-system patch opentelemetrycollector otel --type=merge -p '
    spec:
      config:
        exporters:
          otlp/jaeger-v1: null
        service:
          pipelines:
            traces:
              exporters: [debug, otlp/jaeger-v2]
    '
    kubectl rollout status deployment/otel-collector -n cpaas-system --timeout=180s

    После этого патча Collector v2 записывает трассы только в новый Jaeger. Теперь можно перейти к Удалите устаревший экземпляр Jaeger.

    Откат

    Для отката этапа OpenTelemetry v1 → v2 см. раздел Откат в руководстве по миграции OpenTelemetry v2. Для этапа миграции Jaeger, описанного в этом документе, выберите путь отката, соответствующий текущей фазе:

    Достигнутая фазаРекомендуемый откат
    До Разверните новый экземпляр Jaeger v2Для этапа Jaeger никаких действий не требуется — устаревший Jaeger по-прежнему получает трассы, а новый Jaeger еще не развернут.
    После Разверните новый экземпляр Jaeger v2, но до Переключите Collector OpenTelemetry v2 на новый JaegerУдалите новый экземпляр Jaeger (kubectl -n jaeger-system delete opentelemetrycollector jaeger). Устаревший Jaeger остается без изменений и продолжает получать трассы.
    У нового Jaeger возникли проблемы в период наблюдения (стандартный одиночный экспорт)Примените патч к Collector v2, чтобы снова направить pipeline трассировки на коллектор устаревшего Jaeger (замените otlp/jaeger-v2 exporter на exporter, нацеленный на jaeger-prod-collector-headless.cpaas-system:4317). Устаревший Jaeger немедленно снова начинает получать трассы. Самый быстрый готовый путь — сначала включить двойной экспорт через Включите двойной экспорт; если этот путь уже использовался, достаточно просто убрать otlp/jaeger-v2.
    У нового Jaeger возникли проблемы в период наблюдения (включен двойной экспорт)Примените патч к Collector v2, чтобы убрать otlp/jaeger-v2 из pipeline трассировки. Устаревший Jaeger продолжает получать трассы, пока вы проводите расследование.
    У устаревшего Jaeger возникли проблемы в период наблюдения (включен двойной экспорт)Примените патч к Collector v2, чтобы убрать otlp/jaeger-v1 из pipeline трассировки. Это эквивалентно досрочному завершению двойного экспорта; трассы до переключения, более старые, чем срок хранения устаревших данных, не будут доступны в новом Jaeger.
    После периода наблюдения — полный откат к устаревшему стекуСначала снова направьте pipeline трассировки Collector v2 на устаревший Jaeger. Затем следуйте разделу Откат в руководстве по миграции OpenTelemetry v2 и снова пересоберите поды приложений, чтобы устаревший агент Java был внедрен повторно. Перед повторной установкой устаревшего Operator необходимо удалить новый экземпляр Jaeger v2 и Operator OpenTelemetry v2.

    FAQ

    Нужно ли приложениям обновлять свои OTLP endpoint?

    Нет. Если следовать рекомендации Воссоздание ресурсов OpenTelemetryCollector из руководства по миграции OpenTelemetry v2, Collector OpenTelemetry v2 разворачивается в том же namespace (cpaas-system), с тем же именем Service (otel-collector) и теми же портами (4317/4318). Нагрузки, которые отправляли данные в otel-collector.cpaas-system:4317, продолжают работать без каких-либо изменений.

    Покажет ли новый Jaeger UI трассы, созданные до переключения?

    Нет. Трассы до переключения хранятся только в устаревшем Jaeger и остаются доступными для запросов через устаревший Jaeger UI на протяжении окна хранения устаревших данных (по умолчанию 7 дней). Новый Jaeger UI начинает показывать трассы только с момента переключения. Сообщите об этом пользователям заранее и направляйте их к старому UI для старых трасс в течение периода наблюдения.

    Когда следует включать двойной экспорт?

    Для большинства миграций достаточно стандартного пути с одиночным экспортом. Включайте двойной экспорт ((Необязательно) Включение двойного экспорта в устаревший Jaeger) только если выполняется одно из следующих условий:

    • Вам нужно проверить новый Jaeger на боевом трафике до начала его использования.
    • Разные команды будут переходить с устаревшего UI на новый UI по независимым графикам, и вы хотите, чтобы оба UI показывали данные после переключения в переходный период.
    • Вам нужен максимально быстрый путь отката на месте в течение периода наблюдения.

    Имейте в виду, что двойной экспорт примерно удваивает нагрузку на запись в Elasticsearch и объем хранилища в период наблюдения, а также добавляет дополнительный шаг патча перед удалением устаревшего Jaeger.

    Могут ли устаревший и новый Jaeger использовать один и тот же индекс Elasticsearch?

    Нет. Устаревший Jaeger использует ежедневные индексы с датой в имени (acp-tracing-<cluster>-jaeger-span-YYYY-MM-DD), тогда как Jaeger v2 использует rollover alias (acp-<cluster>-jaeger-span-write / -read, построенные на *-000001, *-000002, …). Схемы и жизненный цикл управляются по-разному, поэтому эти два семейства индексов должны оставаться раздельными. Оставьте префиксы по умолчанию, показанные в разделе Разверните новый экземпляр Jaeger v2, чтобы избежать конфликтов.

    Сколько дополнительного хранилища Elasticsearch требуется в период наблюдения?

    При стандартном пути с одиночным экспортом новое семейство индексов растет с нуля, а устаревшее семейство постепенно уменьшается по мере истечения срока хранения; планируйте дополнительный объем хранилища для трасс, равный одному полному периоду хранения, как буфер steady state. При включенном двойном экспорте планируйте примерно удвоенный steady-state размер устаревшего семейства индексов на весь период наблюдения, плюс запас на повторы и всплески поступления данных.

    Можно ли включить Service Performance Monitoring (SPM) в рамках миграции?

    SPM — опция, которую можно включить в любое время после Проверьте миграцию. Следуйте инструкции (Необязательно) Включение Service Performance Monitoring (SPM), чтобы добавить connector spanmetrics в Collector OpenTelemetry v2 и настроить backend метрик в новом Jaeger.