استفاده از ویرایش‌ها در عملکردهای Cloud Run برای تقسیم ترافیک، انتشار تدریجی و بازگشت

۱. مقدمه

نمای کلی

توابع Cloud Run به شما امکان می‌دهند مشخص کنید کدام نسخه‌ها باید ترافیک دریافت کنند و درصد ترافیکی را که توسط یک نسخه دریافت می‌شود، مشخص کنید. نسخه‌ها به شما امکان می‌دهند به یک نسخه قبلی برگردید، به تدریج یک نسخه را منتشر کنید و ترافیک را بین چندین نسخه تقسیم کنید.

این آزمایشگاه کد به شما نشان می‌دهد که چگونه از ویرایش‌ها برای مدیریت ترافیک توابع Cloud Run خود استفاده کنید. می‌توانید در مستندات Cloud Run درباره ویرایش‌ها اطلاعات بیشتری کسب کنید.

آنچه یاد خواهید گرفت

  • چگونه ترافیک را بین دو یا چند نسخه برای یک تابع Cloud Run تقسیم کنیم
  • چگونه یک نسخه جدید را به تدریج منتشر کنیم
  • نحوه بازگشت به نسخه قبلی

۲. تنظیمات و الزامات

پیش‌نیازها

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

d95252b003979716.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی دستور

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. تقسیم ترافیک

این نمونه به شما نشان می‌دهد که چگونه تابعی ایجاد کنید که یک متغیر محیطی رنگ را می‌خواند و با استفاده از آن رنگ پس‌زمینه، نام نسخه را برمی‌گرداند.

اگرچه این codelab از node.js استفاده می‌کند، شما می‌توانید از هر runtime دیگری استفاده کنید.

تنظیم متغیرهای محیطی

شما می‌توانید متغیرهای محیطی که در سراسر این آزمایشگاه کد استفاده خواهند شد را تنظیم کنید.

REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen

تابع را ایجاد کنید

ابتدا، یک دایرکتوری برای کد منبع ایجاد کنید و با دستور cd به آن دایرکتوری بروید.

mkdir revisions-gcf-codelab && cd $_

سپس، یک فایل package.json با محتوای زیر ایجاد کنید:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

سپس، یک فایل منبع index.js با محتوای زیر ایجاد کنید:

const functions = require('@google-cloud/functions-framework');

const BG_COLOR = process.env.BG_COLOR;
const K_REVISION = process.env.K_REVISION;

functions.http('helloWorld', (req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('<html><body style="background-color:' + BG_COLOR + ';"' + '><div><p>' + 'Hello from ' + K_REVISION + ' using color ' + BG_COLOR + '</p></div></body>' + '</html>');
});

برای استقرار مستقیم یک تابع Cloud Run روی Cloud Run، دستور زیر را اجرا کنید:

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --set-env-vars BG_COLOR=$BG_COLOR

اگر ترجیح می‌دهید به عنوان یک Cloud Functions نسل دوم مستقر شوید، از دستور زیر استفاده کنید:

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated \
  --set-env-vars BG_COLOR=$BG_COLOR

برای آزمایش تابع، می‌توانید نقطه پایانی موجود را خم کنید تا رنگ darkseagreen را در html ببینید، یا از مرورگر خود برای ضربه زدن مستقیم به نقطه پایانی استفاده کنید تا رنگ پس‌زمینه را ببینید.

SERVICE_URL=$(gcloud run services describe traffic-splitting-gcf --platform managed --region $REGION --format 'value(status.url)')

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

حالا یک نسخه دوم با رنگ پس‌زمینه قهوه‌ای مایل به زرد (tan) ایجاد کنید.

برای استقرار مستقیم یک تابع Cloud Run روی Cloud Run، دستور زیر را اجرا کنید:

# update the env var
BG_COLOR=tan

gcloud beta run deploy traffic-splitting-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

اگر ترجیح می‌دهید به عنوان یک Cloud Functions نسل دوم مستقر شوید، از دستور زیر استفاده کنید:

# update the env var
BG_COLOR=tan

gcloud functions deploy traffic-splitting-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

حالا وقتی نقطه پایانی را خم می‌کنید، رنگ پس‌زمینه قهوه‌ای مایل به زرد را خواهید دید.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

ترافیک را ۵۰-۵۰ تقسیم کنید

برای تقسیم ترافیک بین نسخه‌های سبز تیره و قهوه‌ای تیره، باید شناسه‌های نسخه‌های سرویس‌های Cloud Run زیرین را پیدا کنید. می‌توانید با اجرای این دستور، شناسه‌های نسخه‌ها را مشاهده کنید:

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

