Menggunakan revisi di Cloud Run untuk Pemisahan Traffic, Peluncuran Bertahap, dan Rollback

Menggunakan revisi di Cloud Run untuk Pemisahan Traffic, Peluncuran Bertahap, dan Rollback

Tentang codelab ini

subjectTerakhir diperbarui Apr 5, 2025
account_circleDitulis oleh Googler

1. Pengantar

Ringkasan

Dengan revisi Cloud Run, Anda dapat menentukan revisi mana yang akan menerima traffic dan persentase traffic yang akan dikirim ke setiap revisi. Dengan revisi, Anda dapat melakukan rollback ke revisi sebelumnya, meluncurkan revisi secara bertahap, dan membagi traffic antara beberapa revisi.

Codelab ini menunjukkan cara menggunakan revisi untuk mengelola traffic ke layanan Cloud Run Anda. Anda dapat mempelajari revisi lebih lanjut di dokumentasi Cloud Run.

Yang akan Anda pelajari

  • Cara membagi traffic antara dua revisi atau lebih untuk layanan Cloud Run
  • Cara meluncurkan revisi baru secara bertahap
  • Cara melakukan rollback ke revisi sebelumnya

2. Penyiapan dan Persyaratan

Prasyarat

  • Anda login ke Cloud Console.
  • Anda sebelumnya telah men-deploy layanan Cloud Run. Misalnya, Anda dapat mengikuti cara men-deploy layanan Cloud Run untuk memulai.

Menetapkan Variabel Lingkungan

Anda dapat menetapkan variabel lingkungan yang akan digunakan di seluruh codelab ini.

PROJECT_ID=YOUR-PROJECT-ID
REGION
=YOUR_REGION

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

Membuat repositori registry artefak untuk Layanan

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

3. Pembagian Traffic

Contoh ini menunjukkan cara membuat layanan Cloud Run yang membaca variabel lingkungan warna dan merespons kembali dengan nama revisi menggunakan warna latar belakang tersebut.

Meskipun codelab ini menggunakan python, Anda dapat menggunakan runtime apa pun.

Menetapkan Variabel Lingkungan

Anda dapat menetapkan variabel lingkungan yang akan digunakan di seluruh codelab ini.

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

Membuat layanan

Pertama, buat direktori untuk kode sumber dan cd ke direktori tersebut.

mkdir traffic-revisions-codelab && cd $_

Kemudian, buat file main.py dengan konten berikut:

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)

Selanjutnya, buat file requirements.txt dengan konten berikut:

Flask>=2.0.0
gunicorn>=20.0.0

Terakhir, buat 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"]

Buat image di Artifact Registry menggunakan Buildpack dengan menggunakan Cloud Build:

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

Kemudian, deploy revisi pertama ke Cloud Run dengan warna darkseagreen:

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

Untuk menguji layanan, Anda dapat membuka endpoint langsung di browser web untuk melihat warna latar belakang sebagai hijau laut gelap.

Sekarang, deploy revisi kedua dengan warna latar belakang cokelat.

# 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

Sekarang, saat memuat ulang situs, Anda akan melihat warna latar belakang cokelat.

Membagi traffic 50-50

Untuk memisahkan traffic antara revisi hijau laut dalam dan cokelat, Anda perlu menemukan ID revisi layanan Cloud Run yang mendasarinya. Anda dapat melihat ID revisi dengan menjalankan perintah ini:

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

Anda akan melihat hasil yang mirip dengan yang ada di bawah

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

Anda dapat membagi traffic 50/50 di antara dua revisi dengan menjalankan perintah berikut dengan revisi Anda:

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

Menguji pemisahan traffic

Anda dapat menguji layanan dengan memuat ulang halaman di browser.

Sebagian besar waktu, Anda akan melihat revisi hijau laut gelap dan, sebagian lainnya, Anda akan melihat revisi cokelat. Anda juga akan melihat nama revisi yang tercantum dalam output, misalnya

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

4. Peluncuran Bertahap

Di bagian ini, Anda akan mempelajari cara meluncurkan perubahan secara bertahap ke revisi Layanan Cloud baru. Anda dapat mempelajari lebih lanjut peluncuran bertahap di dokumentasi.

Anda akan menggunakan kode yang sama dengan bagian sebelumnya, tetapi akan men-deploy-nya sebagai layanan Cloud Run baru.

