Überarbeitungen in Cloud Run für Traffic-Aufteilung, graduelle Rollouts und Rollbacks verwenden

1. Einführung

Übersicht

Mit Cloud Run-Überarbeitungen können Sie angeben, welche Überarbeitungen Traffic empfangen sollen und welcher Prozentsatz des Traffics an jede Überarbeitung gesendet werden soll. Mit Überarbeitungen können Sie ein Rollback zu einer vorherigen Überarbeitung durchführen, eine Überarbeitung schrittweise einführen und den Traffic auf mehrere Überarbeitungen aufteilen.

In diesem Codelab erfahren Sie, wie Sie mit Überarbeitungen den Traffic zu Ihrem Cloud Run-Dienst verwalten. Weitere Informationen zu Überarbeitungen finden Sie in der Cloud Run-Dokumentation.

Lerninhalte

  • Traffic auf zwei oder mehr Überarbeitungen eines Cloud Run-Dienstes aufteilen
  • Neue Überarbeitung schrittweise einführen
  • Rollback zu einer vorherigen Überarbeitung durchführen

2. Einrichtung und Anforderungen

Voraussetzungen

Umgebungsvariablen festlegen

Sie können Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

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

Artifact Registry-Repository für den Dienst erstellen

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

3. Traffic-Aufteilung

In diesem Beispiel wird gezeigt, wie Sie einen Cloud Run-Dienst erstellen, der eine Umgebungsvariable für die Farbe liest und mit dem Revisionsnamen in dieser Hintergrundfarbe antwortet.

In diesem Codelab wird Python verwendet, Sie können aber auch eine andere Laufzeit verwenden.

Umgebungsvariablen festlegen

Sie können Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.

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

Dienst erstellen

Erstellen Sie zuerst ein Verzeichnis für den Quellcode und wechseln Sie in dieses Verzeichnis.

mkdir traffic-revisions-codelab && cd $_

Erstellen Sie dann eine main.py-Datei mit folgendem Inhalt:

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)

Erstellen Sie als Nächstes eine requirements.txt-Datei mit folgendem Inhalt:

Flask>=2.0.0
gunicorn>=20.0.0

Erstellen Sie zum Schluss ein 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"]

Erstellen Sie das Image in Artifact Registry mit Buildpacks über Cloud Build:

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

Stellen Sie die erste Überarbeitung in Cloud Run mit der Farbe „darkseagreen“ bereit:

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

Um den Dienst zu testen, können Sie den Endpunkt direkt in Ihrem Webbrowser öffnen. Die Hintergrundfarbe sollte dann dunkelgrün sein.

Stellen Sie nun eine zweite Version mit einer hellbraunen Hintergrundfarbe bereit.

# 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

Wenn Sie die Website jetzt aktualisieren, wird die hellbraune Hintergrundfarbe angezeigt.

Traffic 50/50 aufteilen

Wenn Sie den Traffic zwischen den Überarbeitungen in Dunkelgrün und Hellbraun aufteilen möchten, müssen Sie die Überarbeitungs-IDs der zugrunde liegenden Cloud Run-Dienste ermitteln. Sie können die Revisions-IDs mit folgendem Befehl aufrufen:

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

Die Ergebnisse sollten in etwa so aussehen:

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

Mit dem folgenden Befehl können Sie den Traffic 50/50 auf die beiden Überarbeitungen aufteilen:

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

Trafficaufteilung testen

Sie können den Dienst testen, indem Sie die Seite in Ihrem Browser aktualisieren.

Die Hälfte der Zeit sollte die dunkelgrüne Überarbeitung und die andere Hälfte die hellbraune Überarbeitung angezeigt werden. Der Name der Überarbeitung wird auch in der Ausgabe aufgeführt, z.B.

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

4. Gestaffelte Roll-outs

In diesem Abschnitt erfahren Sie, wie Sie Änderungen an einer neuen Cloud Service-Überarbeitung schrittweise einführen. Weitere Informationen zu schrittweisen Einführungen finden Sie in der Dokumentation.

Sie verwenden denselben Code wie im vorherigen Abschnitt, stellen ihn aber als neuen Cloud Run-Dienst bereit.

Legen Sie zuerst die Hintergrundfarbe auf beige fest und stellen Sie die Funktion mit dem Namen gradual-rollouts-colors bereit.

Führen Sie den folgenden Befehl aus, um eine Cloud Run-Funktion direkt in Cloud Run bereitzustellen:

# 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

Angenommen, wir möchten eine neue Überarbeitung mit der Hintergrundfarbe Lavendel schrittweise einführen.

