本文說明如何建立regional internal Application Load Balancer ,將靜態內容的要求轉送至 Cloud Storage 值區。
事前準備
請確認設定符合下列必要條件。
安裝 Google Cloud CLI
本指南中的部分操作只能透過 gcloud CLI 執行。如要安裝,請參閱「安裝 Google Cloud CLI」。
您可以在 API 和 gcloud CLI 參考資料文件中找到與負載平衡相關的指令。
必要的角色
如果您是專案建立者,系統會授予您擁有者角色 (roles/owner)。根據預設,擁有者角色 (roles/owner) 或編輯者角色 (roles/editor) 包含遵循本文件操作所需的權限。
如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶。
如要取得建立 Cloud Storage bucket 和網路資源所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
建立網路、子網路和負載平衡器元件:
Compute 網路管理員 (
roles/compute.networkAdmin) -
新增及移除防火牆規則:
Compute 安全管理員 (
roles/compute.securityAdmin) -
建立 Cloud Storage bucket:
Storage 物件管理員 (
roles/storage.objectAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
如要進一步瞭解 Cloud Load Balancing 的角色和權限,請參閱「角色和權限」。如要進一步瞭解如何定義具有條件式授權的 IAM 政策,請參閱「轉送規則的 IAM 條件」。
設定 SSL 憑證資源
如果 regional internal Application Load Balancer 使用 HTTPS 做為要求和回應通訊協定,請使用 Certificate Manager 建立 SSL 憑證資源,如以下文件所述:
建立憑證後,即可將憑證附加至 HTTPS 目標 Proxy。建議使用 Google 代管的憑證。
限制
當 Cloud Storage 值區做為 regional internal Application Load Balancer的後端時,適用下列限制:
系統不支援私有 bucket 存取權,因此後端 bucket 必須可透過網際網路公開存取。
系統不支援已簽署的網址。
為regional internal Application Load Balancer建立後端 bucket 時,無法整合 Cloud CDN。
使用 regional internal Application Load Balancer 存取後端 bucket 時,系統僅支援 HTTP
GET方法。你可以從 bucket 下載內容,但無法透過regional internal Application Load Balancer 將內容上傳至 bucket。如果是 regional internal Application Load Balancer,Cloud Storage 值區僅支援負載平衡器設定所在的區域。不支援雙區域或多區域 bucket。
設定總覽
您可以在區域中設定 regional internal Application Load Balancer ,如下列架構圖所示:
如架構圖所示,這個範例會在虛擬私有雲 (VPC) 網路中建立regional internal Application Load Balancer ,其中包含兩個後端 bucket,每個後端 bucket 都會參照 Cloud Storage bucket。Cloud Storage bucket 位於 us-east1 地區,您可以平衡各 bucket 之間的流量負載。
設定網路和子網路
在虛擬私有雲網路中,於要設定負載平衡器轉送規則的區域 us-east1 內設定子網路。此外,請在要設定負載平衡器的區域中,設定僅限 Proxy 的子網路 us-east1。
這個範例會使用以下虛擬私人雲端網路、地區和子網路:
聯播網。網路為名為
lb-network的自訂模式虛擬私有雲網路。負載平衡器的子網路。
us-east1地區中名為subnet-us的子網路使用10.1.2.0/24做為其主要 IP 範圍。Envoy Proxy 的子網路。
us-east1地區中名為proxy-only-subnet-us的子網路,使用10.129.0.0/23做為其主要 IP 範圍。
設定負載平衡器轉送規則的子網路
在要設定負載平衡器轉送規則的相同區域中,建立子網路。
控制台
前往 Google 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 (名稱):
點選「建立」。
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
設定僅限 Proxy 的子網路
僅限 Proxy 的子網路提供一組 IP 位址, Google Cloud 會代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立與後端的連線。
這個僅限 Proxy 的子網路,會由與虛擬私有雲網路位於相同區域的所有 Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個用於特定用途的有效僅限 Proxy 子網路。在本範例中,我們會在 us-east1 地區建立僅限 Proxy 的子網路。
控制台
前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。
按一下您建立的 VPC 網路名稱。
在「子網路」分頁中,按一下「新增子網路」。
輸入下列資訊:
- 在「Name」(名稱) 中輸入
proxy-only-subnet-us。 - 在「區域」部分輸入
us-east1。 - 在「用途」部分,選取「Regional Managed Proxy」。
- 在「IP address range」(IP 位址範圍) 中,輸入
10.129.0.0/23。
- 在「Name」(名稱) 中輸入
按一下 [新增]。
gcloud
使用
gcloud compute networks subnets create指令,在us-east1區域中建立僅限 Proxy 的子網路。gcloud compute networks subnets create proxy-only-subnet-us \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-east1 \ --network=lb-network \ --range=10.129.0.0/23
設定防火牆規則
這個範例使用輸入防火牆規則 fw-allow-ssh,允許透過通訊埠 22 存取用戶端 VM 的 SSH。
控制台
在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。
按一下「Create firewall rule」(建立防火牆規則),以建立允許連入用戶端 VM 的 SSH 連線規則:
在「Create a firewall rule」(建立防火牆規則) 頁面中,輸入下列資訊:
- Name (名稱):
fw-allow-ssh - Network (網路):
lb-network - Direction of traffic (流量方向):「Ingress」(輸入)
- 「Action on match」(相符時執行的動作):允許
- 目標:指定的目標標記
- 「Target tags」(目標標記):
allow-ssh - Source filter (來源篩選器):「IPv4 ranges」(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,Google 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 bucket
設定 Cloud Storage bucket 的程序如下:
- 建立 bucket。
- 將內容複製到 bucket。
- 將 bucket 設為可公開讀取。
建立 Cloud Storage 值區
在本範例中,您會在 us-east1 地區建立兩個 Cloud Storage bucket。
控制台
- 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
按一下「建立」。
在「開始使用」部分,輸入符合命名規範的全域不重複名稱。
按一下「Choose where to store your data」(選取資料的儲存位置)。
將「Location type」(位置類型) 設為「Region」(區域)。
從區域清單中選取「us-east1」。
點選「建立」。
按一下「Buckets」(值區),返回「Cloud Storage Buckets」(Cloud Storage 值區) 頁面。 按照上述操作說明,在相同區域 (us-east1) 中建立第二個 bucket。
gcloud
使用
gcloud storage buckets create指令,在us-east1區域中建立 bucket。gcloud storage buckets create gs://BUCKET1_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-accessgcloud storage buckets create gs://BUCKET2_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-access將
BUCKET1_NAME和BUCKET2_NAME替換為 Cloud Storage 值區名稱。
將圖片檔案複製到 Cloud Storage bucket
如要測試設定,請將圖片檔案從公開的 Cloud Storage bucket 複製到您自己的 Cloud Storage bucket。
gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
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 重複執行下列程序:
- 前往 Google Cloud 控制台的「Cloud Storage bucket」頁面。
在值區清單中,找到要設為公開的各個值區,並勾選相應的核取方塊。
按一下「權限」按鈕。 系統會隨即顯示「Permissions」對話方塊。
在「Permissions」(權限) 對話方塊中,按一下「Add principal」(新增主體) 按鈕。 系統會顯示「授予存取權」對話方塊。
在「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.objectViewergcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME \
--member=allUsers \
--role=roles/storage.objectViewer預留靜態內部 IP 位址
為負載平衡器的轉送規則保留靜態內部 IPv4 位址。詳情請參閱「預留靜態內部 IP 位址」。
控制台
前往 Google Cloud 控制台的「Reserve internal static IP address」(保留內部靜態 IP 位址) 頁面。
在「名稱」欄位中,輸入新地址的名稱。
在「IP version」(IP 版本) 清單中,選取「IPv4」。
在「Network」(網路) 清單中,選取「lb-network」。
在「Subnetwork」(子網路) 清單中,選取「subnet-us」。
在「地區」部分,請選擇「us-east1」。
在「Static IP address」(靜態 IP 位址) 清單中,選取「Assign automatically」(自動指派)。建立負載平衡器後,這個 IP 位址會附加至負載平衡器的轉送規則。
按一下「保留」,保留 IP 位址。
gcloud
如要預留靜態外部 IP 位址,請使用
gcloud compute addresses create指令。gcloud compute addresses create ADDRESS_NAME \ --region=us-east1 \ --subnet=subnet-us將
ADDRESS_NAME替換為新地址的名稱。如要查看地址資訊,請使用
gcloud compute addresses describe指令。gcloud compute addresses describe ADDRESS_NAME
複製傳回的 IP 位址,在下一節中做為
RESERVED_IP_ADDRESS使用。
設定具備後端值區的負載平衡器
本節說明如何為regional internal Application Load Balancer建立下列資源:
- 兩個後端值區。後端 bucket 會做為您先前建立的 Cloud Storage bucket 的 wrapper。
- 網址對應
- 目標 Proxy
- 包含區域 IP 位址的轉送規則。系統會從為負載平衡器轉送規則建立的子網路,指派 IP 位址給轉送規則。如果您嘗試從僅限 Proxy 的子網路將 IP 位址指派給轉送規則,轉送規則建立作業就會失敗。
在本範例中,您可以使用 HTTP 或 HTTPS 做為用戶端與負載平衡器之間的要求與回應通訊協定。如要建立 HTTPS 負載平衡器,您必須在負載平衡器的前端新增 SSL 憑證資源。
如要使用 gcloud CLI 建立上述負載平衡元件,請按照下列步驟操作:
使用
gcloud beta compute backend-buckets create指令,在us-east1區域中建立兩個後端 bucket。後端值區的負載平衡架構為INTERNAL_MANAGED。gcloud beta compute backend-buckets create backend-bucket-cats \ --gcs-bucket-name=BUCKET1_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --region=us-east1gcloud beta compute backend-buckets create backend-bucket-dogs \ --gcs-bucket-name=BUCKET2_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --region=us-east1使用
gcloud beta compute url-maps create指令建立網址對應,將傳入要求轉送至後端 bucket。gcloud beta compute url-maps create lb-map \ --default-backend-bucket=backend-bucket-cats \ --region=us-east1使用
gcloud beta 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 beta 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 \ --region=us-east1使用
gcloud compute target-http-proxies create指令建立目標 Proxy。如果是 HTTP 流量,請建立目標 HTTP Proxy,將要求轉送至網址對應:
gcloud compute target-http-proxies create http-proxy \ --url-map=lb-map \ --region=us-east1如果是 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 \ --region=us-east1將
CERTIFICATE_NAME替換成您使用憑證管理工具建立的 SSL 憑證名稱。使用
gcloud compute forwarding-rules create指令,在us-east1區域中建立含有 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 \ --target-http-proxy-region=us-east1 \ --region=us-east1如果是 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 \ --target-http-proxy-region=us-east1 \ --region=us-east1將
RESERVED_IP_ADDRESS替換為您在「保留靜態內部 IP 位址」一節中複製的位址名稱。
向負載平衡器傳送 HTTP 要求
從內部用戶端 VM 將要求傳送至負載平衡器的轉送規則。
取得負載平衡器轉送規則的 IP 位址
取得 us-east1 區域中負載平衡器轉送規則的 IP 位址 (http-fw-rule-1),使用 curl 向該區域的虛擬 IP 位址 (VIP) 發出 HTTP 要求。
gcloud compute forwarding-rules describe http-fw-rule-1 \
--region=us-east1
複製傳回的 IP 位址,以便在下一步中做為 FORWARDING_RULE_IP_ADDRESS 使用。
建立用戶端 VM 來測試連線
建立用戶端 VM,並將 HTTP 要求傳送至虛擬私有雲網路中的 VIP。用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用相同 VPC 網路中的任何子網路。在本範例中,您會在與負載平衡器轉送規則相同的子網路中,建立用戶端 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
在本例中, regional internal Application Load Balancer 在虛擬私有雲網路的
us-east1區域中,具有前端 VIP。使用 curl 向該區域的 VIP 發出 HTTP 要求。curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
將
FORWARDING_RULE_IP_ADDRESS替換為您在「取得負載平衡器轉送規則的 IP 位址」一節中複製的 IP 位址。