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

1. Введение

Обзор

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

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

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

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

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

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

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

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

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

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

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

После подключения к 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

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

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

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

Если вы предпочитаете развертывать облачные функции 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

Чтобы протестировать функцию, вы можете либо свернуть существующую конечную точку, чтобы увидеть темно-зеленый цвет в 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

Если вы предпочитаете развертывать облачные функции 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 -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Разделите трафик 50-50

Чтобы разделить трафик между редакциями темно-зеленого и коричневого цветов, вам необходимо найти идентификаторы редакций базовых сервисов 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

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

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

Если вы предпочитаете развертывать облачные функции 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

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

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

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

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

и теперь, когда вы посещаете или сворачиваете URL-адрес службы функции постепенного развертывания-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. Откаты

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

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

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

и теперь, когда ваш завиток или посетите конечную точку URL-адреса функции,

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 на уровне бесплатного пользования ), вы можете либо удалить функцию Cloud Run, либо удалить проект, созданный на шаге 2.

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

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

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