Utilizzo delle revisioni in Cloud Run per la suddivisione del traffico, i rilasci graduali e i rollback

1. Introduzione

Panoramica

Le revisioni di Cloud Run consentono di specificare quali revisioni devono ricevere il traffico e la percentuale di traffico da inviare a ciascuna revisione. Le revisioni ti consentono di eseguire il rollback a una revisione precedente, implementare gradualmente una revisione e dividere il traffico tra più revisioni.

Questo codelab mostra come utilizzare le revisioni per gestire il traffico verso il servizio Cloud Run. Per saperne di più sulle revisioni, consulta la documentazione di Cloud Run.

Cosa imparerai a fare

  • Come dividere il traffico tra due o più revisioni per un servizio Cloud Run
  • Come implementare gradualmente una nuova revisione
  • Come eseguire il rollback a una revisione precedente

2. Configurazione e requisiti

Prerequisiti

  • Hai eseguito l'accesso a Cloud Console.
  • Hai già eseguito il deployment di un servizio Cloud Run. Ad esempio, per iniziare puoi seguire la procedura per eseguire il deployment di un servizio Cloud Run.

Imposta le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate in questo codelab.

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

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

Crea un repository Artifact Registry per il servizio

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

3. Suddivisione del traffico

Questo esempio mostra come creare un servizio Cloud Run che legge una variabile di ambiente di colore e risponde con il nome della revisione utilizzando quel colore di sfondo.

Sebbene questo codelab utilizzi Python, puoi utilizzare qualsiasi runtime.

Imposta le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate in questo codelab.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen
SERVICE_NAME=traffic-revisions-color
AR_REPO=traffic-revisions-color-repo

Crea il servizio

Innanzitutto, crea una directory per il codice sorgente e accedi tramite cd.

mkdir traffic-revisions-codelab && cd $_

Quindi, crea un file main.py con il seguente contenuto:

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)

Successivamente, crea un file requirements.txt con il seguente contenuto:

Flask>=2.0.0
gunicorn>=20.0.0

Infine, crea un 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"]

Crea l'immagine in Artifact Registry utilizzando i buildpack con Cloud Build:

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

e esegui il deployment della prima revisione in Cloud Run con un colore verde scuro:

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

Per testare il servizio, puoi aprire l'endpoint direttamente nel browser web per visualizzare il colore di sfondo verde mare scuro.

Ora esegui il deployment di una seconda revisione con un colore di sfondo marrone chiaro.

# 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

Ora, quando aggiorni il sito web, vedrai il colore di sfondo marrone chiaro.

Suddividi il traffico 50-50

Per dividere il traffico tra le revisioni verde scuro e marrone chiaro, devi trovare gli ID revisione dei servizi Cloud Run sottostanti. Puoi visualizzare gli ID revisione eseguendo questo comando:

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

Dovresti visualizzare risultati simili a quelli riportati di seguito.

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

Puoi suddividere il traffico 50/50 tra le due revisioni eseguendo il seguente comando con le tue revisioni:

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

Testa la suddivisione del traffico

Puoi testare il servizio aggiornando la pagina nel browser.

Metà delle volte dovresti vedere la revisione verde scuro e l'altra metà la revisione marrone chiaro. Vedrai anche il nome della revisione elencato nell'output, ad esempio:

<html><body style="background-color:tan;"><div><p>Hello traffic-revisions-color-00003-qoq</p></div></body></html>

4. Implementazioni graduali

In questa sezione, imparerai a implementare gradualmente le modifiche a una nuova revisione del servizio cloud. Puoi scoprire di più sui rollout graduali nella documentazione.

Utilizzerai lo stesso codice della sezione precedente, ma lo eseguirai il deployment come nuovo servizio Cloud Run.

Innanzitutto, imposta il colore di sfondo su beige ed esegui il deployment della funzione con il nome gradual-rollouts-colors.

Per eseguire il deployment di una funzione Cloud Run direttamente su Cloud Run, esegui questo comando:

# 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

