在多個區域部署服務,並將使用者導向最近的區域,即可更快回覆全球各地的使用者。部署到多個地區可降低延遲時間,並在發生地區性服務中斷時,提供更高的可用性。
由於 Cloud Run 服務會部署到個別區域,因此您必須將服務部署到多個區域,然後為服務設定全域負載平衡。
將服務部署至多個區域
您設定的資源調度參數會套用至多個區域。舉例來說,在多區域部署作業中,每個區域的執行個體數量下限都適用。
您可以透過下列其中一種方法,將相同服務部署至多個區域:
部署多區域服務
本節說明如何透過單一 gcloud CLI 指令,或使用 YAML 或 Terraform 檔案,部署及設定多區域服務。
gcloud
- 如要建立及部署多區域服務,請使用 - --regions旗標執行- gcloud run deploy指令:- gcloud run deploy - SERVICE_NAME\ --image=- IMAGE_URL\ --regions=- REGIONS- 更改下列內容: - SERVICE_NAME:要部署的多區域服務名稱。
- IMAGE_URL:容器映像檔的參照,例如- us-docker.pkg.dev/cloudrun/container/hello:latest。
- REGIONS:要部署的多個區域清單。例如:- europe-west1,asia-east1。
 
YAML
- 使用 - run.googleapis.com/regions屬性設定要部署服務的多個區域,然後建立服務的 YAML 檔案:- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: - SERVICE_NAMEannotations: run.googleapis.com/regions:- REGIONSspec: template: spec: containers: - image:- IMAGE_URL- 更改下列內容: - SERVICE_NAME:要部署至的多區域服務名稱。
- REGIONS:要更新的多個區域清單。例如:- europe-west1,asia-east1。
- IMAGE_URL:容器映像檔的參照,例如- us-docker.pkg.dev/cloudrun/container/hello:latest。
 
- 使用下列指令建立服務: - gcloud run multi-region-services replace service.yaml 
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源。
resource "google_cloud_run_v2_service" "default" {
name     = "cloudrun-service-multi-region"
regions = [
    "REGION_1",
    "REGION_2",
  ]
template {
  containers {
    image = "us-docker.pkg.dev/cloudrun/container/hello"
  }
}
}
將 "REGION_1" - "REGION_2" 替換為所需的每個Google Cloud 區域。例如 europe-west1 和 us-central1。
更新多區域服務
本節說明如何透過單一 gcloud CLI 指令或 YAML 檔案,在多區域服務中新增或移除區域。
gcloud
如要從多區域服務新增或移除區域,請執行 gcloud run multi-region-services update 指令。
- 如要將多地區服務新增至其他一或多個地區,請使用 - --add-regions旗標:- gcloud run multi-region-services update - SERVICE_NAME\ --add-regions=- REGIONS
- 如要從一或多個區域移除多區域服務,請使用 - --remove-regions旗標:- gcloud run multi-region-services update - SERVICE_NAME\ --remove-regions=- REGIONS- 更改下列內容: - SERVICE_NAME:要更新的多區域服務名稱。
- REGIONS:要新增或移除服務的區域。例如:- us-central1,asia-east1。
 
YAML
- 如要更新現有的多區域服務,請下載其 YAML 設定: - gcloud run multi-region-services describe SERVICE_NAME --format export > service.yaml 
- 更新 - run.googleapis.com/regions屬性,新增或移除要部署服務的區域清單:- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: - SERVICE_NAMEannotations: run.googleapis.com/regions:- REGIONS- 更改下列內容: - SERVICE_NAME:要部署至的多區域服務名稱。
- REGIONS:服務修訂版本要部署到的新多個區域清單。
 
