使用 Cloud Run 設定區域性內部應用程式負載平衡器

本文說明如何使用 Cloud Run 部署區域內部應用程式負載平衡器。如要進行這項設定,請為負載平衡器使用無伺服器 NEG 後端。

雖然本文說明 Cloud Run 設定,但 Cloud Run 的無伺服器 NEG 可以指向 Cloud Run 資源或 Cloud Run functions (第 2 代) 資源。

執行這項程序前,請務必先熟悉下列主題:

本指南說明如何設定應用程式負載平衡器,將要求 Proxy 至無伺服器 NEG 後端。

無伺服器 NEG 可讓您搭配負載平衡器使用 Cloud Run 服務。使用無伺服器 NEG 後端設定負載平衡器後,系統會將負載平衡器的要求轉送至 Cloud Run 後端。

事前準備

  1. 安裝 Google Cloud CLI
  2. 部署 Cloud Run 服務
  3. 設定權限

安裝 Google Cloud SDK

安裝 Google Cloud CLI 工具。如需該工具的概念與安裝資訊,請參閱 gcloud 概覽

如果您先前沒有執行過 gcloud CLI,請先執行 gcloud init,以初始化 gcloud 目錄。

部署 Cloud Run 服務

本頁的操作說明假設您已執行 Cloud Run 服務。

如要使用本頁面的範例,您可以使用任一 Cloud Run 快速入門導覽課程,部署 Cloud Run 服務。

無伺服器 NEG、負載平衡器和所有用戶端 VM 必須與 Cloud Run 服務位於相同區域。

如要禁止從網際網路存取 Cloud Run 服務,請將連入流量限制為 internal。來自內部應用程式負載平衡器的流量視為內部流量。

gcloud run deploy CLOUD_RUN_SERVICE_NAME \
    --platform=managed \
    --allow-unauthenticated \
    --ingress=internal \
    --region=REGION \
    --image=IMAGE_URL

請記下您建立的服務名稱。本頁面接下來會說明如何設定負載平衡器,將要求轉送至這項服務。

設定權限

如要按照本指南操作,您必須在專案中建立無伺服器 NEG 和負載平衡器,您必須是專案擁有者或編輯者,或是具有下列 Compute Engine 身分與存取權管理角色和權限

工作 必要角色
建立負載平衡器和網路元件 網路管理員
建立及修改 NEG Compute 執行個體管理員
建立及修改 SSL 憑證 安全管理員

設定網路和子網路

如要設定網路及其子網路,請執行下列工作:

  • 建立虛擬私有雲網路和子網路。
  • 建立僅限 Proxy 的子網路。

建立虛擬私有雲網路

建立自訂模式的虛擬私有雲網路,然後在區域內建立所需的子網路。

主控台

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

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

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

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

  4. 在「子網路建立模式」部分,選取「自訂」

  5. 在「New subnet」(新子網路) 部分,指定子網路的以下設定參數:

    1. 在「Name」(名稱) 中輸入 lb-subnet
    2. 選擇一個 [Region] (地區)
    3. 在「IP address range」(IP 位址範圍) 中,輸入 10.1.2.0/24
    4. 按一下 [完成]
  6. 點選「建立」

gcloud

  1. 使用 gcloud compute networks create 指令建立自訂虛擬私有雲網路:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. lb-network 網路中建立子網路。本例使用 10.1.2.0/24 的 IP 位址範圍做為子網路。您可以設定任何有效子網路範圍

    gcloud compute networks subnets create lb-subnet \
    --network=lb-network \
    --range=10.1.2.0/24 \
    --region=REGION
    

建立僅限 Proxy 的子網路

lb-network 網路的特定區域中,為所有區域 Envoy 型負載平衡器建立僅限 Proxy 的子網路。

主控台

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

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

  2. 按一下要新增僅限 Proxy 子網路的共用 VPC 網路名稱。

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

  4. 在「Name」(名稱) 欄位中輸入 proxy-only-subnet

  5. 選擇一個 [Region] (地區)

  6. 將「用途」設為「區域受管理 Proxy」

  7. 輸入「IP address range」(IP 位址範圍),例如 10.129.0.0/23

  8. 按一下「新增」

