ट्रैफ़िक के बंटवारे, धीरे-धीरे रोल आउट करने, और रोलबैक के लिए, Cloud Run में बदलावों का इस्तेमाल करना

1. परिचय

खास जानकारी

Cloud Run के वर्शन की मदद से, यह तय किया जा सकता है कि किस वर्शन को ट्रैफ़िक मिलना चाहिए और हर वर्शन को कितना ट्रैफ़िक भेजना है. बदलावों की मदद से, पिछले बदलाव पर वापस जाया जा सकता है, बदलाव को धीरे-धीरे रोल आउट किया जा सकता है, और ट्रैफ़िक को कई बदलावों के बीच बांटा जा सकता है.

इस कोडलैब में, Cloud Run सेवा पर ट्रैफ़िक को मैनेज करने के लिए, वर्शन का इस्तेमाल करने का तरीका बताया गया है. Cloud Run के दस्तावेज़ में जाकर, वर्शन के बारे में ज़्यादा जानें.

आपको क्या सीखने को मिलेगा

  • Cloud Run सेवा के लिए, दो या उससे ज़्यादा वर्शन के बीच ट्रैफ़िक को कैसे बांटा जाता है
  • नए वर्शन को धीरे-धीरे रोल आउट करने का तरीका
  • किसी पिछले वर्शन पर वापस जाने का तरीका

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

  • आपने Cloud Console में लॉग इन किया हो.
  • आपने पहले Cloud Run सेवा को डिप्लॉय किया हो. उदाहरण के लिए, शुरू करने के लिए Cloud Run सेवा को डिप्लॉय करने का तरीका देखें.

एनवायरमेंट वैरिएबल सेट करना

ऐसे एनवायरमेंट वैरिएबल सेट किए जा सकते हैं जिनका इस्तेमाल इस कोडलैब में किया जाएगा.

PROJECT_ID=YOUR-PROJECT-ID
REGION=YOUR_REGION

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

सेवा के लिए, Artifact Registry रिपॉज़िटरी बनाना

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

3. ट्रैफ़िक स्प्लिट करना

इस सैंपल में, Cloud Run सेवा बनाने का तरीका बताया गया है. यह सेवा, कलर एनवायरमेंट वैरिएबल को पढ़ती है और उस बैकग्राउंड कलर का इस्तेमाल करके, वर्शन के नाम के साथ जवाब देती है.

इस कोडलैब में Python का इस्तेमाल किया गया है. हालांकि, किसी भी रनटाइम का इस्तेमाल किया जा सकता है.

एनवायरमेंट वैरिएबल सेट करना

ऐसे एनवायरमेंट वैरिएबल सेट किए जा सकते हैं जिनका इस्तेमाल इस कोडलैब में किया जाएगा.

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

सेवा बनाना

सबसे पहले, सोर्स कोड के लिए एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में cd करें.

mkdir traffic-revisions-codelab && cd $_

इसके बाद, यहां दिए गए कॉन्टेंट के साथ main.py फ़ाइल बनाएं:

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)

इसके बाद, यहां दिए गए कॉन्टेंट के साथ requirements.txt फ़ाइल बनाएं:

Flask>=2.0.0
gunicorn>=20.0.0

आखिर में, एक 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"]

Cloud Build का इस्तेमाल करके, Buildpacks की मदद से Artifact Registry में इमेज बनाएं:

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

इसके बाद, डार्कसीग्रीन रंग के साथ Cloud Run पर पहला संशोधन डिप्लॉय करें:

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

सेवा की जांच करने के लिए, सीधे अपने वेब ब्राउज़र में एंडपॉइंट खोलें. इससे आपको बैकग्राउंड का रंग डार्क सी ग्रीन दिखेगा.

अब हल्के भूरे रंग के बैकग्राउंड के साथ दूसरा वर्शन डिप्लॉय करें.

# 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

अब वेबसाइट को रीफ़्रेश करने पर, आपको बैकग्राउंड का रंग हल्का भूरा दिखेगा.

