使用 Cloud Storage 值區設定跨區域內部應用程式負載平衡器

本文說明如何建立跨區域內部應用程式負載平衡器,將靜態內容的要求轉送至 Cloud Storage 值區

事前準備

請確認您的設定符合下列先決條件。

安裝 Google Cloud CLI

對於預先發布版,本指南中的部分操作說明只能使用 Google Cloud CLI 執行。如要安裝,請參閱「安裝 gcloud CLI」一文。

您可以在 API 和 gcloud CLI 參考資料文件中找到與負載平衡相關的指令。

權限

如要按照本指南操作,您必須在專案中建立 Cloud Storage 值區和網路資源。您必須是專案擁有者或編輯者,或者具有下列 Compute Engine 身分與存取權管理角色

工作 必要角色
建立網路、子網路和負載平衡器元件 Compute 網路管理員角色 (roles/compute.networkAdmin)
新增與移除防火牆規則 Compute 安全性管理員角色 (roles/compute.securityAdmin)
建立 Cloud Storage 值區 Storage 物件管理員角色 (roles/storage.objectAdmin)

詳情請參閱下列指南:

設定 SSL 憑證資源

如果跨區內部應用程式負載平衡器使用 HTTPS 做為要求和回應通訊協定,請按照下列任一文件的說明,使用憑證管理工具建立 SSL 憑證資源:

建立憑證後,您可以將憑證附加至 HTTPS 目標 Proxy。

建議您使用 Google 代管的憑證。

限制

當 Cloud Storage 值區用於跨區域內部應用程式負載平衡器的後端時,會受到下列限制:

  • 系統不支援私人值區存取權,因此後端值區必須透過網際網路公開存取。

  • 系統不支援已簽署的網址

  • 為跨區域內部應用程式負載平衡器建立後端值區時,無法使用 Cloud CDN 整合功能。

  • 使用跨區域內部應用程式負載平衡器存取後端值區時,只支援 HTTP GET 方法。您可以從值區下載內容,但無法透過跨區域內部應用程式負載平衡器將內容上傳至值區。

設定總覽

您可以在多個區域中設定跨區域內部應用程式負載平衡器,如下圖所示:

跨區域內部應用程式負載平衡器會將流量傳送至 Cloud Storage 後端。
將流量分配至 Cloud Storage (按一下可放大)。

如架構圖所示,這個範例會在具有兩個後端值區的虛擬私有雲 (VPC) 網路中,建立跨區域內部應用程式負載平衡器,其中每個後端值區都會參照 Cloud Storage 值區。Cloud Storage 值區位於 us-east1asia-east1 區域。

這種部署架構可提供高可用性。如果某個區域中的跨區域內部應用程式負載平衡器發生問題,DNS 路由政策會將流量路由至其他區域中的跨區域內部應用程式負載平衡器。

設定網路和子網路

在 VPC 網路中,針對負載平衡器的轉送規則,在每個區域中設定子網路。此外,請在您要設定負載平衡器的每個區域中設定 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 中的任何區域存取。因此,來自任何區域的用戶端都能在全球存取負載平衡器後端。

為負載平衡器的轉送規則設定子網路

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下「建立虛擬私有雲網路」

  3. 在「Name」(名稱) 中輸入 lb-network

  4. 在「子網路」部分,將「子網路建立模式」設為「自訂」

  5. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    • Name (名稱):subnet-us
    • 選取「區域」us-east1
    • IP address range (IP 位址範圍):10.1.2.0/24
  6. 按一下 [完成]

  7. 按一下 [新增子網路]

  8. 為負載平衡器的轉送規則建立另一個子網路,用於其他地區。在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    • Name (名稱):subnet-asia
    • Region (區域):asia-east1
    • IP address range (IP 位址範圍):10.1.3.0/24
  9. 按一下 [完成]

  10. 按一下 [建立]。

gcloud

  1. 使用 gcloud compute networks create 指令建立名為 lb-network 的自訂虛擬私有雲網路。

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 使用 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
    
  3. 使用 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 位址, Google Cloud 用於代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立連至後端的新連線。

這個僅限 Proxy 的子網路,會由與虛擬私有雲網路位於同一個區域的所有 Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個特定用途的活動的僅限 Proxy 子網路。

主控台

  1. 在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 按一下您建立的 VPC 網路名稱。

  3. 在「子網路」分頁中,按一下「新增子網路」

  4. 輸入下列資訊:

    • Name (名稱):proxy-only-subnet-us
    • Region (區域):us-east1
    • IP address range (IP 位址範圍):10.129.0.0/23
  5. 按一下「新增」。

  6. 為負載平衡器的轉送規則建立另一個子網路,用於其他地區。在「子網路」分頁中,按一下「新增子網路」

  7. 輸入下列資訊:

    • Name (名稱):proxy-only-subnet-asia
    • Region (區域):asia-east1
    • IP address range (IP 位址範圍):10.130.0.0/23
  8. 按一下「新增」。

gcloud

  1. 使用 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
    
  2. 使用 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
    

設定防火牆規則

這個範例使用以下防火牆規則:

  • 輸入規則,允許 SSH 存取用戶端 VM 的 22 通訊埠。在這個範例中,防火牆規則的名稱為 fw-allow-ssh

