Использование изменений в Cloud Run для разделения трафика, постепенного развертывания и отката

1. Введение

Обзор

Функция «Ревизии Cloud Run» позволяет указать, каким ревизиям следует направлять трафик и какой процент трафика следует отправлять каждой ревизии. Функция «Ревизии» позволяет откатываться к предыдущей ревизии, постепенно развертывать ревизию и распределять трафик между несколькими ревизиями.

В этом практическом руководстве показано, как использовать ревизии для управления трафиком к вашему сервису Cloud Run. Подробнее о ревизиях можно узнать в документации Cloud Run .

Что вы узнаете

  • Как распределить трафик между двумя или более версиями для сервиса Cloud Run
  • Как постепенно внедрять новую версию
  • Как откатиться к предыдущей версии

2. Настройка и требования

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

  • Вы вошли в облачную консоль.
  • Вы уже развернули службу Cloud Run. Например, вы можете начать работу, следуя инструкциям по развертыванию службы Cloud Run .

Установка переменных среды

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

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Создайте репозиторий реестра артефактов для службы.

gcloud artifacts repositories create $AR_REPO \
    --repository-format=docker \
    --location=$REGION \
    --description="codelab for finetuning using CR jobs" \
    --project=$PROJECT_ID

3. Разделение транспортных потоков

В этом примере показано, как создать службу Cloud Run, которая считывает переменную среды, указывающую цвет, и возвращает имя ревизии, используя этот цвет фона.

Хотя в этом практическом задании используется Python, вы можете использовать любую среду выполнения.

Установка переменных среды

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

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Создайте сервис

Сначала создайте директорию для исходного кода и перейдите в неё с помощью команды `cd`.

mkdir traffic-revisions-codelab && cd $_

Затем создайте файл main.py со следующим содержимым:

import os
from flask import Flask, render_template_string

app = Flask(__name__)

TEMPLATE = """
<!doctype html>
<html lang="en">
<head>
    <title>Cloud Run Traffic Revisions</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 50vh;
            background-color: {{ bg_color }}; /* Set by environment variable */
            font-family: sans-serif;
        }
        .content {
            background-color: rgba(255, 255, 255, 0.8); /* Semi-transparent white background */
            padding: 2em;
            border-radius: 8px;
            text-align: center;
            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div class="content">
        <p>background color: <strong>{{ color_name }}</strong></p>
    </div>
</body>
</html>
"""

@app.route('/')
def main():
    """Serves the main page with a background color from the ENV."""
    # Get the color from the 'BG_COLOR' environment variable.
    # Default to 'white' if the variable is not set.
    color = os.environ.get('BG_COLOR', 'white').lower()

    return render_template_string(TEMPLATE, bg_color=color, color_name=color)

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=True, host='0.0.0.0', port=port)

Далее создайте файл requirements.txt со следующим содержимым:

Flask>=2.0.0
gunicorn>=20.0.0

Наконец, создайте Dockerfile

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8080

ENV PYTHONPATH /app

CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]

Создайте образ в реестре артефактов, используя Buildpacks с помощью Cloud Build:

gcloud builds submit \
   --tag $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME

И разверните первую версию в Cloud Run, используя цвет darksegreen:

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars BG_COLOR=darkseagreen

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

Теперь разверните вторую версию с фоном бежевого цвета.

# update the env var
BG_COLOR=tan

gcloud run deploy $SERVICE_NAME \
    --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
    --region $REGION \
    --set-env-vars BG_COLOR=tan

Теперь, при обновлении страницы, вы увидите фон бежевого цвета.

Разделите трафик пополам (50/50).

Для разделения трафика между версиями Deep Sea Green и Tan необходимо найти идентификаторы версий базовых сервисов Cloud Run. Идентификаторы версий можно увидеть, выполнив следующую команду:

gcloud run revisions list --service $SERVICE_NAME \
  --region $REGION --format 'value(REVISION)'

Вы должны увидеть результаты, аналогичные приведенным ниже.

traffic-revisions-color-00003-qoq
traffic-revisions-color-00002-zag

Вы можете разделить трафик поровну между двумя версиями, выполнив следующую команду с указанием ваших версий:

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

Проверьте разделение трафика.

Вы можете проверить работу сервиса, обновив страницу в браузере.

