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

1. Wprowadzenie

Omówienie

Funkcje Cloud Run umożliwiają określenie, które wersje mają otrzymywać ruch, oraz procenty ruchu, które mają otrzymywać. Wersje umożliwiają przywrócenie poprzedniej wersji, stopniowe wdrażanie wersji i podział ruchu między wiele wersji.

Z tych ćwiczeń w Codelabs 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 co najmniej 2 wersje funkcji Cloud Run
  • Jak stopniowo wdrażać nową wersję
  • Jak przywrócić poprzednią wersję

2. Konfiguracja i wymagania

Wymagania wstępne

  • Jesteś zalogowany w konsoli Google Cloud.
  • Masz już wdrożoną funkcję Cloud Run. Możesz na przykład rozpocząć wdrażanie funkcji Cloud Run.

Aktywowanie Cloud Shell

  1. W konsoli Google Cloud kliknij Aktywuj Cloud Shelld1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni, na którym opisano, czym jest to środowisko. Jeśli taki ekran się wyświetlił, kliknij Dalej.

d95252b003979716.png

Uproszczenie i połączenie z Cloud Shell powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna zawiera wszystkie niezbędne narzędzia programistyczne. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość, jeśli nie wszystkie, zadań w tym ćwiczeniu można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
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. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Dzielenie ruchu

Z tego przykładu dowiesz się, jak utworzyć funkcję, która odczytuje zmienną środowiskową koloru i odpowiada przy użyciu nazwy wersji z wykorzystaniem danego koloru tła.

Ten Codelab używa node.js, ale możesz użyć dowolnego środowiska uruchomieniowego.

Ustawianie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, które będą używane podczas tego ćwiczenia z programowania.

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

Tworzenie funkcji

Najpierw utwórz katalog na kod źródłowy i cd w tym katalogu.

mkdir revisions-gcf-codelab && cd $_

Następnie utwórz plik package.json z podaną niżej treścią:

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

Następnie utwórz plik źródłowy index.js z tą 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 przeprowadzić wdrożenie 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 zawinąć istniejący punkt końcowy, aby zobaczyć kolor darkseagreen w kodzie HTML, lub skorzystać z przeglądarki, aby bezpośrednio dotrzeć do punktu końcowego 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 wprowadź drugą wersję z brązowym tłem.

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 przeprowadzić wdrożenie 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

Gdy teraz wykonasz curl do punktu końcowego, zobaczysz brązowy kolor tła.

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

Podziel ruch 50–50

Aby podzielić ruch na wersje niebieską i brązową, musisz znaleźć identyfikatory wersji docelowych usług Cloud Run. Możesz sprawdzić identyfikatory wersji, uruchamiając to polecenie:

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

Powinny pojawić się wyniki podobne do tych

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

Możesz podzielić ruch na 2 wersje po 50%, uruchamiając to polecenie:

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

Testowanie podziału ruchu

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

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

W połowie przypadków powinna być widoczna wersja ciemnozielona, a w drugiej – kolor jasnobrązowy. W danych wyjściowych zobaczysz również nazwę wersji, np.

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

4. Wdrożenia 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 wdróż 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 funkcję 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

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

Najpierw ustawmy bieżącą wersję beżową, aby otrzymywać 100% ruchu. Dzięki temu przyszłe wdrożenia funkcji w Cloud Functions nie będą otrzymywać żadnego ruchu. Domyślnie Cloud Functions przypisuje 100% ruchu do wersji z flagą latest. Gdy ręcznie określisz, że bieżąca wersja beżowa ma odbierać 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 tych z Traffic: 100% gradual-rollouts-gcf2-00001-yox

Teraz możesz wdrożyć nową wersję, która nie będzie otrzymywać żadnego ruchu. Zamiast wprowadzać jakiekolwiek 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 przeprowadzić wdrożenie 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 korzystała z funkcji stopniowej-rollouts-gcf

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

A teraz, gdy użyjesz curl do wywołania usługi

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

zobaczysz kolor beżowy, mimo że ostatnio wdrożona wersja była w kolorze lawendowym.

<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 zweryfikowałeś, że Twoja wersja została wdrożona i generuje 0% ruchu. Mimo że kontrola stanu się powiodła, chcesz sprawdzić, czy ta wersja używa koloru lawendy na tle.

Aby przetestować wersję lavender, możesz zastosować do niej tag. Dzięki tagowaniu możesz bezpośrednio przetestować nową wersję pod określonym adresem URL bez obsługi ruchu.

Najpierw uzyskaj adres URL obrazu dla tej wersji.

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

Teraz oznacz obraz powiązanym kolorem.

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

Dane wyjściowe będą wyglądać tak:

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

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

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

i zobaczyć w wynikach kolor lawendowy:

<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. Przykład poniżej pokazuje, jak przekierować 1% ruchu do lawendy.

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

Aby wysłać 50% ruchu do lavender, możesz użyć tego samego polecenia, ale z wartością 50%.

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

Powinna wyświetlić się lista ruchu odbieranego przez każdą wersję.

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

Aby całkowicie wdrożyć lawendowy, możesz ustawić wartość 100% dla lawendy, aby zastąpić beżowy.

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

a teraz, gdy otworzysz lub zwiniesz adres URL usługi funkcji stopniowej, gcf,

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

zobaczysz tylko kolor lawendowy.

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

5. Przywrócone

Załóżmy, że pojawiły się już opinie na temat UX, które wskazują, że klienci wolą odcień beżowego od lawendowego, a Ty musisz zmienić kolor z powrotem na beż.

Możesz przywrócić poprzednią wersję (beżową), uruchamiając to polecenie.

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

Gdy teraz użyjesz curl lub otworzysz punkt końcowy adresu URL funkcji,

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

zwracany jest 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 przywracaniu zmian znajdziesz w dokumentacji.

6. Gratulacje!

Gratulujemy ukończenia ćwiczenia.

Zalecamy zapoznanie się z dokumentacją dotyczącą wdrożeń, przywracania i migracji ruchu.

Omówione zagadnienia

  • Jak podzielić ruch między co najmniej 2 wersje funkcji Cloud Run
  • Jak stopniowo wdrażać nową wersję
  • Jak przywrócić poprzednią wersję

7. Czyszczenie danych

Aby uniknąć niezamierzonych opłat (na przykład jeśli ta funkcja w Cloud Run została nieumyślnie wywołana więcej razy niż miesięczny przydział wywołań funkcji w Cloud Functions na poziomie bezpłatnym), możesz usunąć funkcję Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć funkcję Cloud Run wdrożona na Cloud Run, otwórz Cloud Run w Cloud Console (https://console.cloud.google.com/functions/) i usuń funkcje utworzone w tym Codelab.

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

Jeśli chcesz 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 pakiecie SDK Cloud. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom gcloud projects list.