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

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

Informazioni su questo codelab

subjectUltimo aggiornamento: apr 5, 2025
account_circleScritto da un Googler

1. Introduzione

Panoramica

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

Questi codelab mostrano come utilizzare le revisioni per gestire il traffico verso il servizio Cloud Run. Per scoprire di più sulle revisioni, consulta la documentazione di Cloud Run.

Cosa imparerai a fare

  • Come suddividere 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 alla console Cloud.
  • 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.

Impostare le variabili di ambiente

Puoi impostare le variabili di ambiente che verranno utilizzate durante 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 legga una variabile di ambiente di colore e risponda con il nome della revisione utilizzando quel colore di sfondo.

Sebbene questo codelab utilizzi Python, puoi utilizzare qualsiasi runtime.

Impostare le variabili di ambiente

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

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

Creare il servizio

Per prima cosa, crea una directory per il codice sorgente ed esegui cd in quella directory.

mkdir traffic-revisions-codelab && cd $_

Quindi, crea un file main.py con i seguenti contenuti:

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)

Poi, crea un file requirements.txt con i seguenti contenuti:

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 Buildpack con Cloud Build:

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

Esegui il deployment della prima revisione in Cloud Run con un colore verde acqua 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 vedere il colore di sfondo verde acqua 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.

Suddividi il traffico 50-50

Per suddividere il traffico tra le revisioni verde acqua e marrone chiaro, devi trovare gli ID revisione dei servizi Cloud Run sottostanti. Per visualizzare gli ID revisione, esegui questo comando:

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

Dovresti vedere 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 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.

La metà delle volte dovresti vedere la revisione verde mare scuro e l'altra metà la revisione marrone chiaro. Nell'output viene visualizzato anche il nome della revisione, 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 in una nuova revisione del servizio cloud. Per scoprire di più sui rollout graduali, consulta la documentazione.

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

Innanzitutto, imposta il colore di sfondo su beige e 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 il seguente 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 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 alcun 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 implementare 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 il seguente 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 era lavanda.

Testare una revisione che genera lo 0% di traffico

Supponiamo che tu abbia verificato che il deployment della revisione sia andato a buon fine e che stia pubblicando lo 0% di 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 a quella revisione. I tag ti consentono di testare direttamente la nuova revisione in un URL specifico, senza pubblicare traffico.

Innanzitutto, ottieni l'URL 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 della revisione specifica, 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 lavanda.

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 vedere 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 implementare completamente il colore lavanda, puoi impostarlo al 100% per sostituire il beige.

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

Ora, quando visiti il sito web, vedrai solo il colore lavanda.

5. Rollback

Supponiamo che siano stati ricevuti feedback iniziali sull'esperienza utente che indicano che i clienti preferiscono il beige alla 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 scoprire di più sui rollback, consulta la documentazione.

6. Complimenti!

Complimenti per aver completato il codelab.

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

Argomenti trattati

  • Come suddividere 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 invocata inavvertitamente più volte rispetto alla allocazione mensile di invocazioni Cloud Run nel livello senza costi, puoi eliminare il servizio Cloud Run o il progetto creato nel passaggio 2.

Per eliminare un servizio Cloud Run, vai a Cloud Run nella console Cloud all'indirizzo https://console.cloud.google.com/run/ ed elimina le funzioni create 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 creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai modificare i progetti nel tuo Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.