gcloud

  1. 使用 gcloud compute networks subnets create 指令建立僅限 Proxy 的子網路。

    這個範例使用 10.129.0.0/23 的 IP 位址範圍做為僅限 Proxy 子網路。您可以設定任何有效子網路範圍

    gcloud compute networks subnets create proxy-only-subnet \
     --purpose=REGIONAL_MANAGED_PROXY \
     --role=ACTIVE \
     --region=REGION \
     --network=lb-network \
     --range=10.129.0.0/23
    

建立負載平衡器

在下圖中,負載平衡器使用無伺服器 NEG 後端,將要求導向至無伺服器 Cloud Run 服務。

從負載平衡器傳送至無伺服器 NEG 後端的流量,會使用在 VPC 外部定義的特殊路徑,不受防火牆規則限制。因此,如果負載平衡器只有無伺服器 NEG 後端,則不需要建立防火牆規則,允許流量從僅限 Proxy 的子網路傳送至無伺服器後端。

Cloud Run 應用程式的內部 HTTP(S) 負載平衡架構。
Cloud Run 應用程式的內部 HTTP(S) 負載平衡架構 (按一下可放大)。

控制台

開始設定

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 點選「建立負載平衡器」
  3. 在「Type of load balancer」(負載平衡器類型) 部分,選取「Application Load Balancer (HTTP/HTTPS)」(應用程式負載平衡器 (HTTP/HTTPS)),然後點選「Next」(下一步)
  4. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  5. 在「Cross-region or single region deployment」(跨區域或單一區域部署) 部分,選取「Best for regional workloads」(最適合區域工作負載),然後點選「Next」(下一步)
  6. 按一下 [設定]

基本設定

  1. 在負載平衡器的「Name」(名稱) 中輸入 serverless-lb
  2. 選取「網路」,然後選取 lb_network
  3. 將視窗保持開啟,以便繼續操作。

設定前端

  1. 繼續操作前,請先確認您已取得 SSL 憑證
  2. 按一下「前端設定」
  3. 輸入名稱
  4. 如要設定內部應用程式負載平衡器,請填入下列欄位。
    1. 在「Protocol」(通訊協定) 底下,選取「HTTPS」
    2. 在「Subnetwork」(子網路) 下,選取子網路。
    3. 在「IP version」(IP 版本) 下方,選取「IPv4」
    4. 在「IP address」(IP 位址) 下方,選取「Ephemeral」(臨時)
    5. 在「Port」(通訊埠) 下方選取 443
    6. 在「Certificate」(憑證) 下方,選取現有的 SSL 憑證,或建立新憑證。

      以下範例說明如何建立 Compute Engine SSL 憑證:

    7. 按一下「建立新憑證」
      1. 在「名稱」欄位中輸入名稱。
      2. 在適當的欄位中,上傳 PEM 格式的檔案:
        • 認證
        • 私密金鑰
      3. 點選「建立」

    如要測試這個程序,但不想設定 SSL 憑證資源,可以設定 HTTP 負載平衡器。

  5. (選用) 如要建立 HTTP 負載平衡器,請執行下列操作:
    1. 在「Protocol」(通訊協定) 底下,選取「HTTP」
    2. 在「Subnetwork」(子網路) 下,選取子網路。
    3. 在「IP version」(IP 版本) 下方,選取「IPv4」
    4. 在「IP address」(IP 位址) 下方,選取「Ephemeral」(臨時)
    5. 在「Port」(通訊埠) 下方選取 80
  6. 按一下 [完成]

設定後端服務

  1. 按一下「後端設定」
  2. 在「建立或選取後端服務」下拉式選單中,將指標懸停在「後端服務」上,然後選取「建立後端服務」
  3. 在「建立後端服務」視窗中,輸入「名稱」
  4. 在「Backend type」(後端類型) 下方,選取「無伺服器網路端點群組」
  5. 請勿變更「Protocol」(通訊協定)。系統會忽略這個參數。
  6. 在「Backends」(後端) >「New backend」(新增後端) 下方,選取「Create serverless network endpoint group」(建立無伺服器網路端點群組)
    1. 在「建立無伺服器網路端點群組」視窗中,輸入「名稱」
    2. 「Region」下方會顯示負載平衡器的區域。
    3. 在「無伺服器網路端點群組類型」欄位中,選取「Cloud Run」。目前僅支援 Cloud Run 類型。
    4. 選取「選取服務名稱」
    5. 在「服務」下拉式清單中,選取要建立負載平衡器的 Cloud Run 服務。
    6. 按一下 [完成]
    7. 點選「建立」
  7. 在「建立後端服務」視窗中,按一下「建立」

