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

更新於 發佈於 閱讀時間約 14 分鐘

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
raw-image


  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
raw-image


  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
raw-image


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

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


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


  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
raw-image


漸進式分配流量

  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
raw-image


  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
raw-image


  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
raw-image


  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
raw-image


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


回滾到之前的版本

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


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


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

參考資料

延伸閱讀

程式碼

留言
avatar-img
留言分享你的想法!
avatar-img
Marcos的方格子
19會員
44內容數
歡迎來到「Marcos的方格子」!目前在「Marcos談科技」撰寫在職涯上學習到的知識,在「Marcos談書」分享我在日常的閱讀和心得,歡迎您的到來!!
Marcos的方格子的其他內容
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/21
可觀測性(Observability)是現代架構中的核心能力,透過指標、日誌和分散式追蹤三大支柱,幫助開發者深入理解系統狀態並快速定位問題根源。本篇文章回顧 DevOps Taiwan Meetup 的精彩內容,解析可觀測性與監控的差異、建置流程的四大階段,以及實務應用中的工具選擇與導入時機!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/12/14
本篇文章針對 CKA 認證考試中常見的實作題目,提供詳細解題流程與指令範例。內容基於 examtopic 題目解析,幫助考生掌握實作技能與應試技巧,快速提升 Kubernetes 操作能力,為通過 CKA 考試做好萬全準備!
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
2024/09/17
如何一年內考取 Google Cloud 所有雲端證照
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News