本文說明如何建立跨區域內部應用程式負載平衡器,將靜態內容的要求轉送至 Cloud Storage 值區。
事前準備
請確認設定符合下列先決條件。
安裝 Google Cloud CLI
本指南中的部分操作說明只能使用 Google Cloud CLI 執行。如要安裝,請參閱「安裝 gcloud CLI」一文。
您可以在 API 和 gcloud CLI 參考資料文件中找到與負載平衡相關的指令。
權限
如要按照本指南操作,您必須在專案中建立 Cloud Storage bucket 和網路資源。您必須是專案擁有者或編輯者,或是必須具有下列 Compute Engine 身分與存取權管理角色:
工作 | 必要角色 |
---|---|
建立網路、子網路和負載平衡器元件 | Compute 網路管理員角色 (roles/compute.networkAdmin )
|
新增與移除防火牆規則 | Compute 安全管理員角色 (roles/compute.securityAdmin )
|
建立 Cloud Storage 值區 | Storage 物件管理員角色 (roles/storage.objectAdmin )
|
詳情請參閱下列指南:
設定 SSL 憑證資源
如果跨區域內部應用程式負載平衡器使用 HTTPS 做為要求和回應通訊協定,請使用 Certificate Manager 建立 SSL 憑證資源,如以下文件所述:
建立憑證後,您可以將憑證附加至 HTTPS 目標 Proxy。
建議使用 Google 代管的憑證。
限制
當 Cloud Storage 值區做為跨區域內部應用程式負載平衡器的後端時,有下列限制:
系統不支援私有值區存取權,因此後端值區必須可透過網際網路公開存取。
系統不支援簽署網址。
為跨區域內部應用程式負載平衡器建立後端值區時,無法整合 Cloud CDN。
使用跨區域內部應用程式負載平衡器存取後端 bucket 時,系統僅支援 HTTP
GET
方法。您可以從值區下載內容,但無法透過跨區域內部應用程式負載平衡器將內容上傳至值區。
設定總覽
您可以在多個區域中設定跨區域內部應用程式負載平衡器,如下圖所示:
如架構圖所示,這個範例會在虛擬私有雲 (VPC) 網路中建立跨區域內部應用程式負載平衡器,並包含兩個後端 bucket,每個後端 bucket 都會參照 Cloud Storage bucket。Cloud Storage 值區位於 us-east1
和 asia-east1
地區。
這個部署架構提供高可用性。如果某個區域的跨區域內部應用程式負載平衡器發生故障,DNS 路由政策會將流量導向另一個區域的跨區域內部應用程式負載平衡器。
設定網路和子網路
在虛擬私有雲網路中,為要設定負載平衡器轉送規則的每個區域設定子網路。此外,請在要設定負載平衡器的每個區域中,設定 proxy-only-subnet
。
這個範例會使用以下虛擬私人雲端網路、地區和子網路:
電視網。網路為名為
lb-network
的自訂模式虛擬私有雲網路。負載平衡器子網路。
us-east1
地區中名為subnet-us
的子網路使用10.1.2.0/24
做為其主要 IP 範圍。asia-east1
地區中名為subnet-asia
的子網路使用10.1.3.0/24
做為其主要 IP 範圍。Envoy Proxy 的子網路。
us-east1
地區中名為proxy-only-subnet-us-east1
的子網路使用10.129.0.0/23
做為其主要 IP 範圍。asia-east1
地區中名為proxy-only-subnet-asia-east1
的子網路使用10.130.0.0/23
做為其主要 IP 範圍。
VPC 內任何區域都能存取跨區域內部應用程式負載平衡器。因此任何區域的用戶端都能從全球存取負載平衡器後端。
設定負載平衡器轉送規則的子網路
主控台
在 Trusted Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。
按一下「建立虛擬私有雲網路」。
在「Name」(名稱) 中輸入
lb-network
。在「Subnets」(子網路) 區段,將「Subnet creation mode」(子網路建立模式) 設為「Custom」(自訂)。
在「New subnet」(新的子網路) 區段中,輸入以下資訊:
- Name (名稱):
subnet-us
- 選取「區域」:
us-east1
- IP address range (IP 位址範圍):
10.1.2.0/24
- Name (名稱):
按一下 [完成]。
按一下 [新增子網路]。
在不同區域中,為負載平衡器的轉送規則建立另一個子網路。在「New subnet」(新的子網路) 區段中,輸入以下資訊:
- Name (名稱):
subnet-asia
- Region (區域):
asia-east1
- IP address range (IP 位址範圍):
10.1.3.0/24
- Name (名稱):
按一下 [完成]。
點選「建立」。
gcloud
使用
gcloud compute networks create
指令建立名為lb-network
的自訂虛擬私有雲網路。gcloud compute networks create lb-network --subnet-mode=custom
使用
gcloud compute networks subnets create
指令,在us-east1
地區的lb-network
虛擬私有雲網路中建立子網路。gcloud compute networks subnets create subnet-us \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-east1
使用
gcloud compute networks subnets create
指令,在asia-east1
地區的lb-network
虛擬私有雲網路中建立子網路。gcloud compute networks subnets create subnet-asia \ --network=lb-network \ --range=10.1.3.0/24 \ --region=asia-east1
設定僅限 Proxy 的子網路
僅限 Proxy 的子網路提供一組 IP 位址, Trusted Cloud by S3NS 會代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立與後端的新連線。
這個僅限 Proxy 的子網路,會由與虛擬私有雲網路位於相同區域的所有 Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個用於特定用途的有效僅限 Proxy 子網路。在本範例中,我們會建立兩個僅限 Proxy 子網路,分別位於 us-east1
和 asia-east1
區域。
主控台
在 Trusted Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。
按一下您建立的 VPC 網路名稱。
在「子網路」分頁中,按一下「新增子網路」。
輸入下列資訊:
- Name (名稱):
proxy-only-subnet-us
- Region (區域):
us-east1
- IP address range (IP 位址範圍):
10.129.0.0/23
- Name (名稱):
按一下「新增」。
在
asia-east1
地區中建立另一個僅限 Proxy 的子網路。 在「子網路」分頁中,按一下「新增子網路」。輸入下列資訊:
- Name (名稱):
proxy-only-subnet-asia
- Region (區域):
asia-east1
- IP address range (IP 位址範圍):
10.130.0.0/23
- Name (名稱):
按一下「新增」。
gcloud
使用
gcloud compute networks subnets create
指令,在us-east1
區域中建立僅限 Proxy 的子網路。gcloud compute networks subnets create proxy-only-subnet-us \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-east1 \ --network=lb-network \ --range=10.129.0.0/23
使用
gcloud compute networks subnets create
指令,在asia-east1
區域中建立僅限 Proxy 的子網路。gcloud compute networks subnets create proxy-only-subnet-asia \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=asia-east1 \ --network=lb-network \ --range=10.130.0.0/23
設定防火牆規則
這個範例使用下列防火牆規則:
輸入規則,允許透過通訊埠
22
對用戶端 VM 進行 SSH 存取。在本範例中,這項防火牆規則的名稱為fw-allow-ssh
。
主控台
在 Trusted Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。
按一下「Create firewall rule」(建立防火牆規則),建立允許連入用戶端 VM 的 SSH 連線規則:
- Name (名稱):
fw-allow-ssh
- Network (網路):
lb-network
- Direction of traffic (流量方向):「Ingress」(輸入)
- 「Action on match」(相符時執行的動作):允許
- 目標:指定的目標標記
- 「Target tags」(目標標記):
allow-ssh
- 來源篩選器:IPv4 範圍
- Source IPv4 ranges (來源 IPv4 範圍):
0.0.0.0/0
- 通訊協定和通訊埠:
- 選擇「指定的通訊協定與通訊埠」。
- 勾選「TCP」核取方塊,然後輸入
22
做為「Port number」(通訊埠編號)。
- Name (名稱):
點選「建立」。
gcloud
建立
fw-allow-ssh
防火牆規則,允許與具有allow-ssh
網路標記的 VM 建立 SSH 連線。若省略--source-ranges
,Trusted Cloud 會將規則解讀為任何來源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
設定 Cloud Storage 值區
設定 Cloud Storage bucket 的程序如下:
- 建立 bucket。
- 將內容複製到 bucket。
建立 Cloud Storage 值區
在本範例中,您會建立兩個 Cloud Storage bucket,一個位於 us-east1
區域,另一個位於 asia-east1
區域。如為實際工作環境的部署作業,建議您選擇多區域 bucket,系統會自動在多個 Trusted Cloud 區域中複寫物件。這有助於提高內容可用性,並提升應用程式的容錯能力。
主控台
- 在 Trusted Cloud 控制台,前往「Cloud Storage bucket」頁面。
按一下「建立」
。在「Name your bucket」(為值區命名) 方塊中,輸入符合命名規範的全域不重複名稱。
按一下「Choose where to store your data」(選取資料的儲存位置)。
將「Location type」(位置類型) 設為「Region」(區域)。
從區域清單中選取「us-east1」。
點選「建立」。
按一下「Buckets」(值區),返回 Cloud Storage Buckets 頁面。 按照這些操作說明建立第二個 bucket,不過請將「Location」(位置)設為「asia-east1」。
gcloud
使用
gcloud storage buckets create
指令,在us-east1
區域中建立第一個值區。gcloud storage buckets create gs://BUCKET1_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-access
使用
gcloud storage buckets create
指令,在asia-east1
區域中建立第二個值區。gcloud storage buckets create gs://BUCKET2_NAME \ --default-storage-class=standard \ --location=asia-east1 \ --uniform-bucket-level-access
將變數 BUCKET1_NAME 和 BUCKET2_NAME 替換為 Cloud Storage 值區名稱。
將圖像檔案複製到 Cloud Storage 值區
這樣一來,您就能測試設定,並將圖像檔案從公開 Cloud Storage 值區複製到自己的 Cloud Storage 值區。
在 Cloud Shell 中執行下列指令,並將值區名稱變數改為您的專屬 Cloud Storage 值區名稱:
gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/
將 Cloud Storage 值區設為可公開讀取
如要將 bucket 中的所有物件設為可供公開網路中的所有使用者讀取,請授予主體 allUsers
Storage 物件檢視者角色 (roles/storage.objectViewer
)。
主控台
如要向所有使用者授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:
- 在 Trusted Cloud 控制台,前往「Cloud Storage bucket」頁面。
在值區清單中,找到您要設為公開的值區名稱,然後點選這個名稱。
選取靠近頁面上方的 [Permissions] (權限) 分頁標籤。
在「權限」部分中,按一下「授予存取權」按鈕
。系統會隨即顯示「授予存取權」對話方塊。在「New principals」(新增主體) 欄位中輸入
allUsers
。在「Select a role」(請選擇角色) 欄位的篩選方塊中輸入
Storage Object Viewer
,然後從篩選結果中選取「Storage Object Viewer」(Storage 物件檢視者)。按一下 [儲存]。
按一下「Allow public access」(允許公開存取)。
gcloud
如要向所有使用者授予值區中物件的檢視權限,請執行 buckets add-iam-policy-binding
指令。
gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME --member=allUsers --role=roles/storage.objectViewer
將值區名稱變數替換為專屬的 Cloud Storage 值區名稱。
設定具備後端值區的負載平衡器
本節說明如何為跨區域內部應用程式負載平衡器建立下列資源:
- 兩個後端值區。後端 bucket 會做為您先前建立的 Cloud Storage bucket 的包裝函式。
- 網址對應
- 目標 Proxy
- 兩個包含區域 IP 位址的全域轉送規則。系統會從為負載平衡器轉送規則建立的子網路,指派 IP 位址給轉送規則。如果您嘗試從僅限 Proxy 子網路將 IP 位址指派給轉送規則,轉送規則建立作業就會失敗。
在本範例中,您可以使用 HTTP 或 HTTPS 做為用戶端與負載平衡器之間的要求與回應通訊協定。如要建立 HTTPS 負載平衡器,您必須在負載平衡器的前端新增 SSL 憑證資源。
如要使用 gcloud CLI 建立上述負載平衡元件,請按照下列步驟操作:
使用
gcloud compute backend-buckets create
指令,在us-east1
區域和asia-east1
區域中各建立一個後端 bucket。後端值區的負載平衡架構為INTERNAL_MANAGED
。gcloud compute backend-buckets create backend-bucket-cats \ --gcs-bucket-name=BUCKET1_NAME \ --load-balancing-scheme=INTERNAL_MANAGED
時無法整合 Cloud CDN。gcloud compute backend-buckets create backend-bucket-dogs \ --gcs-bucket-name=BUCKET2_NAME \ --load-balancing-scheme=INTERNAL_MANAGED
使用
gcloud compute url-maps create
指令建立網址對應,將連入要求轉送至後端 bucket。gcloud compute url-maps create lb-map \ --default-backend-bucket=backend-bucket-cats \ --global
使用
gcloud compute url-maps add-path-matcher
指令設定網址對應的主機與路徑規則。在本例中,預設後端 bucket 為
backend-bucket-cats
,負責處理其中所有路徑。不過,任何以http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg
為目標的要求都會使用backend-bucket-dogs
後端。舉例來說,如果預設後端 (backend-bucket-cats
) 中也存在/love-to-fetch/
資料夾,負載平衡器會優先處理backend-bucket-dogs
後端,因為/love-to-fetch/*
有專屬的路徑規則。gcloud compute url-maps add-path-matcher lb-map \ --path-matcher-name=path-matcher-pets \ --new-hosts=* \ --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \ --default-backend-bucket=backend-bucket-cats
使用
gcloud compute target-http-proxies create
指令建立目標 Proxy。針對 HTTP 流量,建立目標 HTTP Proxy,將要求轉送至網址對應:
gcloud compute target-http-proxies create http-proxy \ --url-map=lb-map \ --global
如果是 HTTPS 流量,請建立目標 HTTPS Proxy,將要求轉送至網址對應。Proxy 是負載平衡器的一部分,用於保存 HTTPS 負載平衡器的 SSL 憑證。建立憑證後,即可將憑證附加至 HTTPS 目標 Proxy。
gcloud compute target-https-proxies create https-proxy \ --url-map=lb-map \ --certificate-manager-certificates=CERTIFICATE_NAME \ --global
將
CERTIFICATE_NAME
替換成使用憑證管理工具建立的 SSL 憑證名稱。使用
gcloud compute forwarding-rules create
指令建立兩個全域轉送規則,一個規則使用us-east1
區域中的 IP 位址,另一個規則使用asia-east1
區域中的 IP 位址。如要為負載平衡器的轉送規則保留靜態內部 IP 位址,請參閱「保留靜態內部 IP 位址」。HTTP 轉送規則可選擇是否保留 IP 位址,但 HTTPS 轉送規則必須保留 IP 位址。
在本範例中,臨時 IP 位址與負載平衡器的 HTTP 轉送規則相關聯。只要轉送規則存在,臨時 IP 位址就會保持不變。如果您需要刪除並重新建立轉送規則,該規則可能會收到新的 IP 位址。
針對 HTTP 流量,建立全域轉送規則,將傳入要求轉送至 HTTP 目標 Proxy:
gcloud compute forwarding-rules create http-fw-rule-1 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-us \ --subnet-region=us-east1 \ --ports=80 \ --target-http-proxy=http-proxy \ --global-target-http-proxy \ --global
gcloud compute forwarding-rules create http-fw-rule-2 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-asia \ --subnet-region=asia-east1 \ --ports=80 \ --target-http-proxy=http-proxy \ --global-target-http-proxy \ --global
針對 HTTPS 流量,建立全域轉送規則,將傳入要求轉送至 HTTPS 目標 Proxy:
gcloud compute forwarding-rules create https-fw-rule-1 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-us \ --subnet-region=us-east1 \ --address=RESERVED_IP_ADDRESS \ --ports=443 \ --target-https-proxy=https-proxy \ --global-target-https-proxy \ --global
gcloud compute forwarding-rules create https-fw-rule-2 \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=subnet-asia \ --subnet-region=asia-east1 \ --address=RESERVED_IP_ADDRESS \ --ports=443 \ --target-https-proxy=https-proxy \ --global-target-https-proxy \ --global
向負載平衡器傳送 HTTP 要求
從內部用戶端 VM 將要求傳送至負載平衡器的轉送規則。
取得負載平衡器轉送規則的 IP 位址
取得負載平衡器轉送規則的 IP 位址 (
http-fw-rule-1
),該規則位於us-east1
區域。gcloud compute forwarding-rules describe http-fw-rule-1 \ --global
取得負載平衡器轉送規則的 IP 位址 (
http-fw-rule-2
),該規則位於asia-east1
區域。gcloud compute forwarding-rules describe http-fw-rule-2 \ --global
建立用戶端 VM 來測試連線
在
us-east1
區域中建立用戶端 VM。gcloud compute instances create client-a \ --image-family=debian-12 \ --image-project=debian-cloud \ --network=lb-network \ --subnet=subnet-us \ --zone=us-east1-c \ --tags=allow-ssh
建立與用戶端 VM 的 SSH 連線。
gcloud compute ssh client-a --zone=us-east1-c
在本範例中,跨區域內部應用程式負載平衡器在虛擬私有雲網路的
us-east1
和asia-east1
區域中,都有前端虛擬 IP 位址 (VIP)。使用 curl 向任一區域的 VIP 發出 HTTP 要求。curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
curl http://FORWARDING_RULE_IP_ADDRESS/never-fetch/three-cats.jpg --output three-cats.jpg
測試高可用性
刪除
us-east1
區域中的轉送規則 (http-fw-rule-1
),模擬區域性中斷,並檢查us-east
區域中的用戶端是否仍可存取後端 bucket 中的資料。gcloud compute forwarding-rules delete http-fw-rule-1 \ --global
使用 curl 向任一區域的轉送規則 VIP 發出 HTTP 要求。
curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
curl http://FORWARDING_RULE_IP_ADDRESS/never-fetch/three-cats.jpg --output three-cats.jpg
如果您向
us-east1
地區的 VIP 發出 HTTP 要求,DNS 路由政策會偵測到這個 VIP 沒有回應,並向用戶端傳回下一個最合適的 VIP (在本例中為asia-east1
)。這項行為有助於確保應用程式在區域中斷期間仍能正常運作。