設定轉送規則

轉送規則會決定流量的導向方式。 您可以將流量導向後端服務或 Kubernetes 服務。 凡是未與主機和路徑比對條件確實相符的流量,都會傳送至預設服務。

  1. 按一下「簡易型主機與路徑規則」
  2. 從「後端」下拉式清單中選取後端服務。

檢閱設定

  1. 按一下「檢查並完成」
  2. 檢查「後端」、「主機與路徑規則」和「前端」的值。
  3. 選用:按一下「對等程式碼」,即可查看用於建立負載平衡器的 REST API 要求。
  4. 按一下「建立」,等待負載平衡器建立完成。
  5. 按一下負載平衡器的名稱 (serverless-lb)。
  6. 記下負載平衡器的 IP 位址,以便在下一項工作中使用。

gcloud

  1. 為 Cloud Run 服務建立無伺服器 NEG:
        gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
            --region=REGION \
            --network-endpoint-type=serverless  \
            --cloud-run-service=CLOUD_RUN_SERVICE_NAME
        
  2. 建立區域後端服務。將 --protocol 設為 HTTP。這項參數會遭到忽略,但必須提供,否則 --protocol 會預設為 TCP。
        gcloud compute backend-services create BACKEND_SERVICE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --protocol=HTTP \
            --region=REGION
        
  3. 將無伺服器 NEG 新增至後端服務,以做為後端使用:
        gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
            --region=REGION \
            --network-endpoint-group=SERVERLESS_NEG_NAME \
            --network-endpoint-group-region=REGION
        
  4. 建立地區網址對應,將連入要求轉送至後端服務:
        gcloud compute url-maps create URL_MAP_NAME \
            --default-service=BACKEND_SERVICE_NAME \
            --region=REGION
        
    這個網址對應只以代表單一無伺服器應用程式的後端服務為目標,因此您不需要設定主機規則或路徑比對器。
  5. 選用:如果您在用戶端與負載平衡器之間使用 HTTPS,請執行這個步驟。HTTP 負載平衡器不需要執行這個步驟。

    您可以建立 Compute Engine 或 Certificate Manager 憑證。您可以使用下列任一方法,透過 Certificate Manager 建立憑證:

    建立憑證後,請直接將憑證附加至目標 Proxy。

    如要建立地區自行管理的 SSL 憑證資源,請按照下列步驟操作:
        gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
            --certificate CRT_FILE_PATH \
            --private-key KEY_FILE_PATH \
            --region=REGION
        
  6. 建立地區目標 Proxy,將要求轉送至網址對應。

    如果是 HTTP 負載平衡器,請建立 HTTP 目標 Proxy:
        gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
            --url-map=URL_MAP_NAME \
            --region=REGION
        
    如果是 HTTPS 負載平衡器,請建立 HTTPS 目標 Proxy。 Proxy 是負載平衡器的一部分,用於保存 HTTPS 負載平衡的 SSL 憑證,因此您還可以在此步驟中載入憑證。
        gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
            --ssl-certificates=SSL_CERTIFICATE_NAME \
            --url-map=URL_MAP_NAME \
            --region=REGION
        
  7. 建立轉送規則,將連入要求轉送至 Proxy。 請勿將僅限 Proxy 的子網路用於轉送規則 IP 位址。您可以從子網路 (lb-subnet) 設定任何有效的 IP 位址。

    如果是 HTTP 負載平衡器:
        gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --network=lb-network \
            --subnet=lb-subnet \
            --target-http-proxy=TARGET_HTTP_PROXY_NAME \
            --target-http-proxy-region=REGION \
            --region=REGION \
            --ports=80
        
    如果是 HTTPS 負載平衡器:
        gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --network=lb-network \
            --subnet=lb-subnet \
            --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
            --target-https-proxy-region=REGION \
            --region=REGION \
            --ports=443
        

測試負載平衡器

負載平衡器設定完成後,即可開始將流量傳送至負載平衡器的 IP 位址。

建立用戶端 VM

這個範例會在與負載平衡器相同的地區中建立用戶端 VM (vm-client)。該用戶端用於驗證負載平衡器的設定,以及示範預期行為。

gcloud

用戶端 VM 可以位於與負載平衡器相同 REGION 的任何區域中,也可以使用相同 VPC 網路中的任何子網路。