В половине случаев вы увидите версию темно-зеленого цвета, а в другой половине — версию бежевого цвета. В выводе также будет указано название версии, например:

<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>

4. Постепенное внедрение

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

Вы будете использовать тот же код, что и в предыдущем разделе, но развернете его как новую службу Cloud Run.

Сначала установите цвет фона на beige и запустите функцию с именем gradual-rollouts-colors .

Чтобы развернуть функцию Cloud Run непосредственно в Cloud Run, выполните следующую команду:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Теперь предположим, что мы хотим постепенно внедрить новую версию с фоновым цветом лавандового цвета.

Для начала настроим текущую ревизию beige на получение 100% трафика. Это гарантирует, что ваши будущие ревизии не будут получать никакого трафика. По умолчанию Cloud Run устанавливает 100% трафика для ревизии с флагом latest . Если вручную указать, что текущая ревизия beige должна получать весь трафик, ревизия с флагом latest больше не будет получать 100% трафика. См. документацию .

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-colors \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

gcloud run services update-traffic gradual-rollouts-colors \
  --to-revisions=$BEIGE_REVISION=100 \
  --region $REGION

Вы увидите вывод, похожий на Traffic: 100% radual-rollouts-colors-00001-yox

Теперь вы можете развернуть новую версию, которая не будет получать никакого трафика. Вместо внесения каких-либо изменений в код, вы можете обновить переменную среды BG_COLOR для этой версии.

Чтобы развернуть функцию Cloud Run непосредственно в Cloud Run, выполните следующую команду:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud beta run deploy gradual-rollouts-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Теперь, когда вы зайдёте на сайт в своём браузере, вы увидите бежевый цвет, хотя лавандовый был последней обновлённой версией.

Тестирование версии, обслуживающей 0% трафика.

Предположим, вы убедились, что ваша версия успешно развернута и обрабатывает 0% трафика. Даже несмотря на то, что она прошла проверки работоспособности, вы все равно хотите убедиться, что в этой версии используется лавандовый цвет фона.

Чтобы протестировать обновленную версию Lavender, вы можете добавить к ней тег . Использование тегов позволяет напрямую протестировать новую версию по определенному URL-адресу, не направляя на нее трафик.

Сначала получите URL-адрес изображения для последней версии (это изображение лавандового цвета).

IMAGE_URL_LAVENDER=$(gcloud run services describe gradual-rollouts-colors --region $REGION --format 'value(IMAGE)')

А теперь отметьте это изображение соответствующим цветом.

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

Вы увидите результат, похожий на следующий:

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Теперь, когда вы перейдете по ссылке на конкретную версию, вы увидите лавандовый цвет.

Постепенно увеличивающийся трафик

Теперь вы можете начать направлять трафик на обновленную версию сайта. В приведенном ниже примере показано, как направить 1% трафика на обновленную версию.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=1

Чтобы направить 50% трафика на Lavender, можно использовать ту же команду, но указать 50%.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=50

Вы должны увидеть список того, какой объем трафика получает каждая версия.

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Когда вы будете готовы полностью использовать лавандовый цвет, вы можете установить его значение на 100% вместо бежевого.

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-tags lavender=100

А теперь, посетив сайт, вы увидите только лаванду.

5. Откаты

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

Вы можете откатиться к предыдущей версии (бежевой), выполнив следующую команду:

gcloud run services update-traffic gradual-rollouts-colors --region $REGION --to-revisions $BEIGE_REVISION=100

А теперь, когда вы посетите веб-сайт, вы увидите бежевый цвет в качестве фонового цвета.

Более подробную информацию об откатах можно найти в документации .

6. Поздравляем!

Поздравляем с завершением практического занятия!

Рекомендуем ознакомиться с документацией по развертыванию, откату и миграции трафика.

Что мы рассмотрели

  • Как распределить трафик между двумя или более версиями для сервиса Cloud Run
  • Как постепенно внедрять новую версию
  • Как откатиться к предыдущей версии

7. Уборка

Чтобы избежать непреднамеренных списаний средств (например, если эта функция Cloud Run будет случайно вызвана больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов Cloud Run в бесплатном тарифе ), вы можете либо удалить службу Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить службу Cloud Run, перейдите в Cloud Run в консоли Cloud по адресу https://console.cloud.google.com/run/ и удалите функции, созданные вами в этом практическом задании.

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .