本文說明如何設定及部署高可用性的多區域 Cloud Run 服務,並具備自動容錯移轉和容錯回復功能。
Cloud Run 服務健康狀態會使用無伺服器網路端點群組 (NEG),顯示每個區域中服務的匯總健康狀態。
如要轉送公開 (外部) 流量,請使用全域外部應用程式負載平衡器設定服務健康狀態。
如要轉送私人 (內部) 流量,請使用跨區域內部應用程式負載平衡器設定服務健康狀態。
運作方式
自動容錯移轉會透過區域無伺服器 NEG,將全域外部應用程式負載平衡器或跨區域內部應用程式負載平衡器的傳入要求,轉送至 Cloud Run 服務。個別容器執行個體會執行準備狀態探測作業,Cloud Run 會彙整這些作業,判斷每個區域服務的整體健康狀態。
如果區域中的 Cloud Run 服務有 60% 以上的執行個體通過準備狀態探查,該服務就會處於健康狀態並接收流量。如果某個區域健康狀態不佳,負載平衡器會自動將流量重新導向至健康狀態良好的區域。健康狀態不良的區域恢復正常後,負載平衡器就會逐步將流量導向該區域。
限制
Cloud Run 服務健康狀態有以下限制:
- 您必須為每個區域設定至少一個服務層級或修訂版本層級的最低執行個體,才能計算健康狀態。您也可以使用 Cloud Monitoring 中的「容器執行個體計數」指標,估算各區域所需的執行個體數量下限。
- 如要進行容錯移轉,至少需要兩個不同區域的服務。否則,如果其中一項服務失敗,系統會顯示
no healthy upstream錯誤訊息。 - 您無法在無伺服器 NEG 中設定網址遮罩或標記。
- 您無法從後端服務或負載平衡器啟用 IAP。直接透過 Cloud Run 啟用 IAP。
- 如果刪除 Cloud Run 服務,Cloud Run 不會向負載平衡器回報健康狀態不良。
- 啟動新執行個體時,系統不會計入第一次完備性探測,因此要求可能會短暫路由至新啟動的服務,然後才變成不健全。
- 系統會計算所有執行個體的 Cloud Run 服務健康狀態。沒有探針的修訂版本會視為不明。負載平衡器會將不明執行個體視為健康狀態良好。
- 如果執行個體快速當機,服務健康狀態計算可能會產生不準確的結果。
最佳做法
您可以結合使用就緒探查、流量分配和最低執行個體數,逐步安全地推出新版本。這樣一來,您就能在單一「 Canary」區域中驗證新修訂版本的健康狀態,再進行升級,確保負載平衡器只會將流量傳送至健康狀態良好的區域後端。
在自己的應用程式上設定探查時,請在服務程式碼中新增 HTTP/1 端點 (Cloud Run 預設端點,而非 HTTP/2),以回應探查。端點名稱 (例如 /startup、/health 或 /are_you_ready) 必須與探測設定中的 path 相符。HTTP 健康狀態檢查端點可從外部存取,並遵循與其他外部公開 HTTP 服務端點相同的原則。
建議的推出程序
您可以在未使用就緒探查或 Cloud Run 服務健康狀態的現有 Cloud Run 服務上,推出服務修訂版本。請一次處理一個區域,安全部署新修訂版本:
在單一「Canary」區域中部署新修訂版本,並設定就緒探查。
將少量流量 (例如 1%) 傳送至新修訂版本。
請在服務層級使用非零的執行個體數量下限,而非在修訂版本層級。
檢查就緒探測指標 (
run.googleapis.com/container/instance_count_with_readiness),確保新執行個體健康狀態良好。逐步提高新修訂版本的流量百分比。逐步增加流量時,請監控負載平衡器使用的區域 Cloud Run 服務健康狀態指標 (
run.googleapis.com/service_health_count)。Cloud Run 服務健康狀態報告UNKNOWN,直到有足夠的流量導向新修訂版本為止。修訂版本收到 100% 的流量,且區域 Cloud Run 服務健康狀態穩定良好後,請為所有其他區域重複此程序。
教學課程:設定自動容錯移轉
本教學課程會逐步引導您將 Go 範例應用程式部署至兩個區域、設定具備無伺服器 NEG 的全域外部應用程式負載平衡器,以及測試自動容錯移轉。
在這個教學課程中,您將執行下列操作:
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Network Services API 和 Compute Engine API。
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。- 安裝並初始化 gcloud CLI。
- 更新元件:
gcloud components update
- 設定本教學課程中使用的設定變數:
將 PROJECT_ID 替換為您的 Google Cloud 專案 ID。PROJECT_ID= gcloud config set core/project PROJECT_ID PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") SERVICE=health-example REGION_A=us-west1 REGION_B=europe-west1
設定必要角色
如要透過建構程序從來源部署,您或管理員必須將下列 IAM 角色授予 Cloud Build 服務帳戶。
按一下即可查看 Cloud Build 服務帳戶的必要角色
根據預設,Cloud Build 會自動使用預設的 Compute Engine 服務帳戶做為預設的 Cloud Build 服務帳戶,建構您的原始碼和 Cloud Run 資源,除非您覆寫這項行為。如要讓 Cloud Build 建構來源,請要求管理員將 Cloud Run 建構工具 (roles/run.builder) 授予專案的 Compute Engine 預設服務帳戶:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.builder
請將 PROJECT_NUMBER 替換為您的 Google Cloud專案編號,並將 PROJECT_ID 替換為您的 Google Cloud專案 ID。如需如何找出專案 ID 和專案編號的詳細操作說明,請參閱「建立及管理專案」。
將 Cloud Run 建構工具角色授予 Compute Engine 預設服務帳戶後,需要幾分鐘才能傳播。
如要取得服務身分存取檔案和 Cloud Storage bucket 時所需的權限,請要求管理員授予服務身分「Storage 管理員」(roles/storage.admin) 角色。如要進一步瞭解 Cloud Storage 角色和權限,請參閱「Cloud Storage 的 IAM」。
如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。
準備範例應用程式
如要擷取要使用的程式碼範例:
將範例存放區複製到本機電腦中:
git clone https://github.com/GoogleCloudPlatform/golang-samples變更為包含 Cloud Run 範例程式碼的目錄:
cd golang-samples/run/service-health
在兩個區域中部署 Cloud Run 服務,並使用就緒探查
如要進行容錯移轉,至少需要兩個服務,且這兩個服務必須位於不同區域。如要從兩個不同區域的來源部署服務,並使用就緒探查,請執行下列指令。如要使用 Terraform,請參閱「部署多區域服務」,並務必新增就緒探查設定。
在來源目錄中部署服務
health-example(位於us-west1和europe-west1)。如要使用準備探測設定服務健康狀態,您至少需要一個執行個體:gcloud run deploy $SERVICE \ --source=. \ --regions=$REGION_A,$REGION_B \ --min=10 \ --readiness-probe httpGet.path="/are_you_ready"系統會提示您安裝必要 API,請在收到提示時輸入
y。這項操作只需要為專案執行一次。如果尚未如「事前準備」一節所述,為平台和區域設定預設值,請提供這些資訊,回應其他提示。
設定全域外部應用程式負載平衡器
如要設定全域外部應用程式負載平衡器,在 us-west1 和 europe-west1 之間轉送流量,請按照下列步驟操作。如要使用 Terraform 佈建負載平衡器,請參閱「建立全域外部應用程式負載平衡器」。
建立後端服務:
gcloud compute backend-services create $SERVICE-bs \ --load-balancing-scheme=EXTERNAL_MANAGED \ --global設定全域靜態外部 IP 位址,連線至負載平衡器:
gcloud compute addresses create $SERVICE-ip \ --network-tier=PREMIUM \ --ip-version=IPV4 \ --global建立網址對應,將傳入要求轉送至後端服務:
gcloud compute url-maps create $SERVICE-lb \ --default-service $SERVICE-bs建立目標 HTTP Proxy,將要求轉送至網址對應:
gcloud compute target-http-proxies create $SERVICE-hp \ --url-map=$SERVICE-lb建立轉送規則,將傳入要求轉送至 Proxy:
gcloud compute forwarding-rules create $SERVICE-fr \ --load-balancing-scheme=EXTERNAL_MANAGED \ --network-tier=PREMIUM \ --address=$SERVICE-ip \ --target-http-proxy=$SERVICE-hp \ --global \ --ports=80
透過無伺服器 NEG 新增服務
如要使用無伺服器 NEG 新增在 us-west1 和 europe-west1 中部署的服務,請按照下列步驟操作。如要使用 Terraform 佈建無伺服器 NEG,請參閱「設定區域網路端點群組」。
在
us-west1和europe-west1中,為 Cloud Run 服務建立無伺服器網路端點群組 (NEG):gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_A \ --region $REGION_A \ --network-endpoint-type=serverless \ --cloud-run-service=$SERVICEgcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_B \ --region $REGION_B \ --network-endpoint-type=serverless \ --cloud-run-service=$SERVICE在
us-west1和europe-west1中,將無伺服器 NEG 新增至後端服務並設為後端:gcloud compute backend-services add-backend $SERVICE-bs \ --global \ --network-endpoint-group=$SERVICE-neg-$REGION_A \ --network-endpoint-group-region=$REGION_Agcloud compute backend-services add-backend $SERVICE-bs \ --global \ --network-endpoint-group=$SERVICE-neg-$REGION_B \ --network-endpoint-group-region=$REGION_B
如需其他設定選項,請參閱「設定具備 Cloud Run 的全域外部應用程式負載平衡器」。
回報區域健康狀態
如要匯總區域 Cloud Run 服務健康狀態,並向負載平衡器回報健康或不健康狀態,請執行下列步驟:
在多個區域中部署 Cloud Run 服務修訂版本,並設定一或多個執行個體數量下限。執行下列指令,使用您在上一個步驟中設定的就緒探測:
gcloud run deploy
SERVICE_NAME\ --regions=REGION_A,REGION_B\ --min=MIN_INSTANCES更改下列內容:
- SERVICE_NAME:服務名稱。
- REGION_A、REGION_B:服務修訂版本的不同區域。舉例來說,將 REGION_A 設為
us-central1,並將 REGION_B 設為europe-west1。 - MIN_INSTANCES:要保持暖機狀態的容器執行個體數量,隨時準備接收要求。最低值必須設為 1 以上。
在每個容器執行個體上設定 gRPC 或 HTTP 就緒探測器。
設定全域外部應用程式負載平衡器或跨區域內部應用程式負載平衡器,將流量從健康狀態不良的區域轉移。
為每個區域中的每項 Cloud Run 服務設定無伺服器 NEG。
設定後端服務,以便與無伺服器 NEG 連線。
瞭解如何將範例 Cloud Run 應用程式部署至兩個區域,並使用就緒探針。
測試及驗證容錯移轉
如要測試容錯移轉,確保 Cloud Run 服務的可靠性和復原能力,請按照下列步驟操作:
執行下列指令,取得負載平衡器的 IP 位址:
LBIP=$(gcloud compute addresses describe $SERVICE-ip --global --format='value(address)')選用:如果服務需要驗證,請將要求傳送至負載平衡器:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LBIP執行
echo $LBIP指令,取得 LBIP 變數的值。這會輸出負載平衡器的 IP 位址。例如:11.22.33.44如要測試容錯移轉,請前往
http://LOAD_BALANCER_IP網址,其中 LOAD_BALANCER_IP 是您在上一個步驟中取得的值。在「放送區域」部分中,按一下區域的切換按鈕。這會指定健康狀態良好的區域,以及處理流量的執行個體:
監控健康檢查
設定 Cloud Run 服務健康狀態後,無伺服器 NEG 會收集 Cloud Monitoring 服務健康狀態指標。您可以查看現有區域服務的健康狀態。
如果某個區域的服務健康狀態不佳,負載平衡器會將流量從該區域轉移至健康狀態良好的區域。地區恢復正常後,流量就會恢復。
在多區域部署中,使用經過驗證的 Pub/Sub 推送訂閱項目
根據預設,Pub/Sub 服務會將訊息傳送至與 Pub/Sub 服務儲存訊息的 Google Cloud 區域相同的推送端點。如要解決這個問題,請參閱「搭配多區域 Cloud Run 部署作業使用已驗證的 Pub/Sub 推送訂閱項目」。
替代做法:設定手動容錯移轉
如要手動設定流量,在不依賴探測的情況下容錯移轉至健康狀態良好的區域,請修改全域外部應用程式負載平衡器網址對應。
如要更新全域外部應用程式負載平衡器網址對應,請使用
--global旗標,從後端服務移除 NEG:gcloud compute backend-services remove-backend
BACKEND_NAME\ --network-endpoint-group=NEG_NAME\ --network-endpoint-group-region=REGION\ --global更改下列內容:
BACKEND_NAME:後端服務的名稱。NEG_NAME:網路端點群組資源的名稱,例如myservice-neg-uscentral1。REGION:建立 NEG 的區域,以及您要從中移除服務的區域。例如:us-central1,asia-east1。
如要確認健康狀態良好的區域現在正在處理流量,請前往 https://
<domain-name>。
為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您在本教學課程中部署的所有資源。
刪除專案
如果您是為了這個教學課程建立新專案,請刪除該專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除教學課程資源
刪除您在本教學課程中部署的 Cloud Run 服務。Cloud Run 服務收到要求後才會產生費用。
如要刪除 Cloud Run 服務,請執行下列指令:
gcloud run services delete SERVICE-NAME
將 SERVICE-NAME 改為您的服務名稱。
您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的
gcloud預設區域設定:gcloud config unset run/region移除專案設定:
gcloud config unset project
後續步驟
- 進一步瞭解如何為 Cloud Run 服務設定健康狀態檢查。
- 深入瞭解如何設定全域外部應用程式負載平衡器搭配 Cloud Run。
- 探索其他產品中的多區域設定,例如 Spanner 多區域和 Cloud Storage 位置。