Supponiamo ora di voler implementare gradualmente una nuova revisione con il colore di sfondo lavanda.

Innanzitutto, impostiamo la revisione corrente beige in modo che riceva il 100% del traffico. In questo modo, le revisioni future non riceveranno traffico. Per impostazione predefinita, Cloud Run imposta il 100% del traffico sulla revisione con il flag latest. Se specifichi manualmente che questa revisione attuale beige deve ricevere tutto il traffico, la revisione con il flag latest non riceverà più il 100% del traffico. Consulta la documentazione.

# 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

Vedrai un output simile a Traffic: 100% radual-rollouts-colors-00001-yox

Ora puoi eseguire il deployment di una nuova revisione che non riceverà traffico. Anziché apportare modifiche al codice, puoi aggiornare la variabile di ambiente BG_COLOR per questa revisione.

Per eseguire il deployment di una funzione Cloud Run direttamente su Cloud Run, esegui questo comando:

# 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

Ora, quando visiti il sito web nel browser, vedrai il colore beige, anche se la revisione di cui è stato eseguito il deployment più di recente è quella lavanda.

Testare una revisione che gestisce lo 0% del traffico

Supponiamo che tu abbia verificato che la revisione è stata implementata correttamente e che gestisce lo 0% del traffico. Anche se ha superato i controlli di integrità, vuoi comunque verificare che questa revisione utilizzi il colore di sfondo lavanda.

Per testare la revisione lavanda, puoi applicare un tag alla revisione. Il tagging ti consente di testare direttamente la nuova revisione a un URL specifico, senza attivare il traffico.

Innanzitutto, recupera l'URL dell'immagine dell'ultima revisione (che è lavanda).

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

Ora tagga l'immagine con il colore associato.

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

Vedrai un output simile al seguente:

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

Ora, quando visiti l'URL di revisione specifico, vedrai il colore lavanda.

Aumento graduale del traffico

Ora puoi iniziare a inviare traffico alla revisione lavanda. L'esempio seguente mostra come inviare l'1% del traffico a lavender.

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

Per inviare il 50% del traffico a lavanda, puoi utilizzare lo stesso comando, ma specificare il 50%.

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

Dovresti visualizzare un elenco del traffico ricevuto da ogni revisione.

Traffic:
  50% gradual-rollouts-colors-00001-hos
  50% gradual-rollouts-colors-00004-mum
        lavender: https://lavender---gradual-rollouts-colors-<hash>-<region>.a.run.app

Quando è tutto pronto per il lancio completo di lavanda, puoi impostare il colore al 100% per sostituire il beige.

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

e ora, quando visiti il sito web, vedrai solo il colore lavanda.

5. Rollback

Supponiamo che siano arrivati i primi feedback sull'esperienza utente, che indicano che i clienti preferiscono il beige al lavanda e che tu debba eseguire il rollback al beige.

Puoi eseguire il rollback alla revisione precedente (beige) eseguendo questo comando:

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

Ora, quando visiti il sito web, vedrai il beige come colore di sfondo.

Per saperne di più sui rollback, consulta la documentazione.

6. Complimenti!

Congratulazioni per aver completato il codelab.

Ti consigliamo di consultare la documentazione su implementazioni, rollback e migrazione del traffico.

Argomenti trattati

  • Come dividere il traffico tra due o più revisioni per un servizio Cloud Run
  • Come implementare gradualmente una nuova revisione
  • Come eseguire il rollback a una revisione precedente

7. Esegui la pulizia

Per evitare addebiti involontari (ad esempio, se questa funzione Cloud Run viene richiamata inavvertitamente più volte rispetto all'allocazione mensile di chiamate di Cloud Run nel livello senza costi), puoi eliminare il servizio Cloud Run o il progetto che hai creato nel passaggio 2.

Per eliminare un servizio Cloud Run, vai a Cloud Run nella console Google Cloud all'indirizzo https://console.cloud.google.com/run/ ed elimina le funzioni che hai creato in questo codelab.

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai cambiare progetto in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.