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

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

О практической работе

subjectПоследнее обновление: апр. 5, 2025
account_circleАвтор: сотрудник Google

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

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

Сначала создайте каталог для исходного кода и перейдите в этот каталог.

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"]

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

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

И разверните первую ревизию в Cloud Run темно-зеленого цвета:

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

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

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

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

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

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

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

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

Во-первых, давайте установим текущую версию бежевого цвета, чтобы получать 100% трафика. Это гарантирует, что ваши будущие версии не получат никакого трафика. По умолчанию Cloud Run устанавливает 100% трафика для версии с latest флагом. Если вручную указать, что текущая версия бежевого цвета должна получать весь трафик, версия с 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 % трафика. Несмотря на то, что она прошла проверку работоспособности, вы все равно хотите убедиться, что в этой версии используется лавандовый цвет фона.

Чтобы протестировать лавандовую версию, вы можете применить к этой версии тег . Тегирование позволяет напрямую тестировать новую версию по определенному 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

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

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

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

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

Чтобы отправить 50% трафика в лаванду, вы можете использовать ту же команду, но вместо этого указать 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. Откаты

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

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

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 Console по адресу https://console.cloud.google.com/run/ и удалите функции, созданные в этой лаборатории кода.

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