透過 Cloud Run 服務健康狀態自動執行跨區域容錯移轉

本文說明如何設定及部署高可用性的多區域 Cloud Run 服務,並啟用自動容錯移轉和容錯回復功能。

Cloud Run Service Health 會使用無伺服器網路端點群組 (NEG),公開各區域服務的匯總健康狀態。

運作方式

自動容錯移轉功能會透過區域性無伺服器 NEG,將來自全域外部應用程式負載平衡器或跨區域內部應用程式負載平衡器的傳入要求,轉送至 Cloud Run 服務。個別容器執行個體會執行 readiness 探測,Cloud Run 則會匯總探測結果,判斷各區域服務的整體健康狀態。

如果某個區域中的 Cloud Run 服務有 60% 以上的執行個體通過就緒探測,則該服務健康狀態良好,且會接收流量。如果某個區域健康狀態不良,負載平衡器會自動將流量重新轉送至健康狀態良好的區域。當健康狀態不佳的區域恢復正常後,負載平衡器會逐漸將流量還原至該區域。

限制

Cloud Run 服務健康狀態有下列限制:

  • 您必須為每個區域設定至少一個服務層級或修訂版本層級的執行個體數量下限,才能計算健康狀態。您也可以使用 Cloud Monitoring 中的容器執行個體數量指標,估算區域所需的執行個體數量下限。
  • 容錯移轉至少需要兩個不同區域的服務。否則,如果其中一項服務失敗,系統會顯示錯誤訊息 no healthy upstream。
  • 您無法在無伺服器 NEG 中設定網址遮罩或標記。
  • 如果 Cloud Run 服務遭到刪除,Cloud Run 不會向負載平衡器回報健康狀態不佳。
  • 啟動新執行個體時,不會計入第一次就緒探測,因此要求可能會短暫轉送至新啟動的服務,然後才變成健康狀態不良。
  • Cloud Run Service Health 是根據所有執行個體計算得出。如果修訂版本沒有探測,或新啟動的執行個體尚未完成首次就緒探測,則會視為未知。在修訂版本之間轉移所有流量時,Service Health 可能會短暫回報 UNKNOWN,同時新的執行個體會啟動並完成首次就緒探測。負載平衡器會將不明執行個體視為健康。
  • 如果執行個體快速當機,Service Health 運算可能會產生不準確的結果。

最佳做法

您可以結合使用就緒探測、流量拆分和執行個體數量下限,安全地逐步推出。這樣一來,您就能在單一「canary」區域中驗證新修訂版本的健康狀態,再進行推送,確保負載平衡器只會將流量傳送至健康狀態良好的區域後端。

在自己的應用程式設定探測時,請在服務程式碼中新增 HTTP/1 端點 (Cloud Run 預設,而非 HTTP/2),以回應探測。端點名稱 (例如 /startup、/health 或 /are_you_ready) 必須與探測設定中的 path 相符。HTTP 健康狀態檢查端點可從外部存取,並遵循與任何其他外部公開 HTTP 服務端點相同的原則。

您可以在現有的 Cloud Run 服務上推出服務修訂版本,該服務不使用 readiness 探測或 Cloud Run Service Health。請一次在一個區域執行這項程序,安全地部署新修訂版本:

  1. 在單一「canary」區域中部署新修訂版本,並設定就緒探測。

  2. 將少量流量 (例如 1%) 傳送至新修訂版本。

  3. 在服務層級 (而非修訂版本層級) 使用非零的執行個體數量下限。

  4. 檢查就緒探測指標 (run.googleapis.com/container/instance_count_with_readiness),確保新執行個體健康狀態良好。

  5. 逐步提高新修訂版本的流量百分比。逐步增加流量時,請監控負載平衡器使用的區域 Cloud Run 服務健康狀態指標 (run.googleapis.com/service_health_count)。在足夠的流量轉送至新修訂版本之前,Cloud Run 服務健康狀態會回報 UNKNOWN。

  6. 當修訂版本接收 100% 的流量,且區域性 Cloud Run Service Health 穩定良好時,請對所有其他區域重複這項程序。

