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

1. Wprowadzenie

Przegląd

Wersje Cloud Run umożliwiają określenie, które wersje mają otrzymywać ruch i jaki procent ruchu ma być do nich kierowany. Wersje umożliwiają przywrócenie poprzedniej wersji, stopniowe wdrażanie nowej wersji i dzielenie ruchu między wiele wersji.

W tym laboratorium dowiesz się, jak używać wersji do zarządzania ruchem w usłudze Cloud Run. Więcej informacji o wersjach znajdziesz w dokumentacji Cloud Run.

Czego się nauczysz

  • Jak podzielić ruch między co najmniej 2 wersje usługi 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.
  • Usługa Cloud Run została już wdrożona. Na początek możesz na przykład wdrożyć usługę Cloud Run.

Ustawianie zmiennych środowiskowych

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

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Tworzenie repozytorium Artifact Registry dla usługi

gcloud artifacts repositories create $AR_REPO \
    --repository-format=docker \
    --location=$REGION \
    --description="codelab for finetuning using CR jobs" \
    --project=$PROJECT_ID

3. Dzielenie ruchu

Ten przykład pokazuje, jak utworzyć usługę Cloud Run, która odczytuje zmienną środowiskową koloru i odpowiada nazwą wersji z tym kolorem tła.

W tym laboratorium używamy Pythona, 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
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Tworzenie usługi

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

mkdir traffic-revisions-codelab && cd $_

Następnie utwórz plik main.py o tej treści:

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)

Następnie utwórz plik requirements.txt o tej treści:

Flask>=2.0.0
gunicorn>=20.0.0

Na koniec utwórz 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"]

Utwórz obraz w Artifact Registry za pomocą pakietów kompilacji przy użyciu Cloud Build:

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

Następnie wdróż pierwszą wersję w Cloud Run w kolorze ciemnozielonym:

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

Aby przetestować usługę, możesz otworzyć punkt końcowy bezpośrednio w przeglądarce. Kolor tła powinien być ciemnozielony.

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

# 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

Teraz po odświeżeniu witryny zobaczysz tło w kolorze beżowym.

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 $SERVICE_NAME \
  --region $REGION --format 'value(REVISION)'

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

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

Aby podzielić ruch po równo między 2 wersje, uruchom to polecenie z wersjami:

gcloud run services update-traffic $SERVICE_NAME \
  --region $REGION \
  --to-revisions YOUR_REVISION_1=50,YOUR_REVISION_2=50

Testowanie podziału ruchu

Możesz przetestować usługę, odświeżając stronę w przeglądarce.

W połowie przypadków powinna wyświetlać się wersja w kolorze ciemnej zieleni morskiej, 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-revisions-color-00003-qoq</p></div></body></html>

4. Wdrażanie stopniowe

Z tej sekcji dowiesz się, jak stopniowo wdrażać zmiany w nowej wersji usługi Cloud Service. 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ą usługę Cloud Run.

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

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-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --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 wersje nie będą generować ruchu. Domyślnie Cloud Run 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-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

Zobaczysz dane wyjściowe podobne do Traffic: 100% radual-rollouts-colors-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-colors \
      --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$SERVICE_NAME:latest \
      --region $REGION \
      --allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

Teraz, gdy otworzysz witrynę w przeglądarce, zobaczysz kolor beżowy, mimo że lawendowy był ostatnią wdrożoną wersją.

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 pobierz adres URL obrazu najnowszej wersji (w kolorze lawendowym).

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

Teraz otaguj ten obraz powiązanym z nim kolorem.

gcloud run deploy gradual-rollouts-colors --image $IMAGE_URL_LAVENDER --no-traffic --tag $BG_COLOR --region $REGION

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

The revision can be reached directly at https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Teraz, gdy otworzysz adres URL konkretnej wersji, zobaczysz kolor lawendowy.

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-colors --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-colors --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-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.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-colors --region $REGION --to-tags lavender=100

a teraz, gdy odwiedzisz witrynę, zobaczysz tylko lawendę.

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.

Aby wycofać zmiany do poprzedniej wersji (beżowej), uruchom to polecenie:

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

a teraz, gdy odwiedzisz witrynę, zobaczysz beżowe tło.

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 co najmniej 2 wersje usługi 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ń Cloud Run w ramach bezpłatnej wersji), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć usługę Cloud Run, otwórz Cloud Run w konsoli Cloud pod adresem https://console.cloud.google.com/run/ i usuń funkcje utworzone w tym samouczku.

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.