主控台

  1. 在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。

    前往「防火牆政策」

  2. 按一下「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
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」核取方塊,然後輸入 22 做為「Port number」(通訊埠編號)。
  3. 按一下 [建立]。

gcloud

  1. 建立 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 值區

設定 Cloud Storage 值區的程序如下:

  • 建立值區。
  • 將內容複製到值區。

建立 Cloud Storage 值區

在本例中,您會建立兩個 Cloud Storage 值區,一個位於 us-east1 區域,另一個位於 asia-east1 區域。如為實際工作環境的部署作業,建議您選擇多區域 bucket,這樣系統就會自動在多個 Google Cloud 區域複製物件。這麼做可以提升內容的可用性,並改善應用程式整體的容錯能力。

主控台

  1. 在 Google Cloud 控制台,前往 Cloud Storage「Buckets」頁面。

    前往「Buckets」(值區) 頁面

  2. 按一下「建立」

  3. 在「Name your bucket」(為值區命名) 方塊中,輸入全域不重複的名稱,並遵守命名規範

  4. 按一下「Choose where to store your data」(選取資料的儲存位置)

  5. 將「Location type」(位置類型) 設為「Region」(區域)

  6. 從區域清單中選取「us-east1」

  7. 按一下 [建立]。

  8. 按一下「Buckets」(值區),返回 Cloud Storage 值區頁面。按照這些操作說明建立第二個值區,不過請將「Location」(位置)設為「asia-east1」

gcloud

  1. 使用 gcloud storage buckets create 指令,在 us-east1 區域中建立第一個值區。

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    
  2. 使用 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_NAMEBUCKET2_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 值區設為可公開讀取

如要將值區中的所有物件設為可供公開網路中的所有使用者讀取,請將 Storage 物件檢視者角色 (roles/storage.objectViewer) 授予主要使用者 allUsers

主控台

如要向所有使用者授予 bucket 中物件的檢視權限,請為每個 bucket 重複執行下列程序:

  1. 在 Google Cloud 控制台,前往 Cloud Storage「Buckets」頁面。

    前往「Buckets」(值區) 頁面

  2. 在值區清單中,找出要設為公開的值區,然後點選這個名稱。

  3. 選取靠近頁面上方的 [Permissions] (權限) 分頁標籤。

  4. 在「權限」部分中,按一下 「授予存取權」按鈕。系統會隨即顯示「授予存取權」對話方塊。

  5. 在「New principals」(新增主體) 欄位中輸入 allUsers

  6. 在「請選擇角色」欄位中,在篩選器方塊中輸入 Storage Object Viewer,然後從篩選結果中選取「Storage Object Viewer」

  7. 按一下 [儲存]

  8. 按一下「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 值區名稱。

設定具備後端值區的負載平衡器

本節說明如何為跨區域內部應用程式負載平衡器建立下列資源:

在這個範例中,您可以使用 HTTP 或 HTTPS 做為用戶端與負載平衡器之間的要求與回應通訊協定。如要建立 HTTPS 負載平衡器,您必須將 SSL 憑證資源新增至負載平衡器的前端。

如要使用 gcloud CLI 建立上述負載平衡元件,請按照下列步驟操作:

  1. 使用 gcloud beta compute backend-buckets create 指令建立兩個後端值區,一個位於 us-east1 區域,另一個位於 asia-east1 區域。後端值區的負載平衡架構為 INTERNAL_MANAGED

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED
    
  2. 使用 gcloud compute url-maps create 指令建立網址對應,將收到的要求轉送至後端值區。

    gcloud compute url-maps create lb-map \
        --default-backend-bucket=backend-bucket-cats \
        --global
    
  3. 使用 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
    
  4. 使用 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 憑證名稱

  5. 使用 gcloud compute forwarding-rules create 指令建立兩個全域轉送規則,一個在 us-east1 區域中使用 IP 位址,另一個在 asia-east1 區域中使用 IP 位址。

    如果您想為負載平衡器的轉送規則保留靜態內部 IP 位址,請參閱「預留新的靜態內部 IPv4 或 IPv6 位址」。您可以選擇為 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 位址

  1. 取得負載平衡器轉送規則 (http-fw-rule-1) 的 IP 位址,該規則位於 us-east1 區域。

    gcloud compute forwarding-rules describe http-fw-rule-1 \
        --global
    
  2. 取得負載平衡器轉送規則 (http-fw-rule-2) 的 IP 位址,該規則位於 asia-east1 區域。

    gcloud compute forwarding-rules describe http-fw-rule-2 \
        --global
    

建立用戶端 VM 來測試連線能力

  1. 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
    
  2. 建立與用戶端 VM 的 SSH 連線。

    gcloud compute ssh client-a --zone=us-east1-c
    
  3. 在這個範例中,跨區域內部應用程式負載平衡器在 VPC 網路的 us-east1asia-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
    

測試高可用性

  1. 刪除 us-east1 區域中的轉送規則 (http-fw-rule-1),模擬區域停機情形,並檢查 us-east 區域中的用戶端是否仍可存取後端值區中的資料。

    gcloud compute forwarding-rules delete http-fw-rule-1 \
        --global
    
  2. 使用 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),確保應用程式即使在區域停機期間也能正常運作。

後續步驟