- 使用下列指令更新服務: - gcloud run multi-region-services replace service.yaml 
刪除多區域服務
- 如要刪除多區域服務,請執行 - gcloud run multi-region-services delete指令:- gcloud run multi-region-services delete - SERVICE_NAME- 將 - SERVICE_NAME替換為要刪除的多區域服務名稱。
設定全域負載平衡
本節說明如何設定外部應用程式負載平衡器,並使用以代管 TLS 憑證保護的網域,指向全域任播 IP 位址,將使用者導向部署服務的最近 Google 資料中心。
如果區域性 Cloud Run 服務停止回應或傳回錯誤,下列各節所述的架構不會自動將要求轉送至其他區域。如要提高多區域服務的可用性,可以設定離群值偵測,根據 HTTP 錯誤率找出狀況不佳的 Cloud Run 服務,並將部分要求轉送至其他區域。
建立負載平衡器
建立外部應用程式負載平衡器時,需要建立各種網路資源,並將這些資源連結在一起:
gcloud CLI
- 預留靜態 IP 位址,這樣在重新建立負載平衡器時,就不必更新 DNS 記錄。
gcloud compute addresses create --global SERVICE_IP myservice-ip)。這個 IP 位址是全域任播 IPv4 位址,會將流量轉送至最靠近訪客的 Google 資料中心或服務點。 
- 
建立後端服務。
gcloud compute backend-services create --global BACKEND_NAME 在上述指令中,將 BACKEND_NAME 替換為您要授予後端服務的名稱 (例如 myservice-backend)。
- 建立網址對應。
gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME 將 URLMAP_NAME 替換為您要授予網址對應的名稱 (例如 myservice-urlmap)。
- 為網域建立代管的傳輸層安全標準 (TLS) 憑證,以提供 HTTPS 流量。(將 example.com 替換成您的網域名稱)。
gcloud compute ssl-certificates create CERT_NAME \ --domains=example.com 將 CERT_NAME 替換為您要為代管 SSL 憑證指定的名稱 (例如 myservice-cert)。
- 建立目標 HTTPS Proxy。
gcloud compute target-https-proxies create HTTPS_PROXY_NAME \ --ssl-certificates=CERT_NAME \ --url-map=URLMAP_NAME 將 HTTPS_PROXY_NAME 替換為目標 HTTPS Proxy 的名稱 (例如 myservice-https)。
- 建立轉送規則,將您建立的網路資源連結至 IP 位址。
gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \ --target-https-proxy=HTTPS_PROXY_NAME \ --address=SERVICE_IP \ --ports=443 將 FORWARDING_RULE_NAME 替換為要建立的轉送規則資源名稱 (例如 myservice-lb)。
Terraform
除了本節所述步驟,您也可以使用全域 HTTP 負載平衡器 Terraform 模組。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
- 
          設定 IP 位址: 將 IP 位址資源名稱設為 myservice-service-ip。你可以將這個值變更為自己的值。 這個 IP 位址是全域任播 IPv4 位址,會將流量轉送至最靠近訪客的 Google 資料中心或服務點。
- 
          建立及設定後端服務: 這項資源會將後端服務命名為 myservice-backend。你可以將這個值變更為自己的值。
- 
          設定網址對應: 將後端服務資源 ( myservice-backend) 連線至新的網址對應資源 (myservice-lb-urlmap)。您可以將這些值變更為自己的值。
- 
          為網域建立代管的 TLS 憑證,以提供 HTTPS 流量。在 google_compute_managed_ssl_certificate資源中,將example.com替換成您的網域名稱:
- 
          設定 HTTPS Proxy: 建立 google_compute_target_https_proxy資源,目標名稱為myservice-https-proxy,並連結先前建立的 TLS 憑證 (myservice-ssl-cert) 和網址對應資源 (myservice-lb-urlmap)。您可以將這些值變更為自己的值。
- 
          設定轉送規則: 使用目標名稱 myservice-https-proxy建立google_compute_global_forwarding_rule資源,並連結先前建立的 HTTPS Proxy 目標 (myservice-https-proxy) 和 IP 位址資源 (myservice-service-ip)。您可以將這些值變更為自己的值。
- 
          套用這項設定: 如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。 準備 Cloud Shell- 啟動 Cloud Shell。
- 
    設定要套用 Terraform 設定的預設 Google Cloud 專案。 每項專案只需要執行一次這個指令,且可以在任何目錄中執行。 export GOOGLE_CLOUD_PROJECT=PROJECT_ID 如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。 
 準備目錄每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。 - 
    在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱的副檔名必須是 .tf,例如main.tf。在本教學課程中,這個檔案稱為main.tf。mkdir DIRECTORY && cd DIRECTORY && touch main.tf 
- 
    如果您正在學習教學課程,可以複製每個章節或步驟中的範例程式碼。 將範例程式碼複製到新建立的 main.tf。視需要從 GitHub 複製程式碼。如果 Terraform 代码片段是端對端解決方案的一部分,建議使用這個方法。 
- 查看並修改範例參數,套用至您的環境。
- 儲存變更。
- 
    初始化 Terraform。每個目錄只需執行一次這項操作。
    terraform init 如要使用最新版 Google 供應商,請加入 -upgrade選項:terraform init -upgrade 
 套用變更- 
    檢查設定,確認 Terraform 即將建立或更新的資源符合您的預期:terraform plan 視需要修正設定。 
- 
    執行下列指令,並在提示中輸入 yes,即可套用 Terraform 設定:terraform apply 等待 Terraform 顯示「Apply complete!」訊息。 
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
 