Pertama, tetapkan warna latar belakang ke beige dan deploy fungsi dengan nama gradual-rollouts-colors.

Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, jalankan perintah berikut:

# 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

Sekarang, misalkan kita ingin meluncurkan revisi baru secara bertahap dengan warna latar belakang lavender.

Pertama, mari kita tetapkan revisi saat ini berwarna krem untuk menerima 100% traffic. Tindakan ini akan memastikan bahwa revisi Anda di masa mendatang tidak menerima traffic apa pun. Secara default, Cloud Run menetapkan 100% traffic ke revisi dengan flag latest. Dengan menentukan secara manual bahwa revisi beige saat ini harus menerima semua traffic, revisi dengan flag latest tidak akan lagi menerima 100% traffic. Lihat dokumentasi.

# 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

Anda akan melihat output yang mirip dengan Traffic: 100% radual-rollouts-colors-00001-yox

Sekarang Anda dapat men-deploy revisi baru yang tidak akan menerima traffic apa pun. Daripada membuat perubahan kode, Anda dapat memperbarui variabel lingkungan BG_COLOR untuk revisi ini.

Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, jalankan perintah berikut:

# 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

dan sekarang saat Anda mengunjungi situs di browser, Anda akan melihat warna krem, meskipun lavender adalah revisi yang baru saja di-deploy.

Menguji Revisi yang menyalurkan traffic 0%

Misalkan Anda telah memverifikasi bahwa revisi berhasil di-deploy dan menayangkan 0% traffic. Meskipun telah lulus pemeriksaan kondisi, Anda tetap ingin memverifikasi bahwa revisi ini menggunakan warna latar belakang lavender.

Untuk menguji revisi lavender, Anda dapat menerapkan tag ke revisi tersebut. Pemberian tag memungkinkan Anda menguji revisi baru secara langsung di URL tertentu, tanpa menyalurkan traffic.

Pertama, dapatkan URL gambar untuk revisi terbaru tersebut (yaitu lavender).

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

Sekarang, beri tag pada gambar tersebut dengan warna terkait.

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

Anda akan melihat output yang mirip dengan berikut ini:

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

Sekarang, saat mengunjungi URL revisi tertentu tersebut, Anda akan melihat warna lavender.

Meningkatkan traffic secara bertahap

Sekarang, Anda dapat mulai mengirim traffic ke revisi lavender. Contoh di bawah menunjukkan cara mengirim 1% traffic ke lavender.

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

Untuk mengirim 50% traffic ke lavender, Anda dapat menggunakan perintah yang sama, tetapi tentukan 50%.

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

Anda akan melihat daftar jumlah traffic yang diterima setiap revisi.

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

Jika sudah siap untuk meluncurkan lavender sepenuhnya, Anda dapat menetapkan lavender ke 100% untuk menggantikan beige.

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

dan sekarang saat mengunjungi situs, Anda hanya akan melihat warna lavender.

5. Rollback

Misalnya, masukan UX awal telah diterima, yang menunjukkan bahwa pelanggan lebih menyukai warna krem daripada lavender, dan Anda perlu melakukan rollback ke warna krem.

Anda dapat melakukan roll back ke revisi sebelumnya (beige) dengan menjalankan perintah ini:

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

dan sekarang saat mengunjungi situs, Anda akan melihat warna krem sebagai warna latar belakang.

Anda dapat mempelajari rollback lebih lanjut di dokumen.

6. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Sebaiknya tinjau dokumentasi tentang peluncuran, rollback, dan migrasi traffic

Yang telah kita bahas

  • Cara membagi traffic antara dua revisi atau lebih untuk layanan Cloud Run
  • Cara meluncurkan revisi baru secara bertahap
  • Cara melakukan rollback ke revisi sebelumnya

7. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, jika fungsi Cloud Run ini tidak sengaja dipanggil lebih dari alokasi pemanggilan Cloud Run bulanan Anda di paket gratis), Anda dapat menghapus layanan Cloud Run atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus layanan Cloud Run, buka Cloud Run di Cloud Console di https://console.cloud.google.com/run/ dan hapus fungsi yang Anda buat dalam codelab ini.

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, memilih project yang Anda buat di Langkah 2, lalu memilih Hapus. Jika menghapus project, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.