Używanie wersji w funkcjach Cloud Run do podziału ruchu, wdrażania stopniowego i przywracania

1. Wprowadzenie

Przegląd

Funkcje Cloud Run umożliwiają określenie, które wersje powinny otrzymywać ruch, oraz procentów ruchu, które otrzymuje wersja. Wersje umożliwiają przywrócenie poprzedniej wersji, stopniowe wdrażanie nowej wersji i dzielenie ruchu między wiele wersji.

Z tego przewodnika dowiesz się, jak używać wersji do zarządzania ruchem do funkcji Cloud Run. Więcej informacji o wersjach znajdziesz w dokumentacji Cloud Run.

Czego się nauczysz

  • Jak podzielić ruch między 2 lub więcej wersji funkcji Cloud Run
  • Jak stopniowo wdrażać nową wersję
  • Jak przywrócić poprzednią wersję

2. Konfiguracja i wymagania

Wymagania wstępne

  • Jesteś zalogowany(-a) w konsoli Google Cloud.
  • Masz już wdrożoną funkcję Cloud Run. Na początek możesz na przykład wdrożyć funkcję Cloud Run.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Dzielenie ruchu

Ten przykład pokazuje, jak utworzyć funkcję, która odczytuje zmienną środowiskową koloru i odpowiada nazwą wersji, używając tego koloru tła.

W tym laboratorium używamy node.js, ale możesz użyć dowolnego środowiska wykonawczego.

Ustawianie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, których będziesz używać podczas naszych ćwiczeń z programowania.

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

Tworzenie funkcji

Najpierw utwórz katalog kodu źródłowego i przejdź do niego.

mkdir revisions-gcf-codelab && cd $_

Następnie utwórz plik package.json o tej treści:

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

Następnie utwórz plik źródłowy index.js o tej treści:

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>');
});

Aby wdrożyć funkcję Cloud Run bezpośrednio w Cloud Run, uruchom to polecenie:

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

Jeśli wolisz wdrożyć funkcję jako Cloud Functions 2 generacji, użyj tego polecenia:

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

Aby przetestować tę funkcję, możesz użyć polecenia curl w istniejącym punkcie końcowym, aby zobaczyć kolor darkseagreen w kodzie HTML, lub użyć przeglądarki, aby bezpośrednio otworzyć punkt końcowy i zobaczyć kolor tła.

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

Teraz wdróż drugą wersję z beżowym kolorem tła.

Aby wdrożyć funkcję Cloud Run bezpośrednio w Cloud Run, uruchom to polecenie:

# 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

Jeśli wolisz wdrożyć funkcję jako Cloud Functions 2 generacji, użyj tego polecenia:

# 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

Teraz, gdy użyjesz polecenia curl na punkcie końcowym, zobaczysz kolor tła w odcieniu opalenizny.

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

Podziel ruch po równo

Aby podzielić ruch między wersje w kolorach głębokiej zieleni morskiej i jasnobrązowym, musisz znaleźć identyfikatory wersji bazowych usług Cloud Run. Aby wyświetlić identyfikatory wersji, uruchom to polecenie:

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

Powinny pojawić się wyniki podobne do tych poniżej.

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

Aby podzielić ruch między 2 wersje w stosunku 50/50, uruchom to polecenie:

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

Testowanie podziału ruchu

Możesz przetestować funkcję, otwierając jej publiczny adres URL (za pomocą polecenia curl lub bezpośrednio w przeglądarce).

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

W połowie przypadków powinna się wyświetlać wersja w ciemnym kolorze morskim, a w pozostałych – w kolorze beżowym. W danych wyjściowych zobaczysz też nazwę wersji, np.

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

4. Wdrażanie stopniowe

Z tej sekcji dowiesz się, jak stopniowo wdrażać zmiany w nowej wersji funkcji w Cloud Functions. Więcej informacji o stopniowym wdrażaniu znajdziesz w dokumentacji.

Użyjesz tego samego kodu co w poprzedniej sekcji, ale wdrożysz go jako nową funkcję w Cloud Functions.

Najpierw ustaw kolor tła na beige i wdroż funkcję o nazwie gradual-rollouts-gcf.

Aby wdrożyć funkcję Cloud Run bezpośrednio w Cloud Run, uruchom to polecenie:

# 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

Jeśli wolisz wdrożyć funkcję jako Cloud Functions 2 generacji, użyj tego polecenia:

# 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

Załóżmy, że chcemy stopniowo wprowadzać nową wersję z kolorem tła lawendowym.