Legen wir zuerst fest, dass die aktuelle Überarbeitung „Beige“ 100% des Traffics erhalten soll. So wird sichergestellt, dass Ihre zukünftigen Überarbeitungen keinen Traffic erhalten. Standardmäßig leitet Cloud Run 100% des Traffics an die Überarbeitung mit dem Flag latest weiter. Wenn Sie manuell festlegen, dass diese aktuelle Überarbeitung in Beige den gesamten Traffic erhalten soll, erhält die Überarbeitung mit dem latest-Flag nicht mehr 100% des Traffics. Dokumentation ansehen

# 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

Die Ausgabe sollte in etwa so aussehen: Traffic: 100% radual-rollouts-colors-00001-yox

Sie können jetzt eine neue Überarbeitung bereitstellen, die keinen Traffic empfängt. Anstatt Codeänderungen vorzunehmen, können Sie die Umgebungsvariable BG_COLOR für diese Überarbeitung aktualisieren.

Führen Sie den folgenden Befehl aus, um eine Cloud Run-Funktion direkt in Cloud Run bereitzustellen:

# 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

Wenn Sie die Website jetzt in Ihrem Browser aufrufen, wird die beige Farbe angezeigt, obwohl Lavendel die zuletzt bereitgestellte Überarbeitung war.

Eine Revision testen, die 0% Traffic bereitstellt

Angenommen, Sie haben überprüft, dass Ihre Überarbeitung erfolgreich bereitgestellt wurde und 0% des Traffics bereitstellt. Obwohl die Systemdiagnosen bestanden wurden, möchten Sie trotzdem prüfen, ob in dieser Überarbeitung die lavendelfarbene Hintergrundfarbe verwendet wird.

Wenn Sie die Lavendel-Überarbeitung testen möchten, können Sie ein Tag auf diese Überarbeitung anwenden. Mit dem Tag können Sie die neue Überarbeitung direkt mit einer bestimmten URL testen, ohne Traffic bereitzustellen.

Rufen Sie zuerst die Bild-URL für die aktuelle Überarbeitung (lavendelfarben) ab.

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

Taggen Sie das Bild jetzt mit der zugehörigen Farbe.

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

Es wird eine Ausgabe angezeigt, die in etwa so aussieht:

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

Wenn Sie nun die URL dieser bestimmten Überarbeitung aufrufen, wird die Farbe Lavendel angezeigt.

Traffic schrittweise steigern

Sie können jetzt Traffic an die Lavendel-Version senden. Im folgenden Beispiel wird gezeigt, wie 1% des Traffics an Lavender gesendet werden.

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

Wenn Sie 50% des Traffics an „lavender“ senden möchten, können Sie denselben Befehl verwenden, aber 50% angeben.

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

Sie sollten eine Liste sehen, aus der hervorgeht, wie viel Traffic jede Überarbeitung erhält.

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

Wenn Sie bereit sind, Lavendel vollständig einzuführen, können Sie den Prozentsatz auf 100% festlegen, um Beige zu ersetzen.

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

Wenn Sie die Website jetzt aufrufen, sehen Sie nur noch Lavendel.

5. Rollbacks

Angenommen, Sie haben bereits UX-Feedback erhalten, das darauf hindeutet, dass Kunden Beige gegenüber Lavendel bevorzugen, und Sie müssen zu Beige zurückkehren.

Mit diesem Befehl können Sie ein Rollback zur vorherigen Version (beige) durchführen:

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

Wenn Sie die Website jetzt aufrufen, sehen Sie Beige als Hintergrundfarbe.

Weitere Informationen zu Rollbacks

6. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Dokumentation zu Rollouts, Rollbacks und Traffic-Migration zu lesen.

Behandelte Themen

  • Traffic auf zwei oder mehr Überarbeitungen eines Cloud Run-Dienstes aufteilen
  • Neue Überarbeitung schrittweise einführen
  • Rollback zu einer vorherigen Überarbeitung durchführen

7. Bereinigen

Um unbeabsichtigte Gebühren zu vermeiden (z. B. wenn diese Cloud Run-Funktion versehentlich öfter aufgerufen wird als Ihre monatliche Cloud Run-Aufrufkontingent im kostenlosen Kontingent), können Sie entweder den Cloud Run-Dienst oder das Projekt löschen, das Sie in Schritt 2 erstellt haben.

Wenn Sie einen Cloud Run-Dienst löschen möchten, rufen Sie in der Cloud Console https://console.cloud.google.com/run/ auf und löschen Sie die Funktionen, die Sie in diesem Codelab erstellt haben.

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das Projekt aus, das Sie in Schritt 2 erstellt haben, und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie das Projekt in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit gcloud projects list aufrufen.