設定區域網路端點群組
針對上一個步驟中部署的每個區域,您必須建立無伺服器網路端點群組 (NEG),並按照下列操作說明將其新增至後端服務:
gcloud CLI
- 
        在 REGION中為 Cloud Run 服務建立網路端點群組:gcloud compute network-endpoint-groups create NEG_NAME \ --region=REGION \ --network-endpoint-type=SERVERLESS \ --cloud-run-service=SERVICE_NAME 更改下列內容: - NEG_NAME 替換為網路端點群組資源的名稱。 (例如 `myservice-neg-uscentral1`)
- 將 REGION 改為服務部署的 [region][loc]。
- SERVICE_NAME 改為您的服務名稱。
 
- 
        將網路端點群組新增至後端服務: gcloud compute backend-services add-backend --global BACKEND_NAME \ --network-endpoint-group-region=REGION \ --network-endpoint-group=NEG_NAME 為區域指定您在上一步中建立的 NEG_NAME。 
- 
        針對每個區域重複上述步驟。 
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
- 
          為 run_regions變數中指定的每個區域,設定名為myservice-neg的 Cloud Run 服務網路端點群組:
- 
          設定後端服務,附加網路端點群組 ( myservice-neg):
設定網域的 DNS 記錄
如要將網域名稱指向您建立的轉送規則,請使用您建立的 IP 位址更新網域名稱的 DNS 記錄。
- 執行下列指令,找出負載平衡器的預留 IP 位址: - gcloud compute addresses describe SERVICE_IP \ --global \ --format='value(address)' - 將 SERVICE_IP 替換為您先前建立的 IP 位址名稱。這個指令會將 IP 位址列印至輸出內容。 
- 新增含有這個 IP 位址的 - A記錄,更新網域的 DNS 記錄。
如果使用已驗證的服務,請設定自訂目標對象
通過驗證的服務會受到 IAM 保護。 這類 Cloud Run 服務需要用戶端驗證,在產生憑證時聲明要求的預期收件者 (即對象)。
目標對象通常是目標服務的完整網址,Cloud Run 服務預設會產生以 run.app 結尾的網址。不過,在多區域部署中,用戶端無法預先得知要求會傳送至哪個區域服務。因此,如果是多區域部署,請將服務設定為使用自訂目標對象。
等待負載平衡器完成佈建
使用負載平衡器 IP 位址設定網域後,請等待 DNS 記錄傳播。同樣地,請等待系統為網域核發受管理的 TLS 憑證,並準備好在全球提供 HTTPS 流量。
負載平衡器最多可能需要 30 分鐘才會開始放送流量。
準備就緒後,請前往網站網址並加上 https:// 前置字元,即可試用。
核對狀態
- 如要檢查 DNS 記錄的傳播狀態,請使用 - dig指令列公用程式:- dig A +short example.com - 輸出內容會顯示您在 DNS 記錄中設定的 IP 位址。 
- 執行下列指令,檢查受管理憑證的核發狀態: - gcloud compute ssl-certificates describe CERT_NAME - 將 CERT_NAME 換成您先前為 SSL 憑證資源選擇的名稱。 - 輸出結果會顯示包含 - status: ACTIVE的一行。
設定 HTTP 至 HTTPS 的重新導向
根據預設,轉送規則只會處理單一通訊協定,因此對 http:// 端點的要求會收到「404 Not Found」回應。如需將對 http:// 網址的要求重新導向至 https:// 協定,請按照下列操作說明建立額外的網址對應和轉送規則:
gcloud CLI
- 
        建立含有重新導向規則的網址對應。 gcloud compute url-maps import HTTP_URLMAP_NAME \ --global \ --source /dev/stdin <<EOF name: HTTP_URLMAP_NAME defaultUrlRedirect: redirectResponseCode: MOVED_PERMANENTLY_DEFAULT httpsRedirect: True EOF 將 HTTP_URLMAP_NAME 替換為您要建立的網址對應資源名稱 (例如 myservice-httpredirect)。
- 
        使用網址對應建立目標 HTTP Proxy。 gcloud compute target-http-proxies create HTTP_PROXY_NAME \ --url-map=HTTP_URLMAP_NAME 將 HTTP_PROXY_NAME 替換為您要建立的目標 HTTP Proxy 名稱 (例如 myservice-http)。
- 
        在通訊埠 80上建立轉送規則,並使用相同的保留 IP 位址。gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \ --target-http-proxy=HTTP_PROXY_NAME \ --address=SERVICE_IP \ --ports=80 將 HTTP_FORWARDING_RULE_NAME 替換為您要建立的新轉送規則名稱 (例如 myservice-httplb)。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
- 
          使用重新導向規則建立網址對應資源: 
- 
          使用新建立的網址對應資源 ( myservice-https-urlmap) 建立目標 HTTP Proxy:
- 
          在通訊埠 80上建立轉送規則,並使用相同的保留 IP 位址資源 (myservice-http-proxy):
在多區域部署中,使用經過驗證的 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>。