Облачная платформаEvolution

Управление L7-трафиком: настройка по аргументам методом Blue-green и методом взвешенного Canary


С помощью этого руководства вы научитесь настраивать:

  • взвешенный канареечный релиз (Canary 80/20) для всех методов сразу. Вы сможете направить 80% запросов на стабильную версию приложения и 20% на новую для ее тестирования.

  • детерминированное A/B-тестирование (Blue-green) по строгому совпадению заголовка и query-параметра. Это поможет разделить трафик и отправлять, например, внутренних тестировщиков и участников бета-теста на новую версию приложения на основе строгой проверки метаданных (HTTP-заголовок X-Release-Stage: beta и query-параметр preview=true). При несовпадении условий пользователь будет использовать текущую стабильную версию.

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

Маршрутизация на уровне шлюза позволяет безопаснее выпускать изменения и не добавлять вспомогательный код в микросервисы.

Вы будете использовать следующие сервисы:

  • Evolution API Gateway для создания API-шлюзов и политик маршрутизации с авторизацией пользователей из сети общего пользования.

  • Artifact Registry для хранения, совместного использования и управления Docker-образами, Deb-пакетами, RPM-пакетами, Helm-чартами и файлами любого типа (generic).

  • Container Apps — сервис для запуска контейнерных приложений в облаке. Не требует знания Kubernetes и создания виртуальных машин.

  • GitVerse — система контроля версий.

Шаги:

  1. Создайте реестр в Artifact Registry и опубликуйте образ.

  2. Создайте контейнеры в Container Apps из одного образа.

  3. Создайте общие бэкенды в Evolution API Gateway.

  4. Создайте шлюз с Canary-разделением трафика.

  5. Добавьте для шлюза правило Blue-green.

  6. Проверьте работу распределения трафика.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Сгенерируйте персональные ключи доступа.

  3. Склонируйте себе репозиторий из GitVerse.

    Репозиторий в GitVerse публичный и содержит готовые файлы для сборки: main.py, requirements.txt и Dockerfile.

    git clone https://gitverse.ru/asignatov/apigw-traffic-split.git
    cd apigw-traffic-split

1. Создайте реестр в Artifact Registry и опубликуйте образ

  1. В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Контейнеры → Artifact Registry.

  2. Нажмите Создать реестр.

  3. Укажите название реестра.

    Название реестра станет частью URI реестра, который будет использоваться для аутентификации и работы с образами.

  4. Выберите Приватный тип доступа к реестру.

  5. Нажмите Создать.

  6. Пройдите аутентификацию, выполнив команду:

    docker login <registry_name>.cr.cloud.ru -u <key_id> -p <key_secret>

    Где:

    • <registry_name> — название реестра в Artifact Registry;

    • <key_id> — логин персонального ключа доступа (Key ID);

    • <key_secret> — пароль персонального ключа доступа (Key Secret).

  7. В локальном терминале выполните сборку и отправку образа. Будет собран один универсальный образ.

    docker build -t <registry_name>.cr.cloud.ru/<repository_name>:<tag> .
    docker push <registry_name>.cr.cloud.ru/<repository_name>:<tag>

    Где:

    • <registry_name> — название реестра в Artifact Registry;

    • <repository_name> — название будущего репозитория (соответствует названию загружаемого образа);

    • <tag> — тег образа.

2. Создайте контейнеры в Container Apps из одного образа

Создайте два контейнера из одного образа. Далее эти контейнеры будут использоваться в качестве бэкендов в Evolution API Gateway.

Для создания первого контейнера:

  1. В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Контейнеры → Container Apps → Container Services.

  2. Нажмите Создать.

  3. На вкладке Общие параметры заполните поля:

    • Название — укажите название контейнера.

      Например, backend-v1.

    • Название — выберите Artifact Registry.

    • URI образа — нажмите Выбрать образ и выберите реестр и образ, которые вы создали на предыдущем этапе.

    • Порт контейнера — укажите 8000.

  4. На вкладке Переменные добавьте две переменные:

    • Переменная APP_VERSION со значением v1.0-stable;

    • Переменная INSTANCE_NAME со значением primary-node.

  5. Нажмите Создать.

Создайте второй контейнер:

  1. На основной странице сервиса Container Apps в разделе Container Services нажмите Создать.

  2. На вкладке Общие параметры заполните поля:

    • Название — укажите название контейнера.

      Например, backend-v2.

    • Название — выберите Artifact Registry.

    • URI образа — нажмите Выбрать образ и выберите реестр и образ, которые вы создали на предыдущем этапе и использовали для создания первого контейнера.

    • Порт контейнера — укажите 8000.

  3. На вкладке Переменные добавьте две переменные:

    • Переменная APP_VERSION со значением v2.0-canary;

    • Переменная INSTANCE_NAME со значением canary-node.

  4. Нажмите Создать.

3. Создайте общие бэкенды в Evolution API Gateway

Создайте два бэкенда для каждого созданного контейнера.