شما باید نتایجی مشابه نتایج زیر را ببینید

traffic-splitting-gcf-00003-qoq
traffic-splitting-gcf-00002-zag

شما می‌توانید با اجرای دستور زیر، ترافیک را به صورت ۵۰/۵۰ بین دو نسخه تقسیم کنید:

gcloud run services update-traffic traffic-splitting-gcf \
  --region $REGION \
  --to-revisions <REVISION1>=50,<REVISION2>=50

تقسیم ترافیک را آزمایش کنید

شما می‌توانید تابع را با مراجعه به URL عمومی آن (یا از طریق curl یا مستقیماً در مرورگر) آزمایش کنید.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL

در نیمی از مواقع، باید نسخه سبز دریایی تیره و در نیمی دیگر، نسخه برنزه را ببینید. همچنین نام نسخه در خروجی ذکر شده است، مثلاً

<html><body style="background-color:tan;"><div><p>Hello traffic-splitting-gcf-00006-qoq</p></div></body></html>

۴. عرضه تدریجی

در این بخش، یاد خواهید گرفت که چگونه تغییرات را به تدریج به یک نسخه جدید از Cloud Function اعمال کنید. می‌توانید اطلاعات بیشتری در مورد اعمال تدریجی تغییرات را در مستندات کسب کنید.

شما از همان کد بخش قبلی استفاده خواهید کرد، اما آن را به عنوان یک تابع ابری جدید مستقر خواهید کرد.

ابتدا، رنگ پس‌زمینه را روی beige تنظیم کنید و تابع را با نام gradual-rollouts-gcf مستقر کنید.

برای استقرار مستقیم یک تابع Cloud Run روی Cloud Run، دستور زیر را اجرا کنید:

# update the env var
BG_COLOR=beige

gcloud beta run deploy gradual-rollouts-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

اگر ترجیح می‌دهید به عنوان یک Cloud Functions نسل دوم مستقر شوید، از دستور زیر استفاده کنید:

# update the env var
BG_COLOR=beige

# deploy the function
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR

حالا فرض کنید می‌خواهیم به تدریج یک نسخه جدید با رنگ پس‌زمینه بنفش کمرنگ منتشر کنیم.

ابتدا، بیایید نسخه فعلی بژ را طوری تنظیم کنیم که ۱۰۰٪ ترافیک را دریافت کند. این کار تضمین می‌کند که استقرارهای آینده Cloud Function شما هیچ ترافیکی دریافت نکنند. به طور پیش‌فرض، Cloud Functions ترافیک ۱۰۰٪ را به نسخه‌ای با latest پرچم اختصاص می‌دهد. با مشخص کردن دستی اینکه این نسخه فعلی بژ باید تمام ترافیک را دریافت کند، نسخه‌ای با latest پرچم دیگر ۱۰۰٪ ترافیک دریافت نخواهد کرد. به مستندات مراجعه کنید.

# get the revision name

BEIGE_REVISION=$(gcloud run revisions list --service gradual-rollouts-gcf \
  --region $REGION --format 'value(REVISION)')

# now set 100% traffic to that revision

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

خروجی مشابه Traffic: 100% gradual-rollouts-gcf2-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-gcf \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated \
      --update-env-vars BG_COLOR=$BG_COLOR

اگر ترجیح می‌دهید به عنوان یک Cloud Functions نسل دوم مستقر شوید، از دستور زیر استفاده کنید:

# update color

BG_COLOR=lavender

# deploy the function that will not receive any traffic
gcloud functions deploy gradual-rollouts-gcf \
  --gen2 \
  --runtime nodejs20 \
  --entry-point helloHttp \
  --source . \
  --region $REGION \
  --trigger-http \
  --no-allow-unauthenticated \
  --update-env-vars BG_COLOR=$BG_COLOR \
  --tag $BG_COLOR

اکنون متغیر محیطی SERVICE_URL را به‌روزرسانی کنید تا از تابع progressive-rollouts-gcf استفاده کند.

SERVICE_URL=$(gcloud run services describe gradual-rollouts-gcf --platform managed --region $REGION --format 'value(status.url)')

و حالا وقتی سرویس را حلقه می‌کنید

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

رنگ بژ را خواهید دید، اگرچه اسطوخودوس جدیدترین نسخه‌ای بود که به کار گرفته شد.

<html><body style="background-color:beige;"><div><p>Hello from gradual-rollouts-gcf-24jan16-staging-2-00001-kop using color beige</p></div></body></html>

یک نسخه آزمایشی با ترافیک ۰٪ را آزمایش کنید