ट्रैफ़िक को 50-50 के अनुपात में बांटना

डीप सी ग्रीन और टैन वर्शन के बीच ट्रैफ़िक को बांटने के लिए, आपको Cloud Run सेवाओं के वर्शन आईडी ढूंढने होंगे. इस कमांड को चलाकर, वर्शन आईडी देखे जा सकते हैं:

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

आपको यहां दिए गए नतीजों से मिलते-जुलते नतीजे दिखेंगे

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

अपने दो वर्शन के बीच ट्रैफ़िक को 50/50 के हिसाब से बांटने के लिए, अपने वर्शन के साथ यह कमांड चलाएं:

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

ट्रैफ़िक स्प्लिट करने की सुविधा की जांच करना

अपने ब्राउज़र में पेज को रीफ़्रेश करके, सेवा को आज़माया जा सकता है.

आधे समय तक आपको गहरे समुद्री हरे रंग का वर्शन दिखेगा और बाकी समय में आपको हल्के भूरे रंग का वर्शन दिखेगा. आपको आउटपुट में बदलाव का नाम भी दिखेगा. उदाहरण के लिए,

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

4. लॉन्च होने के कुछ समय बाद उपलब्ध होने वाली सुविधाएं

इस सेक्शन में, आपको Cloud Service के नए वर्शन में बदलावों को धीरे-धीरे रोल आउट करने का तरीका बताया जाएगा. दस्तावेज़ में जाकर, धीरे-धीरे रोल आउट करने के बारे में ज़्यादा जानें.

आपको पिछले सेक्शन में इस्तेमाल किए गए कोड का ही इस्तेमाल करना होगा. हालांकि, इसे नई Cloud Run सेवा के तौर पर डिप्लॉय किया जाएगा.

सबसे पहले, बैकग्राउंड का रंग beige पर सेट करें. इसके बाद, gradual-rollouts-colors नाम वाले फ़ंक्शन को डिप्लॉय करें.

Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, यह कमांड चलाएं:

# 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

अब मान लें कि हमें बैकग्राउंड के रंग को लैवेंडर में बदलकर, धीरे-धीरे नया वर्शन रोल आउट करना है.

सबसे पहले, हम बेज रंग के मौजूदा वर्शन को सेट करते हैं, ताकि उसे 100% ट्रैफ़िक मिल सके. इससे यह पक्का किया जा सकेगा कि आपके आने वाले समय के बदलावों को कोई ट्रैफ़िक न मिले. डिफ़ॉल्ट रूप से, Cloud Run, latest फ़्लैग वाली वर्शन को 100% ट्रैफ़िक पर सेट करता है. मैन्युअल तरीके से यह तय किया जा सकता है कि मौजूदा बेज रंग वाले वर्शन को पूरा ट्रैफ़िक मिले. ऐसा करने पर, latest फ़्लैग वाले वर्शन को 100% ट्रैफ़िक नहीं मिलेगा. दस्तावेज़ देखें.

# 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

आपको Traffic: 100% radual-rollouts-colors-00001-yox जैसा आउटपुट दिखेगा

अब आपके पास एक नया वर्शन डिप्लॉय करने का विकल्प है. इस वर्शन को कोई ट्रैफ़िक नहीं मिलेगा. कोड में कोई भी बदलाव करने के बजाय, इस वर्शन के लिए BG_COLOR एनवायरमेंट वैरिएबल को अपडेट किया जा सकता है.

Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, यह कमांड चलाएं:

# 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

अब जब ब्राउज़र में वेबसाइट पर जाया जाएगा, तब आपको बेज रंग दिखेगा. भले ही, लैवेंडर रंग को हाल ही में डिप्लॉय किया गया हो.

बदलाव की जांच करना, जिसमें 0% ट्रैफ़िक शामिल हो