Чтобы создать первый бэкенд:

  1. В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Разработка → API Gateway.

  2. Перейдите в раздел Общие бэкенды.

  3. Нажмите Создать бэкенд.

  4. Заполните поля:

    • Название бэкенда — укажите название.

      Например, App-Production.

    • Тип бэкенда — выберите Container Apps.

    • Адрес — выберите контейнер, созданный на предыдущем этапе.

      Например, backend-v1.

  5. Нажмите Создать.

Чтобы создать второй бэкенд:

  1. На основной странице сервиса API Gateway в разделе Общие бэкенды нажмите Создать бэкенд.

  2. Заполните поля:

    • Название бэкенда — укажите название.

      Например, App-Canary.

    • Тип бэкенда — выберите Container Apps.

    • Адрес — выберите контейнер, созданный на предыдущем этапе, но отличный от первого бэкенда.

      Например, backend-v2.

  3. Нажмите Создать.

4. Создайте шлюз с Canary-разделением трафика

  1. На основной странице сервиса API Gateway в разделе Шлюзы нажмите Создать шлюз.

  2. Укажите название шлюза.

    Например, gw-traffic-demo.

  3. Выберите шаблон шлюза Обратный прокси.

  4. Нажмите Продолжить.

  5. В поле URI для проксирования введите /api/v1/service.

  6. В поле Общий бэкенд выберите бэкенд, который создали ранее.

    Например, App-Production.

  7. Нажмите Продолжить.

  8. Нажмите Добавить политику.

  9. Выберите Разделение трафика.

  10. Перейдите на вкладку Canary.

  11. Убедитесь, что в поле Бэкенд по умолчанию указан App-Production.

  12. В поле Вес для бэкенда по умолчанию укажите 80.

  13. В блоке добавления условий в выпадающем списке выберите Бэкенд App-Canary и укажите вес 20.

  14. Нажмите Создать.

5. Добавьте для шлюза правило Blue-green

  1. Перейдите в шлюз, созданный на предыдущем этапе.

  2. На панели слева перейдите в раздел Правила.

  3. Нажмите Создать правило.

  4. В поле HTTP-метод выберите Все.

  5. В поле URI для проксирования введите /api/v1/feature.

  6. Нажмите Продолжить.

  7. Выберите Общий тип бэкенда.

  8. В поле Общий бэкенд выберите App-Production.

  9. Нажмите Продолжить.

  10. Нажмите Добавить политику.

  11. Выберите Разделение трафика.

  12. Перейдите на вкладку Blue-green.

  13. Заполните поля:

    • Тип — Заголовок;

    • Имя — X-Release-Stage;

    • Значение — beta;

    • Бэкенд — App-Canary.

  14. Нажмите Добавить параметр и заполните появившиеся поля:

    • Тип — Строка запроса;

    • Имя — preview;

    • Значение — true.

  15. Нажмите Создать.

6. Проверьте работу распределения трафика

Проверьте работу распределения трафика.

Чтобы проверить распределение методом Blue-green через GET-запрос, выполните команду:

curl -s -H "X-Release-Stage: beta" "https://<uuid>.apigw.cloud.ru/api/v1/feature?preview=true"

Где <uuid> — уникальный идентификатор шлюза.

Ожидаемый ответ при успешном распределении:

{
"version": "v2.0-canary",
"instance": "canary-node",
"method": "GET",
"matched_criteria": {
"header": "beta",
"query": "true"
},
"status": "operational"
}

Чтобы проверить распределение методом Blue-green через POST-запрос с телом JSON, выполните команду:

curl -s -X POST -H "Content-Type: application/json" -H "X-Release-Stage: beta" \
-d '{"action": "create_order", "user_id": 42}' \
"https://<uuid>.apigw.cloud.ru/api/v1/feature?preview=true"

Где <uuid> — уникальный идентификатор шлюза.

Ожидаемый ответ при успешном распределении:

{
"version": "v2.0-canary",
"instance": "canary-node",
"method": "POST",
"matched_criteria": {
"header": "beta",
"query": "true"
},
"received_payload": {
"action": "create_order",
"user_id": 42
},
"status": "created"
}

Чтобы проверить откат на бэкенд по умолчанию при отсутствии query-параметра, выполните команду:

curl -s -X POST -H "Content-Type: application/json" -H "X-Release-Stage: beta" \
-d '{"action": "create_order"}' \
"https://<uuid>.apigw.cloud.ru/api/v1/feature"

Где <uuid> — уникальный идентификатор шлюза.

Ожидаемый ответ при успехе:

{
"version": "v1.0-stable",
"instance": "primary-node",
"method": "POST",
"received_payload": {
"action": "create_order"
},
"status": "processed"
}

Чтобы проверить распределение трафика 80% на 20% методом Canary, выполните команду:


for i in {1..20}; do
curl -s -X POST -H "Content-Type: application/json" -d "{\"tx_id\": $i}" \
https://<uuid>.apigw.cloud.ru/api/v1/service | jq -r .version
done

Где <uuid> — уникальный идентификатор шлюза.

Результат

Вы научились:

  • создавать реестр;

  • создавать контейнеры;

  • создавать бэкенды;

  • создавать шлюзы;

  • настраивать распределение трафика методами Canary и Blue-green.