С помощью этого руководства вы научитесь настраивать:
взвешенный канареечный релиз (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 — система контроля версий.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Склонируйте себе репозиторий из GitVerse.
Репозиторий в GitVerse публичный и содержит готовые файлы для сборки: main.py, requirements.txt и Dockerfile.
git clone https://gitverse.ru/asignatov/apigw-traffic-split.gitcd apigw-traffic-split
В личном кабинете на верхней панели слева нажмите и выберите Контейнеры → Artifact Registry.
Нажмите Создать реестр.
Укажите название реестра.
Название реестра станет частью URI реестра, который будет использоваться для аутентификации и работы с образами.
Выберите Приватный тип доступа к реестру.
Нажмите Создать.
Пройдите аутентификацию, выполнив команду:
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).
В локальном терминале выполните сборку и отправку образа. Будет собран один универсальный образ.
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> — тег образа.
Создайте два контейнера из одного образа. Далее эти контейнеры будут использоваться в качестве бэкендов в Evolution API Gateway.
Для создания первого контейнера:
В личном кабинете на верхней панели слева нажмите и выберите Контейнеры → Container Apps → Container Services.
Нажмите Создать.
На вкладке Общие параметры заполните поля:
Название — укажите название контейнера.
Например, backend-v1.
Название — выберите Artifact Registry.
URI образа — нажмите Выбрать образ и выберите реестр и образ, которые вы создали на предыдущем этапе.
Порт контейнера — укажите 8000.
На вкладке Переменные добавьте две переменные:
Переменная APP_VERSION со значением v1.0-stable;
Переменная INSTANCE_NAME со значением primary-node.
Нажмите Создать.
Создайте второй контейнер:
На основной странице сервиса Container Apps в разделе Container Services нажмите Создать.
На вкладке Общие параметры заполните поля:
Название — укажите название контейнера.
Например, backend-v2.
Название — выберите Artifact Registry.
URI образа — нажмите Выбрать образ и выберите реестр и образ, которые вы создали на предыдущем этапе и использовали для создания первого контейнера.
Порт контейнера — укажите 8000.
На вкладке Переменные добавьте две переменные:
Переменная APP_VERSION со значением v2.0-canary;
Переменная INSTANCE_NAME со значением canary-node.
Нажмите Создать.
Создайте два бэкенда для каждого созданного контейнера.
Чтобы создать первый бэкенд:
В личном кабинете на верхней панели слева нажмите и выберите Разработка → API Gateway.
Перейдите в раздел Общие бэкенды.
Нажмите Создать бэкенд.
Заполните поля:
Название бэкенда — укажите название.
Например, App-Production.
Тип бэкенда — выберите Container Apps.
Адрес — выберите контейнер, созданный на предыдущем этапе.
Например, backend-v1.
Нажмите Создать.
Чтобы создать второй бэкенд:
На основной странице сервиса API Gateway в разделе Общие бэкенды нажмите Создать бэкенд.
Заполните поля:
Название бэкенда — укажите название.
Например, App-Canary.
Тип бэкенда — выберите Container Apps.
Адрес — выберите контейнер, созданный на предыдущем этапе, но отличный от первого бэкенда.
Например, backend-v2.
Нажмите Создать.
На основной странице сервиса API Gateway в разделе Шлюзы нажмите Создать шлюз.
Укажите название шлюза.
Например, gw-traffic-demo.
Выберите шаблон шлюза Обратный прокси.
Нажмите Продолжить.
В поле URI для проксирования введите /api/v1/service.
В поле Общий бэкенд выберите бэкенд, который создали ранее.
Например, App-Production.
Нажмите Продолжить.
Нажмите Добавить политику.
Выберите Разделение трафика.
Перейдите на вкладку Canary.
Убедитесь, что в поле Бэкенд по умолчанию указан App-Production.
В поле Вес для бэкенда по умолчанию укажите 80.
В блоке добавления условий в выпадающем списке выберите Бэкенд App-Canary и укажите вес 20.
Нажмите Создать.
Перейдите в шлюз, созданный на предыдущем этапе.
На панели слева перейдите в раздел Правила.
Нажмите Создать правило.
В поле HTTP-метод выберите Все.
В поле URI для проксирования введите /api/v1/feature.
Нажмите Продолжить.
Выберите Общий тип бэкенда.
В поле Общий бэкенд выберите App-Production.
Нажмите Продолжить.
Нажмите Добавить политику.
Выберите Разделение трафика.
Перейдите на вкладку Blue-green.
Заполните поля:
Тип — Заголовок;
Имя — X-Release-Stage;
Значение — beta;
Бэкенд — App-Canary.
Нажмите Добавить параметр и заполните появившиеся поля:
Тип — Строка запроса;
Имя — preview;
Значение — true.
Нажмите Создать.
Проверьте работу распределения трафика.
Чтобы проверить распределение методом 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}; docurl -s -X POST -H "Content-Type: application/json" -d "{\"tx_id\": $i}" \https://<uuid>.apigw.cloud.ru/api/v1/service | jq -r .versiondone
Где <uuid> — уникальный идентификатор шлюза.
Вы научились:
создавать реестр;
создавать контейнеры;
создавать бэкенды;
создавать шлюзы;
настраивать распределение трафика методами Canary и Blue-green.