2024-05-18|閱讀時間 ‧ 約 34 分鐘

使用 Cloud Functions 2nd Gen 進行流量拆分、漸進式部署和回滾版本

Overview

Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。

前置作業

  1. 啟用 Cloud Shell

有兩種方法。可以從 console 的右上角打開終端機或是到 https://shell.cloud.google.com/ 會打開純文字的 shell 介面

  1. PROJECT 的設定和身分驗證
gcloud auth list
# 驗證身分
gcloud config list project
# 確認當下要使用的 PROJECT
gcloud config set project <Project ID>
# 更改要使用的 PROJECT
gcloud services enable cloudfunctions.googleapis.com
# 開啟 Cloud Function API

創建 Cloud Function (Traffic Splitting)

  1. 建立並進入工作資料夾
mkdir revisions-gcf-codelab && cd $_
REGION=<YOUR_REGION>
PROJECT_ID=<YOUR-PROJECT-ID>
BG_COLOR=darkseagreen # 實作更換 BG_COLOR ,代表不同版本的 Revisions

REGION=us-east1
PROJECT_ID=solution-marcos-01
BG_COLOR=darkseagreen
  1. 新增檔案 package.json

cat <<EOF >> package.json
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
EOF

  1. 新增檔案 index.js

cat <<EOF >> 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('helloHttp', (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>');
});
EOF

  1. 部屬 Cloud Function (traffic-splitting-gcf)
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


  1. 使用 curl 指令測試剛部屬的 Cloud Function,看見的結果是返回 darkseagreen
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


  1. 現在部屬另外一個 revision 使用 tan作為 background color:
# update the env var
BG_COLOR=tan

# deploy the function
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
  1. 重新使用 curl 指令呼叫 Cloud Fuction 的 endpoint,會返回 tan
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL


進行 50-50 各半的流量拆分

  1. 使用指令取得 revision IDs:
gcloud run revisions list --service traffic-splitting-gcf \\
--region $REGION --format 'value(REVISION)'


  1. 使用指令進行流量拆分,<> 內的 REVISION 要改為剛剛取得的 revision IDs:
gcloud run services update-traffic traffic-splitting-gcf \\
--region $REGION \\
--to-revisions <REVISION1>=50,<REVISION2>=50


  1. 使用迴圈呼叫服務的端點 10 次,確認流量拆分成功:
for i in {1..10}; do
echo -e $i "times\\n"
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" $SERVICE_URL
echo -e "\\n"
sleep 1
done


漸進式分配流量

  1. 部屬一個新的 Cloud Function (gradual-rollouts-gcf) ,將 BG_COLOR 先設為 beige
# 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


  1. 先將流量 100% 切回 BG_COLOR=beige 的 REVISION
# 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


  1. 更新 BG_COLOR 為 lavender,新增一個 lavender 的 REVISION
# 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


  1. 即使 lavender REVISION 是最新的版本,但是呼叫端點可以看到流量都還是在 beige REVISION
# get Cloud Function (gradual-rollouts-gcf)'s enpoint
SERVICE_URL2=$(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_URL2


  1. 取得 gradual-rollouts-gcf 的 image URL
IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')
  1. 使用 BG_COLOR 為 lavender 作為 tag 標記新部屬版本的 gradual-rollouts-gcf
gcloud run deploy gradual-rollouts-gcf --image $IMAGE_URL --no-traffic --tag $BG_COLOR --region $REGION --no-allow-unauthenticated
  1. 現在可以開始對 lavender Revision,逐漸分配流量。使用指令分配 1% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1


  1. 使用指令分配 50% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=50
  1. 使用指令分配 100% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=100


  1. 呼叫端點可以看到流量都是在 lavender REVISION
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL2


回滾到之前的版本

  1. 使用指令回滾到之前的版本 beige revision
gcloud run services update-traffic gradual-rollouts-gcf --to-revisions $BEIGE_REVISION=100 --region $REGION


  1. 呼叫端點可以看到返回 beige 的結果
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL2


如果你喜歡這篇文章歡迎幫我按愛心鼓勵一下喔!~閱讀愉快!~

參考資料

延伸閱讀

程式碼

分享至
成為作者繼續創作的動力吧!
歡迎來到「Marcos談科技」,在這裡,我分享自己在工作上學到的知識和經驗,以及對於最新科技趨勢的觀察和見解。我致力於以清晰易懂的方式分享複雜的科技概念,讓每位讀者都能輕鬆跟上科技的步伐。
© 2024 vocus All rights reserved.