Миграция с Alauda Container Platform Tracing
В этом документе описывается, как выполнить миграцию существующего развертывания трассировки на основе устаревшего стека Alauda Container Platform (ACP) Tracing — Alauda Build of Jaeger (Jaeger 1.60.0) в сочетании с Alauda Build of OpenTelemetry — на Alauda Distributed Tracing на базе Jaeger v2 (2.16.0) в сочетании с Alauda Build of OpenTelemetry v2.
Миграция выполняется в два этапа:
-
Миграция стека 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. -
Миграция backend Jaeger. Разверните новый экземпляр
Jaeger v2рядом с устаревшим Jaeger, переключите trace exporter Collector v2 на новый backend и удалите устаревший Jaeger после истечения периода хранения устаревших данных.
После переключения новый трафик трассировки поступает в новый backend Jaeger v2, а устаревший Jaeger продолжает обслуживать ранее сохраненные трассы. После истечения периода хранения устаревших данных (по умолчанию 7 дней) устаревший стек удаляется.
Содержание
ОбзорЧто меняется между ACP Tracing и Alauda Distributed TracingОкна недоступности при миграцииСхема миграции в общих чертахСтратегия непрерывности данных трассировкиПредварительные требованияПодготовительные задачиМиграция 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) в разделе Что изменилось между v1 и v2 руководства по миграции OpenTelemetry v2.
Устаревший Operator Alauda Build of Jaeger управляет отдельным CRD (jaegertracing.io/v1.Jaeger) и не конфликтует с Operator OpenTelemetry v2. Поэтому он остается запущенным во время миграции, чтобы устаревший Jaeger продолжал обслуживать исторические данные трассировки.
Окна недоступности при миграции
Сбор трассировки прерывается в двух местах:
-
Во время миграции OpenTelemetry v1 → v2, в промежутке между удалением устаревшего
OpenTelemetryCollectorи моментом, когдаOpenTelemetryCollectorv2 становится готов. См. Окно недоступности при миграции в руководстве по миграции OpenTelemetry v2. -
Во время переключения Jaeger, когда Collector v2 получает патч для перенаправления trace exporter с устаревшего Jaeger на новый backend Jaeger v2. Развертывание Collector выполняется заново, поэтому во время rollout возможен короткий разрыв в сборе данных.
Поды приложений продолжают работать в штатном режиме на протяжении обоих окон, но телеметрия, сгенерированная в эти промежутки, может временно буферизоваться и быть потеряна, если ее не удастся экспортировать вовремя. Планируйте каждый этап на период низкой нагрузки и заранее уведомляйте потребителей телеметрии (разработчиков, SRE, пользователей Kiali).
Путь запроса к устаревшему Jaeger остается доступным на протяжении всей миграции, поэтому ранее сохраненные трассы можно по-прежнему искать в старом Jaeger UI, пока поднимается новый pipeline.
Схема миграции в общих чертах
Стратегия непрерывности данных трассировки
Если следовать рекомендациям Воссоздание ресурсов 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 дней) устаревший стек удаляется в разделе Очистка.
Заранее сообщите пользователям о таком разделении: в новом Jaeger UI нет трасс, созданных до переключения. В течение периода наблюдения пользователи, ищущие трассу, начавшуюся до переключения, должны обращаться к устаревшему Jaeger UI.
Некоторые команды предпочитают в период наблюдения отправлять каждый span одновременно в новый Jaeger и в устаревший Jaeger, чтобы трассы после переключения отображались в обоих UI. Это полезно для параллельной проверки, постепенного переключения UI между командами или более быстрого пути отката на месте. Такой подход примерно вдвое увеличивает нагрузку на запись в Elasticsearch и объем хранилища в период наблюдения, а также добавляет дополнительный шаг очистки. См. (Необязательно) Включение двойного экспорта в устаревший Jaeger.
Двойной экспорт не выполняет backfill трасс, созданных до переключения, в новый Jaeger; трассы до переключения по-прежнему доступны только через устаревший Jaeger UI.
Предварительные требования
- Активная сессия ACP CLI (
kubectl) у администратора кластера с рольюcluster-admin. - В данный момент установлен устаревший стек ACP Tracing (
Alauda Build of JaegerOperator с экземпляром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 OpenTelemetryv2, а устаревший Operator удален. OpenTelemetryCollectorv2 вcpaas-systemзапущен, но его trace exporter по-прежнему указывает на устаревший Jaeger (что является естественным результатом воссоздания Collector на основе резервной копии v1).- Во всех ресурсах
Instrumentationзадано полеspec.java.image, а поды приложений пересобраны с агентом Java v2.
Сбор трассировки продолжает поступать в устаревший Jaeger до выполнения шага Переключите Collector OpenTelemetry v2 на новый Jaeger в этом руководстве.
Снимите инвентаризацию развертывания устаревшего Jaeger
Зафиксируйте текущее состояние устаревшего Jaeger, чтобы понимать масштаб миграции и иметь возможность подготовить резервные копии для отката.
-
Перечислите устаревшие экземпляры
Alauda Build of JaegerOperator иJaeger: -
Запишите endpoint Elasticsearch, учетные данные и префикс индекса, указанные в устаревшем ресурсе
Jaeger. Они также будут повторно использованы новым экземпляром Jaeger v2.
Создайте резервную копию ресурсов устаревшего Jaeger
Экспортируйте ресурсы устаревшего Jaeger, чтобы затем можно было восстановить их заново (и при необходимости выполнить откат):
Файлы резервной копии используются только как конфигурационные ориентиры и артефакты для отката. При восстановлении 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.
Следуйте только разделу Deploying the Alauda Build of Jaeger v2, на который дана ссылка выше. Не выполняйте раздел Deploying the OpenTelemetry Collector из того же руководства по установке — ориентированный на приложения Collector OpenTelemetry v2 уже был развернут в cpaas-system на этапе Этап 1 (миграция OpenTelemetry v2). Выполнение этого раздела создаст дублирующий Collector otel в jaeger-system, к которому ни одно приложение не обращается.
Когда дойдете до шага настройки переменных, оставьте префикс индекса по умолчанию, чтобы новый 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, относящаяся к трассировке, обычно выглядит так (другие поля не относятся к этому шагу и опущены):
- Exporter для устаревшего Jaeger — унаследованный из резервной копии v1 — называется
otlpи направлен на headless Service коллектора устаревшего Jaeger вcpaas-system.balancer_name: round_robinраспределяет spans между endpoints headless Service. - 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]:
service.pipelines.traces.exporters — это массив, а merge patch заменяет массивы целиком, а не дополняет их. Приведенный выше патч перечисляет все exporter, которые должны остаться в pipeline трассировки (debug, otlp/jaeger-v2). Если pipeline трассировки содержит дополнительные пользовательские exporter, добавьте их в этот список перед применением патча.
Если унаследованный exporter для устаревшего Jaeger в вашем Collector называется не otlp (например, ваша резервная копия v1 использовала jaeger или другой вариант OTLP), укажите это имя в шаге удаления через null соответствующим образом.
Новый exporter называется otlp/jaeger-v2, а не повторно использует имя otlp, чтобы при необходимости позже можно было также писать в устаревший Jaeger в период наблюдения и добавить дополнительный exporter симметрично как otlp/jaeger-v1. См. (Необязательно) Включение двойного экспорта в устаревший Jaeger.
Сбор трассировки на этом этапе восстанавливается. Новые трассы записываются в новый backend Jaeger v2 и становятся доступными для поиска в новом Jaeger UI.
Проверьте миграцию
-
Убедитесь, что оба ресурса
OpenTelemetryCollectorнаходятся в рабочем состоянии:Пример вывода:
И
cpaas-system/otel(ориентированный на приложения Collector, повторно развернутый в ходе миграции OpenTelemetry v1 → v2), иjaeger-system/jaeger(новый backend Jaeger v2, развернутый в разделе Разверните новый экземпляр Jaeger v2) должны иметьREADYв формате<ready>/<desired>, где<ready>равно<desired>(обычно1/1), аMANAGEMENT—managed. Если в столбцеREADYуказано0/1или он пустой, прежде чем продолжить, проверьте журналы pod Collector в соответствующем namespace. -
Сгенерируйте тестовые трассы с помощью
telemetrygenи убедитесь, что они отображаются в новом Jaeger UI:В новом Jaeger UI по адресу
<platform-url>/clusters/<cluster>/jaegerдолжен отображаться сервисjaeger-migration-checkи его трассы. -
Убедитесь, что в Elasticsearch создается новое семейство индексов и что устаревшее семейство индексов остается неизменным:
Вы должны увидеть устаревшие индексы, соответствующие
acp-tracing-<cluster>-jaeger-*(с датой в имени, больше не растут), и новые индексы, соответствующиеacp-<cluster>-jaeger-*-000001(rollover, растут). -
Выполните выборочную проверку, что реальный бизнес-запрос создает трассу в новом 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.
Если трассы до переключения не представляют ценности для бизнеса, вы можете сократить или пропустить период наблюдения и сразу перейти к Очистка; компромисс состоит в том, что любые трассы, созданные до переключения, станут недоступны сразу после удаления устаревшего стека.
После удаления устаревшего экземпляра Jaeger в разделе Удалите устаревший экземпляр Jaeger трассы до переключения больше нельзя будет восстановить. Прежде чем продолжить, убедитесь, что на них больше никто не полагается.
Очистка
Удалите устаревший экземпляр Jaeger
Если вы выбрали (Необязательно) Включение двойного экспорта в устаревший Jaeger, сначала удалите устаревший exporter из pipeline Collector v2, как описано в разделе Остановите двойной экспорт. Service коллектора устаревшего Jaeger должен существовать до тех пор, пока на него ссылается Collector v2; иначе exporter OTLP будет накапливать ошибки подключения, пока Collector не будет обновлен патчем.
Удалите устаревший экземпляр Jaeger и связанные с ним ресурсы:
Удалите Alauda Build of Jaeger Operator:
CRD jaegers.jaegertracing.io также можно удалить, если в кластере не осталось других ресурсов Jaeger:
Отключите устаревший feature switch и очистите устаревшие индексы
-
В веб-консоли ACP откройте Feature Switch и отключите
acp-tracing-ui. Настраиваемый платформой вид Observability → Tracing больше не работает после удаления устаревшего Operator Alauda Build of OpenTelemetry v1. Обновите внутреннюю документацию и runbook, указав URL Jaeger UI<platform-url>/clusters/<cluster>/jaeger. -
Устаревший CronJob
jaeger-es-index-cleanerбыл удален вместе с устаревшим экземпляромJaeger, поэтому оставшиеся в Elasticsearch индексыacp-tracing-<cluster>-jaeger-*больше не ротируются автоматически. Удалите их вручную:
(Необязательно) Включение двойного экспорта в устаревший 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, удаленного на шаге переключения:
service.pipelines.traces.exporters — это массив, а merge patch заменяет массивы целиком, а не дополняет их. Приведенный выше патч перечисляет все exporter, которые должны остаться в pipeline трассировки (debug, otlp/jaeger-v2, otlp/jaeger-v1). Если pipeline трассировки содержит дополнительные пользовательские exporter, добавьте их в этот список перед применением патча.
После применения патча каждый span записывается в оба backend Jaeger.
Остановите двойной экспорт
После периода наблюдения, перед Удалите устаревший экземпляр Jaeger, удалите устаревший exporter из pipeline трассировки:
После этого патча Collector v2 записывает трассы только в новый Jaeger. Теперь можно перейти к Удалите устаревший экземпляр Jaeger.
Откат
Для отката этапа OpenTelemetry v1 → v2 см. раздел Откат в руководстве по миграции OpenTelemetry v2. Для этапа миграции Jaeger, описанного в этом документе, выберите путь отката, соответствующий текущей фазе:
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.