gcloud compute instances create vm-client \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --network=lb-network \
    --subnet=lb-subnet \
    --zone=ZONE

設定防火牆規則

這個範例需要下列測試用戶端 VM 的防火牆規則:

fw-allow-ssh. 輸入規則,適用於測試用戶端 VM,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 位址範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 位址範圍。本範例使用目標標記 allow-ssh

主控台

  1. 在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。
    前往「防火牆政策」頁面
  2. 按一下「建立防火牆規則」,建立允許連入 SSH 連線的規則:
    • Name (名稱):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」(通訊埠編號)。
  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
    

將流量傳送至負載平衡器

首次部署負載平衡器後,負載平衡器設定可能需要幾分鐘才會生效。

  • 使用 SSH 連線至用戶端執行個體。

    gcloud compute ssh vm-client \
      --zone=ZONE
    
  • 確認負載平衡器是否正常提供 Cloud Run 服務首頁。

    如要測試 HTTP,請執行:

    curl IP_ADDRESS
    

    如要測試 HTTPS,請執行下列指令:

    curl -k -s 'https://TEST_DOMAIN_URL:443' --connect-to TEST_DOMAIN_URL:443:IP_ADDRESS:443
    

    TEST_DOMAIN_URL 替換為與應用程式相關聯的網域。例如:test.example.com

    -k 旗標會讓 curl 略過憑證驗證。

額外設定選項

本節會延伸說明設定範例,並提供替代和其他設定選項。所有工作都是選擇性的。您可以按任何順序執行這些工作。

使用網址遮罩

建立無伺服器 NEG 時,您可以不選取特定 Cloud Run 服務,改用網址遮罩指向在相同網域提供服務的多個服務。網址遮罩是網址結構定義的範本。無伺服器 NEG 會使用這個範本,從傳入要求網址中擷取服務名稱,並將要求對應至適當的服務。

如果您的服務對應至自訂網域,而非 Google Cloud 為已部署服務提供的預設位址,網址遮罩就特別實用。即使應用程式使用自訂網址模式,您也能透過網址遮罩,使用單一規則指定多個服務和版本。

如果尚未閱讀,請務必先參閱無伺服器 NEG 總覽:網址遮罩

建構網址遮罩

如要為負載平衡器建構網址遮罩,請先從服務的網址開始。本範例使用在 https://example.com/login 執行的範例無伺服器應用程式。這是應用程式 login 服務的放送網址。

  1. 從網址中移除 httphttps。你還能產生 example.com/login 組存取碼。
  2. 將服務名稱替換為網址遮罩的預留位置。
    • Cloud Run:將 Cloud Run 服務名稱替換為預留位置 <service>。如果 Cloud Run 服務有相關聯的標記,請將標記名稱替換為預留位置 <tag>。在本範例中,您最後會得到 example.com/<service> 這個網址遮罩。
  3. 選用:如果可以從網址的路徑部分擷取服務名稱,則可以省略網域。網址遮蓋路徑部分是以第一個斜線 (/) 字元做為區別。如果網址遮罩中沒有斜線 (/),系統會將遮罩解讀為只代表主機。因此,在這個範例中,網址遮罩可以縮減為 /<service>

    同樣地,如果 <service> 可以從網址的主機部分擷取,您就可以從網址遮罩中完全省略路徑。

    您也可以省略第一個預留位置之前的所有主機或子網域元件,以及最後一個預留位置之後的所有路徑元件。在這種情況下,預留位置會擷取元件所需的資訊。

以下列舉更多範例,說明這些規則:

下表假設您有一個名為 example.com 的自訂網域,且所有 Cloud Run 服務都對應至這個網域

服務、標記名稱 Cloud Run 自訂網域網址 網址遮罩
服務:登入 https://login-home.example.com/web <service>-home.example.com
服務:登入 https://example.com/login/web example.com/<service> 或 /<service>
service: login, tag: test https://test.login.example.com/web <tag>.<service>.example.com
service: login, tag: test https://example.com/home/login/test example.com/home/<service>/<tag> 或 /home/<service>/<tag>
service: login, tag: test https://test.example.com/home/login/web <tag>.example.com/home/<service>

使用網址遮罩建立無伺服器 NEG

主控台

如果是新的負載平衡器,您可以按照本文先前所述,使用相同的端對端程序。設定後端服務時,請輸入網址遮罩,而非選取特定服務。