如果服務已使用 Cloud Run Service Health,您可以跨區域平行執行兩步驟推出作業,避免回報 UNKNOWN:

  1. 將部分流量轉送至新修訂版本。等待新執行個體啟動並通過就緒探測。

  2. 將 100% 的流量轉送至新修訂版本。

教學課程:設定自動容錯移轉

本教學課程將引導您將 Go 範例應用程式部署至兩個區域、設定具備無伺服器 NEG 的全域外部應用程式負載平衡器,以及測試自動容錯移轉。

在這個教學課程中,您將執行下列操作:

  1. 準備範例應用程式
  2. 在兩個區域部署 Cloud Run 服務,並設定就緒探針
  3. 設定全域外部應用程式負載平衡器
  4. 透過無伺服器 NEG 新增服務
  5. 測試容錯移轉

在本文件中,您會使用下列 Google Cloud計費元件:

您可以使用 Pricing Calculator,根據預測用量估算費用。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

  1. 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. 啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Network Services API 和 Compute Engine API (如有尚未啟用的 API)。

    啟用 API 所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

  7. 安裝並初始化 gcloud CLI。
  8. 更新元件:
    gcloud components update
  9. 設定本教學課程中使用的設定變數:
    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
    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

設定必要角色

如要透過建構作業從來源部署,您或管理員必須將下列 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 用戶端程式庫) 互動,請參閱服務身分設定指南。如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

準備範例應用程式

如要擷取要使用的程式碼範例:

  1. 將範例存放區複製到本機電腦中:

    git clone https://github.com/GoogleCloudPlatform/golang-samples
    
  2. 變更為包含 Cloud Run 程式碼範例的目錄:

    cd golang-samples/run/service-health
    

使用就緒探針,在兩個區域部署 Cloud Run 服務

容錯移轉至少需要兩項服務,且須位於不同區域。如要從來源部署服務,並在兩個不同區域中執行就緒探測,請執行下列指令。如果您偏好使用 Terraform,請參閱「部署多區域服務」,並務必新增就緒探測設定。

  1. 從來源目錄部署 us-west1 和 europe-west1 中的服務 health-example。您至少需要一個執行個體,才能使用就緒探測設定服務健康狀態:

    gcloud run deploy $SERVICE \
    --source=. \
    --regions=$REGION_A,$REGION_B \
    --min=10 \
    --readiness-probe httpGet.path="/are_you_ready"
    
  2. 如果系統提示您安裝必要的 API,請回覆 y。每個專案只需執行一次這項操作。如果您尚未按照「事前準備」一節所述設定預設值,請提供平台和區域,回應其他提示。

設定全域外部應用程式負載平衡器

如要設定全域外部應用程式負載平衡器,在 us-west1 和 europe-west1 之間轉送流量,請按照下列步驟操作。如果您想使用 Terraform 佈建負載平衡器,請參閱「建立全域外部應用程式負載平衡器」。

  1. 建立後端服務:

    gcloud compute backend-services create $SERVICE-bs \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --global
    
  2. 設定全域靜態外部 IP 位址,連線至負載平衡器:

    gcloud compute addresses create $SERVICE-ip \
      --network-tier=PREMIUM \
      --ip-version=IPV4 \
      --global
    
  3. 建立網址對應,將傳入要求轉送至後端服務:

    gcloud compute url-maps create $SERVICE-lb \
      --default-service $SERVICE-bs
    
  4. 建立目標 HTTP Proxy,將要求轉送至網址對應:

    gcloud compute target-http-proxies create $SERVICE-hp \
    --url-map=$SERVICE-lb
    
  5. 建立轉送規則,將傳入要求轉送至 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,請參閱「設定區域網路端點群組」。

  1. 在 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=$SERVICE
    
    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_B \
        --region $REGION_B \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
  2. 將無伺服器 NEG 新增至 us-west1 和 europe-west1 的後端服務,並設為後端:

    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_A \
        --network-endpoint-group-region=$REGION_A
    
    gcloud 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 服務健康狀態,並向負載平衡器回報健康或不健康狀態,請執行下列步驟:

  1. 在多個區域部署 Cloud Run 服務修訂版本,並設定一或多個執行個體數量下限。執行下列指令,使用您在上一個步驟中設定的 readiness 探測:

    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 以上。
  2. 為每個容器執行個體設定 gRPC 或 HTTP 準備度探測。

  3. 設定全域外部應用程式負載平衡器或跨區域內部應用程式負載平衡器,將流量從健康狀態不良的區域轉移出去。

  4. 為各區域中的每個 Cloud Run 服務設定無伺服器 NEG。

  5. 設定後端服務,連線至無伺服器 NEG。

