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

1. Введение

Обзор

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

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

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

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

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

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

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

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . d1264ca30785e435.png .

cb81e7c8e34bc8d.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

d95252b003979716.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

7833d5e1c5d18f54.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.

После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

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

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

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

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

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

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

Создайте функцию

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

mkdir revisions-gcf-codelab && cd $_

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

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Далее создайте исходный файл index.js со следующим содержимым:

const functions = require('@google-cloud/functions-framework');

const BG_COLOR = process.env.BG_COLOR;
const K_REVISION = process.env.K_REVISION;

functions.http('helloWorld', (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>');
});

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

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --set-env-vars BG_COLOR=$BG_COLOR

Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated \
  --set-env-vars BG_COLOR=$BG_COLOR

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

SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)')

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

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

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

# update the env var
BG_COLOR=tan

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:

# update the env var
BG_COLOR=tan

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

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

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

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

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

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

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

traffic-splitting-gcf-00003-qoq
traffic-splitting-gcf-00002-zag

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

gcloud run services update-traffic traffic-splitting-gcf \
  --region $REGION \
  --to-revisions <REVISION1>=50,<REVISION2>=50

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

Вы можете протестировать функцию, перейдя по её общедоступному URL-адресу (либо с помощью curl, либо непосредственно в браузере).

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL

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

<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>

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

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

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

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

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

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:

# update the env var
BG_COLOR=beige

# deploy the function
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

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

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

# get the revision name

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

# now set 100% traffic to that revision

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

Вы увидите вывод, похожий на Traffic: 100% gradual-rollouts-gcf2-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-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR \
  --tag $BG_COLOR

Теперь обновите переменную среды SERVICE_URL, чтобы использовать функцию gradual-rollouts-gcf.

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

и теперь, когда вы используете сервис для закручивания

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

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

<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>

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

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

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

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

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

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

gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated

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

The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app

Теперь вы можете напрямую использовать curl для этой версии.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>

и посмотрите на лавандовый цвет в результатах:

<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>

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

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

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

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

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

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

Traffic:
  50% gradual-rollouts-gcf-00001-hos
  50% gradual-rollouts-gcf-00004-mum
        lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app

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

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

И теперь, когда вы переходите по ссылке или используете команду curl для доступа к URL-адресу сервиса функций gradual-rollouts-gcf,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Вы увидите только лаванду.

<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>

5. Откаты

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

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

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

И теперь, когда вы используете curl или переходите по адресу конечной точки функции,

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Вы увидите, что бежевый цвет вернулся.

<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>

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

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

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

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

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

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

7. Уборка

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

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

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

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