如果您有現有的負載平衡器,可以編輯後端設定,讓無伺服器 NEG 指向網址遮罩,而非特定服務。

如要將以網址遮罩為基礎的無伺服器 NEG 新增至現有後端服務,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。
    前往「Load balancing」(負載平衡)
  2. 按一下要編輯後端服務的負載平衡器名稱。
  3. 在「Load balancer details」(負載平衡器詳細資料) 頁面中,按一下 「Edit」(編輯)
  4. 在「Edit global external Application Load Balancer」(編輯全域外部應用程式負載平衡器) 頁面上,點選「Backend configuration」(後端設定)
  5. 在「Backend configuration」(後端設定) 頁面上,針對要修改的後端服務,點選「Edit」(編輯)
  6. 點選「新增後端」
  7. 選取「建立無伺服器網路端點群組」
    1. 在「Name」中輸入 helloworld-serverless-neg
    2. 「Region」下方會顯示負載平衡器的區域。
    3. 在「無伺服器網路端點群組類型」下方,只有「Cloud Run」是支援的網路端點群組類型。
      1. 選取「使用網址遮罩」
      2. 輸入網址遮罩。如要瞭解如何建立網址遮罩,請參閱建構網址遮罩
      3. 點選「建立」

  8. 在「New backend」(新增後端) 中,按一下「Done」(完成)
  9. 按一下「更新」

gcloud

如要使用網址遮罩範例 example.com/<service> 建立無伺服器 NEG,請按照下列步驟操作:

gcloud compute network-endpoint-groups create SERVERLESS_NEG_MASK_NAME \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-url-mask="example.com/<service>"

更新用戶端 HTTP 保持運作逾時

先前步驟中建立的負載平衡器已設定 用戶端 HTTP 保持連線逾時的預設值。

如要更新用戶端 HTTP 保持連線逾時,請按照下列操作說明操作。

控制台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。

    前往「Load balancing」(負載平衡)

  2. 按一下要修改的負載平衡器名稱。
  3. 按一下「編輯」
  4. 按一下「前端設定」
  5. 展開「進階功能」。在「HTTP 保持運作逾時」部分, 輸入逾時值。
  6. 按一下「更新」
  7. 如要檢查變更,請依序按一下「檢查並完成」和「更新」

gcloud

如果是 HTTP 負載平衡器,請使用 gcloud compute target-http-proxies update 指令更新目標 HTTP Proxy。

      gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
         --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
         --region=REGION
      

如果是 HTTPS 負載平衡器,請使用 gcloud compute target-https-proxies update 指令更新目標 HTTPS Proxy。

      gcloud compute target-https-proxies update TARGET_HTTP_PROXY_NAME \
         --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
         --region REGION
      

更改下列內容:

  • TARGET_HTTP_PROXY_NAME:目標 HTTP Proxy 的名稱。
  • TARGET_HTTPS_PROXY_NAME:目標 HTTPS Proxy 的名稱。
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC:HTTP 保持運作逾時值,範圍為 5 到 600 秒。

刪除無伺服器 NEG

如果已將網路端點群組附加至後端服務,則無法予以刪除。刪除 NEG 之前,請確保已將其從後端服務卸離。

主控台

  1. 如要確保要刪除的無伺服器 NEG 未供任何後端服務使用,請前往「負載平衡元件」頁面的「後端服務」分頁。
    前往後端服務
  2. 如果使用無伺服器 NEG,請執行下列操作:
    1. 按一下使用無伺服器 NEG 的後端服務名稱。
    2. 按一下「編輯」
    3. 在「Backends」(後端) 清單中,按一下 ,從後端服務移除無伺服器 NEG 後端。
    4. 按一下 [儲存]

  3. 前往 Google Cloud 控制台的「網路端點群組」頁面。
    前往網路端點群組
  4. 勾選要刪除的無伺服器 NEG 核取方塊。
  5. 點選「刪除」。
  6. 再按一下 [刪除] 加以確認。

gcloud

如要從後端服務移除無伺服器 NEG,您必須指定建立 NEG 的區域。

gcloud compute backend-services remove-backend BACKEND_SERVICE_NAME \
    --network-endpoint-group=SERVERLESS_NEG_NAME \
    --network-endpoint-group-region=REGION \
    --region=REGION

如要刪除無伺服器 NEG:

gcloud compute network-endpoint-groups delete SERVERLESS_NEG_NAME \
    --region=REGION

後續步驟