Overview
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
前置作業
- 啟用 Cloud Shell
有兩種方法。可以從 console 的右上角打開終端機或是到 https://shell.cloud.google.com/ 會打開純文字的 shell 介面
- 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)
- 建立並進入工作資料夾
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
- 新增檔案 package.json
cat <<EOF >> package.json
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
EOF
- 新增檔案 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
- 部屬 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

- 使用 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

- 現在部屬另外一個 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
- 重新使用 curl 指令呼叫 Cloud Fuction 的 endpoint,會返回
tan
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

進行 50-50 各半的流量拆分
- 使用指令取得 revision IDs:
gcloud run revisions list --service traffic-splitting-gcf \\
--region $REGION --format 'value(REVISION)'

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

- 使用迴圈呼叫服務的端點 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

漸進式分配流量
- 部屬一個新的 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
- 先將流量 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

- 更新 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
- 即使 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

- 取得 gradual-rollouts-gcf 的 image URL
IMAGE_URL=$(gcloud run services describe gradual-rollouts-gcf --region $REGION --format 'value(IMAGE)')
- 使用 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
- 現在可以開始對 lavender Revision,逐漸分配流量。使用指令分配 1% 流量到 tag=lavender 的版本
gcloud run services update-traffic gradual-rollouts-gcf --region $REGION --to-tags lavender=1

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

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

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

- 呼叫端點可以看到返回 beige 的結果
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL2
如果你喜歡這篇文章歡迎幫我按愛心鼓勵一下喔!~閱讀愉快!~
參考資料
延伸閱讀
- https://cloud.google.com/run/docs/rollouts-rollbacks-traffic-migration
- https://cloud.google.com/sdk/gcloud/reference/run/services/update-traffic