Najpierw ustawmy bieżącą wersję beżową, aby otrzymywała 100% ruchu. Dzięki temu przyszłe wdrożenia funkcji w Cloud Functions nie będą otrzymywać żadnego ruchu. Domyślnie Cloud Functions kieruje 100% ruchu do wersji z flagą latest. Jeśli ręcznie określisz, że bieżąca wersja w kolorze beżowym ma otrzymywać cały ruch, wersja z flagą latest nie będzie już otrzymywać 100% ruchu. Zobacz dokumentację.

# 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

Zobaczysz dane wyjściowe podobne do Traffic: 100% gradual-rollouts-gcf2-00001-yox

Teraz możesz wdrożyć nową wersję, która nie będzie otrzymywać ruchu. Zamiast wprowadzać zmiany w kodzie, możesz zaktualizować zmienną środowiskową BG_COLOR dla tej wersji.

Aby wdrożyć funkcję Cloud Run bezpośrednio w Cloud Run, uruchom to polecenie:

# 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

Jeśli wolisz wdrożyć funkcję jako Cloud Functions 2 generacji, użyj tego polecenia:

# 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

Teraz zaktualizuj zmienną środowiskową SERVICE_URL, aby używać funkcji gradual-rollouts-gcf.

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

a teraz, gdy wywołasz usługę za pomocą polecenia curl,

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

zobaczysz kolor beżowy, mimo że lawendowy był ostatnią wdrożoną wersją.

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

Testowanie wersji obsługującej 0% ruchu

Załóżmy, że udało Ci się potwierdzić, że Twoja wersja została wdrożona i obsługuje 0% ruchu. Mimo że wersja przeszła kontrole stanu, nadal chcesz sprawdzić, czy używa koloru tła lawendowego.

Aby przetestować wersję lawendową, możesz zastosować do niej tag. Tagowanie umożliwia bezpośrednie testowanie nowej wersji pod określonym adresem URL bez wysyłania do niej ruchu.

Najpierw uzyskaj adres URL obrazu dla tej wersji.

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

Teraz otaguj ten obraz powiązanym z nim kolorem.

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

Wyświetlą się dane wyjściowe podobne do tych:

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

Teraz możesz bezpośrednio pobrać tę wersję

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

i zobacz kolor lawendowy w wynikach:

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

Stopniowe zwiększanie ruchu

Teraz możesz zacząć wysyłać ruch do wersji lawendowej. Poniższy przykład pokazuje, jak wysłać 1% ruchu do koloru lawendowego.

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

Aby wysłać 50% ruchu do koloru lawendowego, możesz użyć tego samego polecenia, ale zamiast 10% podać 50%.

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

Powinna się wyświetlić lista z informacjami o tym, ile ruchu generuje każda wersja.

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

Gdy będziesz gotowy(-a) do pełnego wdrożenia koloru lawendowego, możesz ustawić go na 100%, aby zastąpić beżowy.

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

Teraz, gdy otworzysz lub wywołasz za pomocą polecenia curl adres URL usługi funkcji gradual-rollouts-gcf,

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

będziesz widzieć tylko lawendę.

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

5. Przywrócone

Załóżmy, że otrzymaliśmy wczesne opinie użytkowników, z których wynika, że wolą oni kolor beżowy od lawendowego, i musimy przywrócić kolor beżowy.

Możesz wycofać zmiany do poprzedniej wersji (beżowej), uruchamiając to polecenie.

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

Teraz, gdy użyjesz polecenia curl lub otworzysz punkt końcowy adresu URL funkcji,

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

zobaczysz kolor beżowy.

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

Więcej informacji o operacjach przywracania znajdziesz w dokumentacji.

6. Gratulacje!

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją dotyczącą wdrażania, wycofywania i migracji ruchu.

Omówione zagadnienia

  • Jak podzielić ruch między 2 lub więcej wersji funkcji Cloud Run
  • Jak stopniowo wdrażać nową wersję
  • Jak przywrócić poprzednią wersję

7. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli ta funkcja Cloud Run zostanie przypadkowo wywołana więcej razy niż miesięczny limit wywołań funkcji Cloud Functions w warstwie bezpłatnej), możesz usunąć funkcję Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć funkcję Cloud Run wdrożoną w Cloud Run, otwórz Cloud Run w konsoli Cloud na stronie https://console.cloud.google.com/functions/ i usuń funkcje utworzone w tym module.

Aby usunąć funkcje Cloud Run wdrożone jako funkcje 2 generacji, otwórz Cloud Functions w konsoli Cloud na stronie https://console.cloud.google.com/functions/ i usuń funkcje utworzone w tym module.

Jeśli zdecydujesz się usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.