瞭解如何使用就緒探測,將範例 Cloud Run 應用程式部署至兩個區域。

測試及驗證容錯移轉

如要測試容錯移轉,確保 Cloud Run 服務的可靠性和彈性,請按照下列步驟操作:

  1. 執行下列指令,取得負載平衡器的 IP 位址:

    LBIP=$(gcloud compute addresses describe $SERVICE-ip --global --format='value(address)')
    
  2. 選用:如果服務需要驗證,請向負載平衡器傳送要求:

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LBIP
    
  3. 執行 echo $LBIP 指令,取得 LBIP 變數的值。這會輸出負載平衡器的 IP 位址。例如:11.22.33.44

  4. 如要測試容錯移轉,請前往 http://LOAD_BALANCER_IP 網址,其中 LOAD_BALANCER_IP 是您在上一個步驟中取得的值。在「Serving Regions」(服務區域) 部分,按一下您所在區域的切換鈕。這會指定健康狀態良好的區域和提供流量的執行個體:

    透過 Cloud Run Service Health,自動執行跨區域容錯移轉

監控健康狀態檢查

設定 Cloud Run 服務健康狀態後,無伺服器 NEG 會收集 Cloud Monitoring 服務健康狀態指標。您可以查看現有區域性服務的健康狀態。

如果某個區域的服務健康狀態不良,負載平衡器會將流量從健康狀態不良的區域轉移至健康狀態良好的區域。區域恢復正常後,流量就會恢復。

使用已驗證的 Pub/Sub 推送訂閱項目,並部署至多個區域

根據預設,Pub/Sub 服務會將訊息傳送至與 Pub/Sub 服務儲存訊息相同的 Google Cloud 區域中的推送端點。如要解決這個問題,請參閱「搭配使用經過驗證的 Pub/Sub 推送訂閱項目和多區域 Cloud Run 部署作業」。

替代方案:設定手動容錯移轉

如要手動設定流量,在不依賴探測的情況下容錯移轉至健康狀態良好的區域,請修改全域外部應用程式負載平衡器網址對應。

  1. 如要更新全域外部應用程式負載平衡器網址對應,請使用 --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。
  2. 如要確認健康狀態良好的區域現在是否正在提供流量,請前往 https://<domain-name>。

為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您在本教學課程中部署的所有資源。

刪除專案

如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

刪除專案的方法如下:

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

刪除教學課程資源

  1. 刪除您在本教學課程中部署的 Cloud Run 服務。Cloud Run 服務在收到要求前不會產生費用。

    如要刪除 Cloud Run 服務,請執行下列指令:

    gcloud run services delete SERVICE-NAME

    將 SERVICE-NAME 改為您的服務名稱。

    您也可以從Google Cloud 控制台刪除 Cloud Run 服務。

  2. 移除您在教學課程設定期間新增的 gcloud 預設區域設定:

     gcloud config unset run/region
    
  3. 移除專案設定:

     gcloud config unset project
    

後續步驟