فرض کنید تأیید کرده‌اید که نسخه شما با موفقیت مستقر شده و ترافیک آن 0٪ است. حتی اگر بررسی‌های سلامت را پشت سر گذاشته باشد، هنوز می‌خواهید تأیید کنید که این نسخه از رنگ پس‌زمینه بنفش کمرنگ استفاده می‌کند.

برای آزمایش نسخه بنفش، می‌توانید یک برچسب به آن نسخه اعمال کنید . برچسب‌گذاری به شما امکان می‌دهد نسخه جدید را مستقیماً در یک URL خاص، بدون ایجاد ترافیک، آزمایش کنید.

ابتدا، آدرس اینترنتی تصویر مربوط به آن نسخه را دریافت کنید.

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

و حالا آن تصویر را با رنگ مرتبط با آن برچسب‌گذاری کنید.

gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated

خروجی مشابه زیر را مشاهده خواهید کرد:

The revision can be reached directly at https://lavender---gradual-rollouts-gcf-k6msmyp47q-lz.a.run.app

حالا می‌توانید این ویرایش را مستقیماً حلقه کنید

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET <DIRECT_REVISION_URL>

و رنگ بنفش کمرنگ را در نتایج ببینید:

<html><body style="background-color:lavender;"><div><p>Hello from gradual-rollouts-gcf-24jan16-00003-xik using color lavender</p></div></body></html>

افزایش تدریجی ترافیک

حالا می‌توانید ارسال ترافیک به نسخه lavender را شروع کنید. مثال زیر نحوه ارسال ۱٪ از ترافیک به lavender را نشان می‌دهد.

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

برای ارسال ۵۰٪ ترافیک به lavender، می‌توانید از همان دستور استفاده کنید، اما به جای آن ۵۰٪ را مشخص کنید.

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

شما باید فهرستی از میزان ترافیک دریافتی هر نسخه را مشاهده کنید.

Traffic:
  50% gradual-rollouts-gcf-00001-hos
  50% gradual-rollouts-gcf-00004-mum
        lavender: https://lavender---gradual-rollouts-gcf-k6msmyp47q-uc.a.run.app

وقتی آماده شدید که رنگ اسطوخودوس را به طور کامل استفاده کنید، می‌توانید اسطوخودوس را روی ۱۰۰٪ تنظیم کنید تا جایگزین رنگ بژ شود.

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

و حالا وقتی آدرس سرویس تابع progressive-rollouts-gcf را ​​مشاهده یا curl می‌کنید،

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

فقط اسطوخودوس خواهید دید.

<html><body style="background-color:lavender;"><div><p>Hello gradual-rollouts-gcf-00004-mum</p></div></body></html>

۵. عقبگردها

فرض کنید بازخورد اولیه تجربه کاربری رسیده است که نشان می‌دهد مشتریان رنگ بژ را به بنفش کمرنگ ترجیح می‌دهند و شما باید به رنگ بژ برگردید.

با اجرای این دستور می‌توانید به نسخه قبلی (بژ) برگردید.

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

و حالا وقتی curl می‌کنید یا از نقطه پایانی URL تابع بازدید می‌کنید،

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

خواهید دید که رنگ بژ برمی‌گردد.

<html><body style="background-color:beige;"><div><p>Hello gradual-rollouts-gcf-00001-hos</p></div></body></html>

می‌توانید در مورد rollbackها در مستندات بیشتر بیاموزید.

۶. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات مربوط به انتشارهای جدید، بازگرداندن‌ها و مهاجرت ترافیک را بررسی کنید.

آنچه ما پوشش داده‌ایم

  • چگونه ترافیک را بین دو یا چند نسخه برای یک تابع Cloud Run تقسیم کنیم
  • چگونه یک نسخه جدید را به تدریج منتشر کنیم
  • نحوه بازگشت به نسخه قبلی

۷. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، (برای مثال، اگر این تابع Cloud Run سهواً بیشتر از تخصیص فراخوانی تابع Cloud ماهانه شما در سطح رایگان فراخوانی شود)، می‌توانید تابع Cloud Run یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید، حذف کنید.

برای حذف یک تابع Cloud Run که در Cloud Run مستقر شده است، به Cloud Run در کنسول Cloud در آدرس https://console.cloud.google.com/functions/ بروید و توابعی را که در این آزمایشگاه کد ایجاد کرده‌اید، حذف کنید.

برای حذف توابع Cloud Run که به عنوان توابع نسل دوم مستقر شده‌اند، به Cloud Functions در Cloud Console در آدرس https://console.cloud.google.com/functions/ بروید و توابعی را که در این codelab ایجاد کرده‌اید، حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه Delete را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.