मान लें कि आपने पुष्टि कर ली है कि आपका बदलाव सही तरीके से लागू हो गया है और उससे 0% ट्रैफ़िक मिल रहा है. हालांकि, यह बदलाव हेल्थ चेक पास कर चुका है, लेकिन आपको अब भी यह पुष्टि करनी है कि इस बदलाव में लैवेंडर रंग का बैकग्राउंड इस्तेमाल किया जा रहा है.

लैवेंडर रंग के वर्शन को टेस्ट करने के लिए, उस वर्शन पर टैग लागू करें. टैग करने की सुविधा की मदद से, किसी यूआरएल पर सीधे तौर पर नए वर्शन की जांच की जा सकती है. इसके लिए, ट्रैफ़िक दिखाने की ज़रूरत नहीं होती.

सबसे पहले, उस नए बदलाव (जो लैवेंडर रंग का है) के लिए इमेज का यूआरएल पाएं.

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

अब उस इमेज को उससे जुड़े रंग के साथ टैग करें.

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

आपको इससे मिलता-जुलता आउटपुट दिखेगा:

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

अब उस खास वर्शन के यूआरएल पर जाने पर, आपको लैवेंडर रंग दिखेगा.

ट्रैफ़िक में धीरे-धीरे बढ़ोतरी हो रही है

अब, ट्रैफ़िक को लैवेंडर वर्शन पर भेजा जा सकता है. यहां दिए गए उदाहरण में, 1% ट्रैफ़िक को लैवेंडर पर भेजने का तरीका बताया गया है.

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

अगर आपको 50% ट्रैफ़िक को लैवेंडर पर भेजना है, तो उसी कमांड का इस्तेमाल किया जा सकता है. हालांकि, इसके लिए आपको 50% तय करना होगा.

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

आपको एक सूची दिखेगी, जिसमें यह बताया गया होगा कि हर वर्शन को कितना ट्रैफ़िक मिल रहा है.

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

जब आपको लैवेंडर को पूरी तरह से रोल आउट करना हो, तब बेज को बदलने के लिए लैवेंडर को 100% पर सेट करें.

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

अब वेबसाइट पर जाने पर, आपको सिर्फ़ लैवेंडर दिखेगा.

5. रोलबैक

मान लें कि आपको यूज़र एक्सपीरियंस (यूएक्स) के बारे में शुरुआती सुझाव मिले हैं. इनमें बताया गया है कि खरीदारों को लैवेंडर के बजाय बेज रंग पसंद है. ऐसे में, आपको बेज रंग पर वापस जाना होगा.

इस निर्देश को चलाकर, पिछले वर्शन (बेज) पर वापस जाया जा सकता है:

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

अब वेबसाइट पर जाने पर, आपको बैकग्राउंड का रंग बेज दिखेगा.

दस्तावेज़ों में जाकर, रोलबैक के बारे में ज़्यादा जानें.

6. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप रोलआउट, रोलबैक, और ट्रैफ़िक माइग्रेशन से जुड़े दस्तावेज़ पढ़ें

हमने क्या-क्या बताया

  • Cloud Run सेवा के लिए, दो या उससे ज़्यादा वर्शन के बीच ट्रैफ़िक को कैसे बांटा जाता है
  • नए वर्शन को धीरे-धीरे रोल आउट करने का तरीका
  • किसी पिछले वर्शन पर वापस जाने का तरीका

7. व्यवस्थित करें

अनजाने में लगने वाले शुल्क से बचने के लिए, Cloud Run सेवा को मिटा दें. उदाहरण के लिए, अगर इस Cloud Run फ़ंक्शन को मुफ़्त टियर में Cloud Run फ़ंक्शन को महीने में कॉल करने की तय सीमा से ज़्यादा बार कॉल किया गया है, तो Cloud Run सेवा को मिटा दें. इसके अलावा, दूसरे चरण में बनाए गए प्रोजेक्ट को भी मिटाया जा सकता है.

Cloud Run सेवा को मिटाने के लिए, Cloud Console में https://console.cloud.google.com/run/ पर जाकर Cloud Run पर जाएं. इसके बाद, इस कोडलैब में बनाए गए फ़ंक्शन मिटाएं.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.