在多個區域部署服務,並將使用者轉送至最近的區域,即可更快向全球使用者傳回回應。在多個區域部署,可降低延遲時間,並在區域服務中斷時提供更高的可用性。
Cloud Run 服務會部署至個別區域,因此您必須將服務部署至多個區域,然後為服務設定全域負載平衡。
您可以使用 Cloud Run Service Health,自動執行跨區域容錯移轉。
事前準備
- 登入 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.
- 在 Google Cloud 專案中設定 Cloud Run 開發環境。
- 安裝並初始化 gcloud CLI。
- 確認帳戶具備下列 IAM 角色:
- Cloud Run 管理員 (
roles/run.admin) - 專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin) - 服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer)
- Cloud Run 管理員 (
-
前往 Google Cloud 控制台的「IAM」頁面。
前往「IAM」頁面 - 選取專案。
- 按一下「Grant access」(授予存取權)。
-
在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。這通常是指用於部署 Cloud Run 服務的 Google 帳戶電子郵件地址。
- 在「Select a role」(選取角色) 清單中,選取角色。
- 如要授予其他角色,請按一下「Add another role」(新增其他角色),然後選取其他角色。
- 按一下「Save」(儲存)。
- PROJECT_NUMBER 替換為您的 Google Cloud 專案編號。
- 將 PROJECT_ID 替換為 Google Cloud 專案 ID。
- PRINCIPAL 替換為您要新增繫結的帳戶。這通常是用來部署 Cloud Run 服務的 Google 帳戶電子郵件地址。
- ROLE:要新增至部署者帳戶的角色。
- 查看 Cloud Run 定價頁面。您可以使用 Pricing Calculator,根據預測用量估算費用。
- 執行下列指令,啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Compute Engine 和 Network Services API:
授予角色
控制台
gcloud
如要將必要的 IAM 角色授予專案中的帳戶,請按照下列步驟操作:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=PRINCIPAL \ --role=ROLE
更改項目:
gcloud services enable artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ run.googleapis.com \ compute.googleapis.com \ networkservices.googleapis.com
將服務部署至多個區域
您設定的資源調度參數會套用至多個區域。舉例來說,在多區域部署中,執行個體數量下限值適用於多個區域中的每個區域。
您可以使用下列其中一種方法,將同一項服務部署至多個區域:
部署多區域服務
本節說明如何使用單一 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"
location = "global"
multi_region_settings {
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 服務沒有回應或傳回錯誤,下列各節所述的架構不會自動將要求轉送至其他區域。
如要提高多區域服務的可用性,請按照下列步驟操作:
- 運用 Cloud Run 服務健康狀態,自動執行跨區域容錯移轉
- 設定離群值偵測,根據 HTTP 錯誤率找出異常的 Cloud Run 服務,並將部分要求轉送至其他區域。
設定區域網路端點群組
針對您在上一步部署的每個區域,請按照下列操作說明建立無伺服器網路端點群組 (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:服務部署所在的區域。
- 將 SERVICE_NAME 替換為服務名稱。
-
NEG_NAME:網路端點群組資源的名稱,例如
-
針對每個區域重複上述步驟
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
-
為
run_regions變數中指定的每個區域,設定 Cloud Run 服務的網路端點群組,並命名為myservice-neg:
建立全域外部應用程式負載平衡器
建立全域外部應用程式負載平衡器時,您需要建立各種網路資源,並將這些資源連結在一起:
gcloud
- 預留靜態 IP 位址,這樣重新建立負載平衡器時,就不必更新 DNS 記錄。
在上述指令中,將 SERVICE_IP 替換為 IP 位址資源的名稱 (例如gcloud compute addresses create --global SERVICE_IP
myservice-ip)。這個 IP 位址是全域任意傳播 IPv4 位址,會轉送至距離訪客最近的 Google 資料中心或連接點。
-
建立後端服務。
gcloud compute backend-services create \ --global BACKEND_NAME \ --load-balancing-scheme=EXTERNAL_MANAGED
將 BACKEND_NAME 替換為您要為後端服務指定的名稱。例如:
myservice-backend。 -
將網路端點群組新增至後端服務:
gcloud compute backend-services add-backend --global BACKEND_NAME
--network-endpoint-group-region=REGION
--network-endpoint-group=NEG_NAME指定您在上一個步驟中為區域建立的 NEG_NAME。
- 建立網址對應。
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 \ --load-balancing-scheme=EXTERNAL_MANAGED
將 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:
建立目標名稱為
myservice-https-proxy的google_compute_target_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 控制台的使用者介面中,前往資源頁面,確認 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:服務部署所在的區域。
- 將 SERVICE_NAME 替換為服務名稱。
-
NEG_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變數中指定的每個區域,設定 Cloud Run 服務的網路端點群組,並命名為myservice-neg: -
設定後端服務,附加網路端點群組 (
myservice-neg):
設定網域的 DNS 記錄
如要將網域名稱指向您建立的轉送規則,請使用您建立的 IP 位址更新其 DNS 記錄。
執行下列指令,找出負載平衡器的預留 IP 位址:
gcloud compute addresses describe SERVICE_IP \ --global \ --format='value(address)'
將 SERVICE_IP 替換為先前建立的 IP 位址名稱。這個指令會將 IP 位址輸出。
更新網域的 DNS 記錄,方法是新增含有這個 IP 位址的
A記錄。
如果使用已驗證的服務,請設定自訂目標對象
已驗證的服務受 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 找不到網頁」。如需將 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)。 -
使用相同的預留 IP 位址,在通訊埠
80建立轉送規則。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: -
使用相同的預留 IP 位址資源 (
myservice-http-proxy),在通訊埠80上建立轉送規則:
如需其他設定選項,請參閱「設定具備 Cloud Run 的全域外部應用程式負載平衡器」。
透過 Cloud Run Service Health,自動執行跨區域容錯移轉
如要設定多區域、高可用性的 Cloud Run 服務,並為內部或外部流量啟用自動容錯移轉和容錯回復功能,請參閱Service Health 指南。
使用已驗證的 Pub/Sub 推送訂閱項目,並部署至多個區域
根據預設,Pub/Sub 服務會將訊息傳送至與 Pub/Sub 服務儲存訊息相同的 Google Cloud 區域中的推送端點。如要解決這個問題,請參閱「搭配使用經過驗證的 Pub/Sub 推送訂閱項目和多區域 Cloud Run 部署作業」。
設定手動容錯移轉
如要手動設定流量,以便容錯移轉至健康狀態良好的區域,請修改全域外部應用程式負載平衡器網址對應。
如要更新全域外部應用程式負載平衡器網址對應,請使用
--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>。
後續步驟
- 瞭解如何設定 Cloud Run 服務的健康狀態檢查,包括就緒探測。
- 查看 Cloud Run 準備度探測和 Service Health程式碼範例 (以 Go 編寫)。