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

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

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

嘗試執行這個程序之前,請務必熟悉下列主題:

本指南說明如何設定應用程式負載平衡器,將要求代理至無伺服器 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 的子網路。

建立虛擬私有雲網路

建立自訂模式 VPC 網路,然後在區域內建立所需的子網路。

主控台

  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 子網路的共用虛擬私有雲網路名稱。

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

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

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

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

  7. 輸入 IP 位址範圍10.129.0.0/23

  8. 按一下「新增」。

gcloud

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

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

    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. 在「跨區域或單一區域部署」部分,選取「最適合區域工作負載」,然後點選「Next」
  6. 按一下 [設定]

基本設定

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

設定前端

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

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

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

    如果您想在不設定 SSL 憑證資源的情況下測試這個程序,可以設定 HTTP 負載平衡器。

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

設定後端服務

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

設定轉送規則

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

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

檢閱設定

  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 或憑證管理工具憑證。請使用下列任一方法,透過憑證管理工具建立憑證:

    • 區域性自行管理憑證。如要進一步瞭解如何建立及使用區域性自行管理憑證,請參閱「部署區域性自行管理憑證」一文。不支援憑證對應。

    • 區域性 Google 代管憑證。不支援憑證對應。

      Certificate Manager 支援下列類型的區域性 Google 代管憑證:

    建立憑證後,請直接將憑證附加至目標 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 位址。您可以設定子網路中的任何有效 IP 位址 (lb-subnet)。

    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. 按一下「Create firewall rule」(建立防火牆規則),建立允許連入 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
    • 通訊協定和通訊埠
      • 選擇「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
    

將流量傳送至負載平衡器

首次部署負載平衡器後,可能需要幾分鐘的時間才能完成設定。

  • 使用 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 為已部署服務提供的預設位址,網址遮罩就特別實用。即使應用程式使用自訂網址模式,您也可以透過單一規則指定多個服務和版本。

如果您尚未閱讀,請務必參閱 Serverless NEGS 總覽:網址遮罩

建構網址遮罩

如要為負載平衡器建構網址遮罩,請先從服務的網址開始。本範例使用在 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 自訂網域網址 網址遮罩
service: login https://login-home.example.com/web <service>-home.example.com
service: login 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」(負載平衡)頁面。
    前往「負載平衡」
  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. 按一下 [Update]

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 keepalive 逾時的預設值。

如要更新用戶端 HTTP keepalive 逾時值,請按照下列操作說明操作。

控制台

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

    前往「負載平衡」

  2. 按一下要修改的負載平衡器名稱。
  3. 按一下「編輯」圖示
  4. 按一下「前端設定」
  5. 展開「進階功能」。在「HTTP 保持運作逾時」中,輸入逾時值。
  6. 按一下 [Update]
  7. 如要查看變更內容,請依序按一下「Review and finalize」和「Update」

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 主控台的「Network Endpoint Group」(網路端點群組) 頁面。
    前往網路端點群組
  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

後續步驟