使用共用虛擬私有雲設定內部應用程式負載平衡器

本文將說明兩種設定範例,說明如何在共用 VPC 環境中設定內部應用程式負載平衡器:

  • 第一個範例會在一個服務專案中建立所有負載平衡器元件和後端。
  • 第二個範例會在一個服務專案中建立負載平衡器的前端元件和網址對應,而負載平衡器的後端服務和後端則是在其他服務專案中建立。這種部署類型 (網址對應參照其他專案中的後端服務) 稱為跨專案服務參照

在開始建立負載平衡器之前,這兩個範例都需要相同的前置設定,才能授予權限設定共用虛擬私有雲

內部應用程式負載平衡器支援的共用虛擬私有雲設定不只這些。如需瞭解其他有效的共用虛擬私人雲端架構,請參閱「共用虛擬私人雲端架構」。

如果您不想使用共用虛擬私有雲網路,請參閱「設定內部應用程式負載平衡器」一文。

事前準備

  1. 參閱共用虛擬私有雲總覽
  2. 請參閱「內部應用程式負載平衡器總覽」,包括「共用虛擬私有雲端架構」一節。

必要權限

管理員必須進行一些初始設定和佈建作業,才能在共用虛擬私有雲網路上設定負載平衡器。完成初始設定後,服務專案擁有者可以執行下列任一操作:

  • 在服務專案中部署所有負載平衡器元件及其後端。
  • 在服務專案中部署負載平衡器的後端元件 (後端服務和後端),這些元件可由其他服務或主機專案中的網址對應參照。

本節將概述按照本指南設定共用虛擬私有雲網路負載平衡器時,所需的權限。

設定共用虛擬私有雲

如要執行下列工作,您必須具備下列角色:

  1. 執行一次性管理工作,例如設定共用虛擬私有雲和啟用主專案。
  2. 執行管理工作,每次要導入新服務專案時都必須重複執行。包括附加服務專案、佈建及設定網路資源,以及授予服務專案管理員存取權。

這些工作必須在共用虛擬私有雲主專案中執行。建議您將共用 VPC 管理員設為共用 VPC 主專案的擁有者。系統會自動授予網路管理員和安全管理員角色。

工作 必要角色
設定共用虛擬私人雲端、啟用主專案,並授予服務專案管理員存取權 共用虛擬私有雲管理員
在共用 VPC 主機專案中建立子網路,並授予服務專案管理員存取權 網路管理員
新增與移除防火牆規則 安全性管理員

子網路佈建完成後,主專案擁有者必須將主專案中的網路使用者角色授予需要使用這些資源的任何人 (通常是服務專案管理員、開發人員或服務帳戶)。

工作 必要角色
使用屬於主專案的 VPC 網路和子網路 網路使用者

您可以在專案層級或個別子網路中授予這個角色。建議您在個別子網路上授予角色。在專案上授予角色後,即可存取主機專案虛擬私有雲網路中現有和日後的所有子網路。

部署負載平衡器和後端

服務專案管理員需要在服務專案中具備下列角色,才能建立負載平衡資源和後端。這些權限會自動授予服務專案擁有者或編輯者。

在服務專案中授予的角色
工作 必要角色
建立負載平衡器元件 網路管理員
建立執行個體 執行個體管理員
建立及修改 SSL 憑證 安全性管理員

事前準備

在本節中,您需要執行下列步驟:

  1. 在主專案中設定網路和子網路
  2. 在主專案中設定共用虛擬私有雲

您不必每次建立新的負載平衡器時,都執行本節中的步驟。不過,您必須先確認自己有權存取這裡所述的資源,才能繼續建立負載平衡器。

在主專案中設定網路和子網路

您需要具有兩個子網路的共用虛擬私有雲網路:一個用於負載平衡器的前端和後端,另一個用於負載平衡器的 Proxy。

本範例使用以下網路、地區和子網路:

  • 網路:網路名稱為 lb-network

  • 負載平衡器前端和後端的子網路。us-west1 地區中名為 lb-frontend-and-backend-subnet 的子網路使用 10.1.2.0/24 做為其主要 IP 範圍。

  • Proxy 專用子網路。us-west1 地區中名為 proxy-only-subnet 的子網路使用 10.129.0.0/23 做為其主要 IP 範圍。

為負載平衡器的前端和後端設定子網路

您不必每次建立新負載平衡器時都執行這項步驟。您只需要確保服務專案有權存取共用虛擬私有雲網路中的子網路 (除了僅限 Proxy 的子網路)。

本節的所有步驟都必須在主機專案中執行。

主控台

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

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

  2. 按一下「建立虛擬私有雲網路」
  3. 在「Name」(名稱) 中輸入 lb-network
  4. 在「Subnets」(子網路) 區段中:

    1. 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    2. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:

      • Name (名稱):lb-frontend-and-backend-subnet
      • Region (區域):us-west1

      • IP address range (IP 位址範圍):10.1.2.0/24

    3. 按一下 [完成]

  5. 按一下 [建立]。

gcloud

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

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. us-west1 地區的 lb-network 網路中建立子網路:

    gcloud compute networks subnets create lb-frontend-and-backend-subnet 
    --network=lb-network
    --range=10.1.2.0/24
    --region=us-west1

Terraform

  1. 建立虛擬私有雲網路:

    # Shared VPC network
    resource "google_compute_network" "lb_network" {
      name                    = "lb-network"
      provider                = google-beta
      project                 = "my-host-project-id"
      auto_create_subnetworks = false
    }

  2. us-west1 區域中建立子網路:

    # Shared VPC network - backend subnet
    resource "google_compute_subnetwork" "lb_frontend_and_backend_subnet" {
      name          = "lb-frontend-and-backend-subnet"
      provider      = google-beta
      project       = "my-host-project-id"
      region        = "us-west1"
      ip_cidr_range = "10.1.2.0/24"
      role          = "ACTIVE"
      network       = google_compute_network.lb_network.id
    }

設定僅限 Proxy 的子網路

lb-network 虛擬私有雲網路的 us-west1 區域中,所有區域 Envoy 型負載平衡器都會使用僅限 Proxy 的子網路。每個網路和每個地區只能有一個活動的僅限 Proxy 子網路。

如果這個網路的 us-west1 區域中已預留僅限 Proxy 的子網路,請勿執行這項步驟。

本節的所有步驟都必須在主機專案中執行。

主控台

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

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

  2. 按一下共用虛擬私有雲網路名稱:lb-network
  3. 按一下 [新增子網路]
  4. 在「Name」(名稱) 中輸入 proxy-only-subnet
  5. 在「Region」(區域) 中選取 us-west1
  6. 將「用途」設為「區域受管理 Proxy」
  7. 在「IP address range」(IP 位址範圍) 中,輸入 10.129.0.0/23
  8. 按一下「新增」。

gcloud

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

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

Terraform

建立僅限 Proxy 的子網路:

# Shared VPC network - proxy-only subnet
resource "google_compute_subnetwork" "proxy_only_subnet" {
  name          = "proxy-only-subnet"
  provider      = google-beta
  project       = "my-host-project-id"
  region        = "us-west1"
  ip_cidr_range = "10.129.0.0/23"
  role          = "ACTIVE"
  purpose       = "REGIONAL_MANAGED_PROXY"
  network       = google_compute_network.lb_network.id
}

授予服務專案管理員後端子網路的存取權

服務專案管理員必須具備 lb-frontend-and-backend-subnet 子網路的存取權,才能佈建負載平衡器的後端。

共用虛擬私有雲管理員必須將後端子網路存取權授予服務專案管理員 (或部署使用子網路的資源和後端的開發人員)。如需操作說明,請參閱「部分子網路的服務專案管理員」。

在主機專案中設定防火牆規則

這個範例使用以下防火牆規則:
  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的執行個體,可允許來自 130.211.0.0/2235.191.0.0/16 中 Google Cloud健康檢查系統的所有 TCP 流量。這個範例會使用目標標記 load-balanced-backend 來辨識應套用這項規則的執行個體。
  • fw-allow-proxies:輸入規則,適用於要進行負載平衡的執行個體,可在 804438080 通訊埠上允許來自負載平衡器代管 Proxy 的 TCP 流量。這個範例會使用目標標記 load-balanced-backend 來辨識應套用此規則的執行個體。
  • fw-allow-ssh:輸入規則,適用於要進行負載平衡的執行個體,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍。舉例來說,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。這個範例會使用目標標記 allow-ssh 來辨識套用防火牆規則的虛擬機器 (VM)。
如果沒有這些防火牆規則,預設拒絕輸入規則會封鎖傳入至後端執行個體的流量。

本節的所有步驟都必須在主機專案中執行。

主控台

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

    前往「Firewall policies」(防火牆政策) 頁面

  2. 按一下「Create firewall rule」(建立防火牆規則),建立允許 Google Cloud 健康檢查的規則:
    • Name (名稱):fw-allow-health-check
    • Network (網路):lb-network
    • 「Direction of traffic」(流量方向):ingress
    • 「Action on match」(相符時執行的動作):允許
    • 「Target」(目標):指定的目標標記
    • 「Target tags」(目標標記)load-balanced-backend
    • Source filter (來源篩選器):IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP,然後輸入 80 做為通訊埠編號。
      • 最佳做法是將此規則限制為只允許與健康檢查所使用的通訊協定和通訊埠相符的項目。如果您將 tcp:80 用於通訊協定和通訊埠, Google Cloud 可以使用通訊埠 80 上的 HTTP 與 VM 聯絡,但無法使用通訊埠 443 上的 HTTPS 與 VM 聯絡。

  3. 按一下 [建立]。
  4. 按一下「Create firewall rule」(建立防火牆規則),建立允許 Google Cloud 健康檢查的規則:
    • Name (名稱):fw-allow-proxies
    • Network (網路):lb-network
    • 「Direction of traffic」(流量方向):ingress
    • 「Action on match」(相符時執行的動作):允許
    • 「Target」(目標):指定的目標標記
    • 「Target tags」(目標標記)load-balanced-backend
    • Source filter (來源篩選器):IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):10.129.0.0/23
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP,然後輸入 80, 443, 8080 做為通訊埠編號。
  5. 按一下 [建立]。
  6. 按一下「Create firewall rule」(建立防火牆規則),建立允許 Google Cloud 健康檢查的規則:
    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network
    • 「Direction of traffic」(流量方向):ingress
    • 「Action on match」(相符時執行的動作):允許
    • 「Target」(目標):指定的目標標記
    • 「Target tags」(目標標記)allow-ssh
    • Source filter (來源篩選器):IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP,然後輸入 22 做為通訊埠編號。
  7. 按一下 [建立]。

gcloud

  1. 建立 fw-allow-health-check 防火牆規則,允許Google Cloud 健康狀態檢查。這個範例可允許來自健康狀態檢查探測器的所有 TCP 流量。不過,您可以設定較狹隘的連接埠組合,以符合需求。

    gcloud compute firewall-rules create fw-allow-health-check \
       --network=lb-network \
       --action=allow \
       --direction=ingress \
       --source-ranges=130.211.0.0/22,35.191.0.0/16 \
       --target-tags=load-balanced-backend \
       --rules=tcp
    
  2. 建立 fw-allow-proxies 防火牆規則,允許來自 Envoy Proxy 專用子網路的流量傳送至後端。

    gcloud compute firewall-rules create fw-allow-proxies \
       --network=lb-network \
       --action=allow \
       --direction=ingress \
       --source-ranges=10.129.0.0/23 \
       --target-tags=load-balanced-backend \
       --rules=tcp:80,tcp:443,tcp:8080
    

  3. 建立 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
    

Terraform

  1. 建立防火牆規則,允許 Google Cloud 健康狀態檢查。

    resource "google_compute_firewall" "fw_allow_health_check" {
      name          = "fw-allow-health-check"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
      allow {
        protocol = "tcp"
      }
      target_tags = ["load-balanced-backend"]
    }

  2. 建立防火牆規則,允許從 Envoy 僅限 Proxy 子網路傳送的流量傳送至後端。

    resource "google_compute_firewall" "fw_allow_proxies" {
      name          = "fw-allow-proxies"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["10.129.0.0/23"]
      allow {
        protocol = "tcp"
        ports    = ["80", "443", "8080"]
      }
      target_tags = ["load-balanced-backend"]
    }

  3. 建立防火牆規則,允許與網路標記為 allow-ssh 的 VM 建立 SSH 連線。

    resource "google_compute_firewall" "fw_allow_ssh" {
      name          = "fw-allow-ssh"
      provider      = google-beta
      project       = "my-host-project-id"
      direction     = "INGRESS"
      network       = google_compute_network.lb_network.id
      source_ranges = ["0.0.0.0/0"]
      allow {
        protocol = "tcp"
        ports    = ["22"]
      }
      target_tags = ["allow-ssh"]
    }

在主專案中設定共用虛擬私有雲

這個步驟包括啟用共用虛擬私有雲主專案、共用主專案的子網路,以及將服務專案連結至主專案,以便服務專案使用共用虛擬私有雲網路。如要在主專案中設定共用虛擬私有雲,請參閱下列頁面:

以下操作說明假設您已設定共用虛擬私人雲端。包括為機構設定 IAM 政策,以及指定主機和服務專案。

請先設定共用虛擬私有雲,並啟用主專案和服務專案,再繼續操作。

完成本節所述的必備條件後,您可以採用下列任一設定:

在服務專案中設定負載平衡器

這個範例會建立內部應用程式負載平衡器,在該負載平衡器中,所有負載平衡元件 (轉送規則、目標 Proxy、網址對應和後端服務) 和後端都會在服務專案中建立。

內部應用程式負載平衡器的網路資源 (例如僅限 Proxy 的子網路和後端執行個體的子網路) 會在主機專案中建立。主機專案也會建立後端執行個體的防火牆規則。

圖 1. 共用虛擬私有雲中的內部應用程式負載平衡器
圖 1. 共用虛擬私有雲中的內部應用程式負載平衡器

本節說明如何設定負載平衡器和後端。這些步驟應由服務專案管理員 (或在服務專案中運作的開發人員) 執行,不需要主專案管理員的協助。本節的步驟與設定內部應用程式負載平衡器的標準步驟大致相同。

本頁的範例會為內部應用程式負載平衡器的轉送規則明確設定保留的內部 IP 位址,而不允許分配暫時的內部 IP 位址。建議您最好為轉送規則保留 IP 位址。

建立代管執行個體群組後端

本節說明如何建立範本和代管執行個體群組。代管執行個體群組提供的 VM 執行個體,會執行內部應用程式負載平衡器範例的後端伺服器。從用戶端到這些後端伺服器的流量會經過負載平衡。為示範之用,後端會提供自己的主機名稱。

主控台

  1. 建立執行個體範本。前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

    1. 點選「建立執行個體範本」
    2. 在「Name」(名稱) 中輸入 l7-ilb-backend-template
    3. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get。如果您需要變更「開機磁碟」,請按一下「變更」
      1. 在「作業系統」部分,選取「Debian」
      2. 在「版本」中,選取其中一個可用的 Debian 映像檔,例如 Debian GNU/Linux 12 (bookworm)
      3. 按一下 [選取]。
    4. 依序點選「進階選項」和「網路」
    5. 輸入下列「Network tags」(網路標記)allow-sshload-balanced-backend
    6. 在「Network interfaces」部分,選取「Networks shared with me (from host project: HOST_PROJECT_ID)」
    7. lb-network 網路中選取 lb-frontend-and-backend-subnet 子網路。
    8. 按一下 [Management] (管理)。在「Management」(管理) 下,將以下指令碼插入「Startup script」(開機指令碼) 欄位。
       #! /bin/bash
       apt-get update
       apt-get install apache2 -y
       a2ensite default-ssl
       a2enmod ssl
       vm_hostname="$(curl -H "Metadata-Flavor:Google" 
      http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" |
      tee /var/www/html/index.html systemctl restart apache2
    9. 按一下 [建立]。
  2. 建立代管執行個體群組。在 Google Cloud 控制台中,前往「Instance groups」(執行個體群組) 頁面。

    前往「Instance groups」(執行個體群組)

    1. 點選「建立執行個體群組」
    2. 選擇「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 在「Name」(名稱) 中輸入 l7-ilb-backend-example
    4. 在「Location」(位置) 中,選取「Single zone」(單一可用區)
    5. 在「Region」(區域) 中選取 us-west1
    6. 在「Zone」(區域) 中選取 us-west1-a
    7. 在「Instance template」(執行個體範本) 中選取 l7-ilb-backend-template
    8. 指定要在群組中建立的執行個體數量。

      在本例中,請為「自動調度資源」指定下列選項:

      • 針對「Autoscaling mode」(自動調度資源模式),選取 Off:do not autoscale
      • 在「Maximum number of instances」(執行個體數量上限) 中輸入 2

      您也可以根據需要,在 UI 的「Autoscaling」(自動調度資源) 區段中,將執行個體群組設為根據執行個體 CPU 使用量自動新增或移除執行個體

    9. 按一下 [建立]。

gcloud

本指南的 gcloud 操作說明假設您使用 Cloud Shell 或已安裝 bash 的其他環境。

  1. 使用 gcloud compute instance-templates create 指令,建立含有 HTTP 伺服器的 VM 執行個體範本。

    gcloud compute instance-templates create l7-ilb-backend-template \
    --region=us-west1 \
    --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
    --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
    --tags=allow-ssh,load-balanced-backend \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2' \
    --project=SERVICE_PROJECT_ID
    
  2. 使用 gcloud compute instance-groups managed create 指令,在區域中建立代管執行個體群組。

    gcloud compute instance-groups managed create l7-ilb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-ilb-backend-template \
        --project=SERVICE_PROJECT_ID
    

Terraform

  1. 建立 VM 執行個體範本。

    # Instance template
    resource "google_compute_instance_template" "default" {
      name     = "l7-ilb-backend-template"
      provider = google-beta
      project  = "my-service-project-id"
      region   = "us-west1"
      # For machine type, using small. For more options check https://cloud.google.com/compute/docs/machine-types
      machine_type = "e2-small"
      tags         = ["allow-ssh", "load-balanced-backend"]
      network_interface {
        network    = google_compute_network.lb_network.id
        subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
        access_config {
          # add external ip to fetch packages like apache2, ssl
        }
      }
      disk {
        source_image = "debian-cloud/debian-12"
        auto_delete  = true
        boot         = true
      }
    
      # install apache2 and serve a simple web page
      metadata = {
        startup-script = <<EOF
        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://metadata.google.internal/computeMetadata/v1/instance/name)"
        sudo echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2
        EOF
      }
    }
  2. 建立代管執行個體群組。

    HTTP:

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "http"
        port = 80
      }
    }

    適用於 HTTPS:

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "https"
        port = 443
      }
    }

設定負載平衡器

本節說明如何建立內部應用程式負載平衡器資源:

  • HTTP 健康狀態檢查
  • 以代管執行個體群組做為後端的後端服務
  • 網址對應
  • SSL 憑證 (僅適用於 HTTPS)
  • 目標 Proxy
  • 轉送規則

Proxy 可用性

根據使用相同共用虛擬私有雲網路的服務專案數量,您可能會比在每個 Google Cloud 專案都主控自身網路的網路部署模型更快達到配額或限制

舉例來說,有時 Google Cloud 區域沒有足夠的 Proxy 容量,無法支援新的內部應用程式負載平衡器。如果發生這種情況,您在建立負載平衡器時, Google Cloud 主控台會提供代理可用性警告訊息。如要解決這個問題,請採取下列任一做法:

  • 等待容量問題解決。
  • 如要提高這些上限,請與 Google Cloud 銷售團隊聯絡。

主控台

將內容切換至服務專案

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

    前往資訊主頁

  2. 按一下頁面頂端的「Select from」清單。在隨即顯示的「Select from」視窗中,選取要建立負載平衡器的服務專案。

開始設定

  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. 在負載平衡器的「Name」(名稱) 中輸入 l7-ilb-shared-vpc
  2. 在「區域」部分,選取 us-west1
  3. 在「Network」(網路) 中,選取「lb-network」(位於「Project: HOST_PROJECT_ID下方)。

    如果您看到「共用虛擬私有雲網路中必須具備僅限 Proxy 的子網路」警告,請確認主機專案管理員已在 lb-network 共用虛擬私有雲網路的 us-west1 區域中建立 proxy-only-subnet。即使您沒有權限查看這個頁面上的僅限 Proxy 子網路,系統還是可以順利建立負載平衡器。

  4. 將視窗保持開啟,以便繼續操作。

設定後端

  1. 按一下「後端設定」
  2. 在「Create or select backend services」選單中,選取「Create a backend service」
  3. 將後端服務的「Name」設為 l7-ilb-backend-service
  4. 將「後端類型」(Backend type) 設為「Instance groups」(執行個體群組)
  5. 在「New backend」部分中:
    1. 將「Instance group」(執行個體群組) 設為 l7-ilb-backend-example
    2. 將「Port numbers」(通訊埠編號) 設為 80
    3. 將「Balancing mode」(平衡模式) 設為「Utilization」(使用率)
    4. 按一下 [完成]
  6. 在「Health check」部分中,選擇「Create a Health check」,並使用下列參數:
    1. Name (名稱):l7-ilb-basic-check
    2. Protocol (通訊協定):HTTP
    3. Port (通訊埠):80
  7. 點選「儲存並繼續」
  8. 按一下 [建立]。

設定轉送規則

  • 按一下「轉送規則」。確保 l7-ilb-backend-service 是任何不相符主機和路徑的唯一後端服務。

如要瞭解流量管理,請參閱「設定流量管理」一文。

設定前端

HTTP:

  1. 按一下「前端設定」
  2. 將「Name」(名稱) 設為 l7-ilb-forwarding-rule
  3. 將「Protocol」(通訊協定) 設為 HTTP
  4. 將「子網路」設為 lb-frontend-and-backend-subnet。請勿為前端選取 Proxy 專用子網路,即使清單中提供此選項也一樣。
  5. 將「Port」(通訊埠) 設為 80
  6. 按一下「IP address」選單,然後點選「Create IP address」
  7. 在「預留靜態內部 IP 位址」面板中,提供下列詳細資料:
    1. 在「Name」 中輸入 ip-address-shared-vpc
    2. 在「Static IP address」(靜態 IP 位址) 中,點選「Let me choose」(自行選擇)。在「自訂 IP 位址」中輸入 10.1.2.99
    3. (選用) 如果您想與不同前端共用這個 IP 位址,請將「用途」設為「共用」
  8. 按一下 [完成]

適用於 HTTPS:

如果您在用戶端與負載平衡器間使用的是 HTTPS,則需要有一個或多個 SSL 憑證資源才能設定 Proxy。如要瞭解如何建立 SSL 憑證資源,請參閱「SSL 憑證」。內部應用程式負載平衡器目前不支援 Google 管理的憑證。

  1. 按一下「前端設定」
  2. 在「Name」(名稱) 欄位中輸入 l7-ilb-forwarding-rule
  3. 在「Protocol」欄位中選取 HTTPS (includes HTTP/2)
  4. 將「子網路」設為 lb-frontend-and-backend-subnet。請勿為前端選取 Proxy 專用子網路,即使清單中提供此選項也一樣。
  5. 確認「Port」(通訊埠) 已設為 443,以允許 HTTPS 流量。
  6. 按一下「IP address」選單,然後點選「Create IP address」
  7. 在「預留靜態內部 IP 位址」面板中,提供下列詳細資料:
    1. 在「Name」 中輸入 ip-address-shared-vpc
    2. 在「Static IP address」(靜態 IP 位址) 中,點選「Let me choose」(自行選擇)。在「自訂 IP 位址」中輸入 10.1.2.99
    3. (選用) 如果您想與不同前端共用這個 IP 位址,請將「用途」設為「共用」
  8. 按一下「憑證」清單。
    1. 如果您已擁有自行管理的 SSL 憑證資源,且想要做為主要 SSL 憑證使用,請從選單中選取所需資源。
    2. 否則,請選取「Create a new certificate」
      1. 填入 l7-ilb-cert 的「名稱」
      2. 在適當的欄位中上傳 PEM 格式的檔案:
        • 公用金鑰憑證
        • 憑證鏈結
        • 私密金鑰
      3. 按一下 [建立]。
  9. 如要新增主要安全資料傳輸層 (SSL) 憑證資源以外的憑證資源,請按照下列指示操作:
    1. 按一下「新增憑證」
    2. 從「Certificates」清單中選取所需憑證,或是按一下「Create a new certificate」並按照先前的操作說明操作。
  10. 按一下 [完成]

檢查並完成設定

  • 按一下 [建立]。

gcloud

  1. 使用 gcloud compute health-checks create http 指令定義 HTTP 健康狀態檢查。

    gcloud compute health-checks create http l7-ilb-basic-check \
       --region=us-west1 \
       --use-serving-port \
       --project=SERVICE_PROJECT_ID
    
  2. 使用 gcloud compute backend-services create 指令定義後端服務。

    gcloud compute backend-services create l7-ilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=l7-ilb-basic-check \
      --health-checks-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  3. 使用 gcloud compute backend-services add-backend 指令,將後端新增到後端服務。

    gcloud compute backend-services add-backend l7-ilb-backend-service \
      --balancing-mode=UTILIZATION \
      --instance-group=l7-ilb-backend-example \
      --instance-group-zone=us-west1-a \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  4. 使用 gcloud compute url-maps create 指令建立網址對應。

    gcloud compute url-maps create l7-ilb-map \
      --default-service=l7-ilb-backend-service \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    
  5. 建立目標 Proxy。

    HTTP:

    針對內部 HTTP 負載平衡器,請使用 gcloud compute target-http-proxies create 指令建立目標 Proxy。

    gcloud compute target-http-proxies create l7-ilb-proxy \
      --url-map=l7-ilb-map \
      --url-map-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

    適用於 HTTPS:

    如要瞭解如何建立 SSL 憑證資源,請參閱「SSL 憑證」。內部應用程式負載平衡器目前不支援 Google 管理的憑證。

    將檔案路徑指派給變數名稱。

    export LB_CERT=path to PEM-formatted file
    
    export LB_PRIVATE_KEY=path to PEM-formatted file
    

    使用 gcloud compute ssl-certificates create 指令建立地區 SSL 憑證。

    gcloud compute ssl-certificates create l7-ilb-cert \
      --certificate=$LB_CERT \
      --private-key=$LB_PRIVATE_KEY \
      --region=us-west1
    

    使用地區 SSL 憑證,搭配 gcloud compute target-https-proxies create 指令建立目標 Proxy。

    gcloud compute target-https-proxies create l7-ilb-proxy \
      --url-map=l7-ilb-map \
      --region=us-west1 \
      --ssl-certificates=l7-ilb-cert \
      --project=SERVICE_PROJECT_ID
    
  6. 建立轉寄規則。

    如果是自訂網路,您必須參照轉送規則中的子網路。

    如要取得轉送規則的 IP 位址,請使用 lb-frontend-and-backend-subnet。如果您嘗試使用僅限 Proxy 的子網路,轉送規則建立作業將會失敗。

    HTTP:

    使用 gcloud compute forwarding-rules create 指令並加上正確的旗標。

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_NAME \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-ilb-proxy \
      --target-http-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

    適用於 HTTPS:

    使用 gcloud compute forwarding-rules create 指令並加上正確的旗標。

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_NAME \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=l7-ilb-proxy \
      --target-https-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_ID
    

Terraform

  1. 定義 HTTP 健康狀態檢查。

    HTTP:

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-id"
      timeout_sec        = 1
      check_interval_sec = 1
      http_health_check {
        port = "80"
      }
    }

    適用於 HTTPS:

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-id"
      timeout_sec        = 1
      check_interval_sec = 1
      https_health_check {
        port = "443"
      }
    }

  2. 定義後端服務。

    # backend service
    resource "google_compute_region_backend_service" "default" {
      name                  = "l7-ilb-backend-service"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      protocol              = "HTTP"
      load_balancing_scheme = "INTERNAL_MANAGED"
      timeout_sec           = 10
      health_checks         = [google_compute_health_check.default.id]
      backend {
        group           = google_compute_instance_group_manager.default.instance_group
        balancing_mode  = "UTILIZATION"
        capacity_scaler = 1.0
      }
    }
  3. 建立網址對應。

    # URL map
    resource "google_compute_region_url_map" "default" {
      name            = "l7-ilb-map"
      provider        = google-beta
      project         = "my-service-project-id"
      region          = "us-west1"
      default_service = google_compute_region_backend_service.default.id
    }
  4. 建立目標 Proxy。

    HTTP:

    # HTTP target proxy
    resource "google_compute_region_target_http_proxy" "default" {
      name     = "l7-ilb-proxy"
      provider = google-beta
      project  = "my-service-project-id"
      region   = "us-west1"
      url_map  = google_compute_region_url_map.default.id
    }

    HTTPS:建立地區 SSL 憑證

    如要瞭解如何建立 SSL 憑證資源,請參閱「SSL 憑證」。內部應用程式負載平衡器目前不支援 Google 管理的憑證。

    # Use self-signed SSL certificate
    resource "google_compute_region_ssl_certificate" "default" {
      name        = "l7-ilb-cert"
      provider    = google-beta
      project     = "my-service-project-id"
      region      = "us-west1"
      private_key = file("sample-private.key") # path to PEM-formatted file
      certificate = file("sample-server.cert") # path to PEM-formatted file
    }

    使用地區 SSL 憑證建立目標 Proxy

    # HTTPS target proxy
    resource "google_compute_region_target_https_proxy" "default" {
      name             = "l7-ilb-proxy"
      provider         = google-beta
      project          = "my-service-project-id"
      region           = "us-west1"
      url_map          = google_compute_region_url_map.default.id
      ssl_certificates = [google_compute_region_ssl_certificate.default.id]
    }
  5. 建立轉寄規則。

    如果是自訂網路,您必須參照轉送規則中的子網路。

    HTTP:

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "80"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_http_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

    適用於 HTTPS:

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "443"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_https_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

測試負載平衡器

如要測試負載平衡器,請先建立用戶端 VM 範例。接著,請與 VM 建立 SSH 工作階段,並將流量從這個 VM 傳送至負載平衡器。

建立測試 VM 執行個體

用戶端可位於主專案或任何已連結的服務專案中。在這個範例中,您會在服務專案中部署用戶端 VM,以測試負載平衡器是否正常運作。用戶端必須使用相同的共用虛擬私有雲網路,並與負載平衡器位於相同的地區。

主控台

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 點選「建立執行個體」

  3. 將「Name」(名稱) 設為 client-vm

  4. 將「Zone」(區域) 設為 us-west1-a

  5. 依序點選「進階選項」和「網路」

  6. 輸入下列「Network tags」(網路標記)allow-sshload-balanced-backend

  7. 在「Network interfaces」部分,選取「Networks shared with me (from host project: HOST_PROJECT_ID)」

  8. lb-network 網路中選取 lb-frontend-and-backend-subnet 子網路。

  9. 按一下 [建立]。

gcloud

建立測試 VM 執行個體。

gcloud compute instances create client-vm \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
    --zone=us-west1-a \
    --tags=allow-ssh \
    --project=SERVICE_PROJECT_ID

Terraform

建立測試 VM 執行個體。

resource "google_compute_instance" "vm_test" {
  name         = "client-vm"
  provider     = google-beta
  project      = "my-service-project-id"
  zone         = "us-west1-a"
  machine_type = "e2-small"
  tags         = ["allow-ssh"]
  network_interface {
    network    = google_compute_network.lb_network.id
    subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }
  lifecycle {
    ignore_changes = [
      metadata["ssh-keys"]
    ]
  }
}

將流量傳送至負載平衡器

使用 SSH 連線至您剛建立的執行個體,並測試後端的 HTTP(S) 服務是否可以透過內部應用程式負載平衡器的轉送規則 IP 位址連線,並且在後端執行個體之間進行流量負載平衡。

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

    gcloud compute ssh client-vm \
       --zone=us-west1-a
    
  2. 確認 IP 位址是否提供主機名稱。將 LB_IP_ADDRESS 替換為負載平衡器的 IP 位址。

    curl LB_IP_ADDRESS
    

    如要測試 HTTPS,請將 curl 替換為以下內容:

    curl -k -s 'https://LB_IP_ADDRESS:443'
    

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

設定具有跨專案後端服務的負載平衡器

本頁先前的範例說明如何設定共用虛擬私有雲部署作業,在服務專案中建立所有負載平衡器元件及其後端。

內部應用程式負載平衡器也能讓您設定共用虛擬私有雲部署作業,讓主機或服務專案中的網址對應項目,能參照位於共用虛擬私有雲環境中多個服務專案的後端服務 (和後端)。這稱為跨專案服務參照

您可以參考本節的步驟,設定下列任何支援的組合:

  • 主機專案中的轉送規則、目標 Proxy 和網址對應,以及服務專案中的後端服務
  • 服務專案中的轉送規則、目標 Proxy 和網址對應,以及其他服務專案中的後端服務

跨專案服務參照可搭配執行個體群組、無伺服器 NEG 或任何其他支援的後端類型使用。如果您使用無伺服器 NEG,則需要在要建立負載平衡器前端的虛擬私人雲端網路中建立 VM。如需範例,請參閱「使用 Cloud Run 設定內部應用程式負載平衡器」一文中的「在特定子網路中建立 VM 執行個體」。

設定需求條件

本例會在兩個不同的服務專案中,設定負載平衡器範例的前端和後端。

如果您尚未完成,請務必完成所有必要步驟,設定共用虛擬私有雲,並設定本例所需的網路、子網路和防火牆規則。如需操作說明,請參閱以下內容:

圖 2:負載平衡器的前端和後端位於不同的服務專案
圖 2. 負載平衡器的前端和後端位於不同的服務專案

在服務專案 B 中建立後端和後端服務

本節的所有步驟都必須在服務專案 B 中執行。

主控台

  1. 建立執行個體範本。前往 Google Cloud 控制台的「Instance Templates」(執行個體範本) 頁面。

    前往「Instance templates」(執行個體範本) 頁面

    1. 點選「建立執行個體範本」
    2. 輸入執行個體範本的「Name」(名稱)cross-ref-backend-template
    3. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get。如果您需要變更「開機磁碟」,請按一下「變更」
      1. 在「作業系統」部分,選取「Debian」
      2. 在「版本」中,選取其中一個可用的 Debian 映像檔,例如 Debian GNU/Linux 12 (bookworm)
      3. 按一下 [選取]。
    4. 依序點選「進階選項」和「網路」
    5. 輸入下列「Network tags」(網路標記)allow-sshload-balanced-backend
    6. 在「Network interfaces」部分,選取「Networks shared with me (from host project: HOST_PROJECT_ID)」
    7. lb-network 網路中選取 lb-frontend-and-backend-subnet 子網路。
    8. 按一下 [Management] (管理)。在「Management」(管理) 下,將以下指令碼插入「Startup script」(開機指令碼) 欄位。
      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" 
      http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" |
      tee /var/www/html/index.html systemctl restart apache2
    9. 按一下 [建立]。
  2. 建立代管執行個體群組。在 Google Cloud 控制台中,前往「Instance groups」(執行個體群組) 頁面。

    前往「Instance groups」(執行個體群組)

    1. 點選「建立執行個體群組」
    2. 選擇「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
    3. 輸入執行個體群組的名稱cross-ref-ig-backend
    4. 在「Location」(位置) 中,選取「Single zone」(單一可用區)
    5. 在「Region」(區域) 中選取 us-west1
    6. 在「Zone」(可用區) 中選取 us-west1-a
    7. 針對「Instance template」,選取「cross-ref-backend-template」
    8. 指定要在群組中建立的執行個體數量。

      在本例中,請為「自動調度資源」指定下列選項:

      • 針對「Autoscaling mode」(自動調度資源模式),選取 Off:do not autoscale
      • 在「Maximum number of instances」(執行個體數量上限) 中輸入 2

      您也可以根據需要,在 UI 的「Autoscaling」(自動調度資源) 區段中,將執行個體群組設為根據執行個體 CPU 使用量自動新增或移除執行個體

    9. 按一下 [建立]。

  3. 建立區域後端服務。在這個步驟中,我們也會建立健康狀態檢查,並將後端服務新增至後端服務。在 Google Cloud 控制台中,前往「Backends」頁面。

    前往「後端」

    1. 按一下「建立區域後端服務」
    2. 在「Name」(名稱) 中輸入後端服務:cross-ref-backend-service
    3. 在「Region」(地區) 中,選取 us-west1
    4. 在「負載平衡器類型」部分,選取「區域性內部應用程式負載平衡器 (INTERNAL_MANAGED)」
    5. 將「後端類型」(Backend type) 設為「Instance groups」(執行個體群組)
    6. 在「Backends」部分,將「Network」設為「lb-network」
    7. 按一下「Add backend」(新增後端),然後設定下列欄位:
      1. 將「Instance group」(執行個體群組) 設為「cross-ref-ig-backend」
      2. 輸入「Port numbers」(通訊埠編號)80
      3. 將「Balancing mode」(平衡模式) 設為「Utilization」(使用率)
      4. 按一下 [完成]
    8. 在「Health check」部分中,選擇「Create a Health check」,並使用下列參數:
      1. Name (名稱):cross-ref-http-health-check
      2. Protocol (通訊協定):HTTP
      3. Port (通訊埠):80
      4. 按一下 [儲存]
    9. 按一下「繼續」
    10. 選用:在「新增權限」部分,輸入其他專案負載平衡器管理員的 IAM 主體 (通常是電子郵件地址),以便他們為自己專案中的負載平衡器使用此後端服務。如果沒有這項權限,就無法使用跨專案服務參照。

      如果您沒有權限為此專案中的後端服務設定存取控管政策,還是可以立即建立後端服務,授權使用者稍後可執行這項步驟,詳情請參閱「授予負載平衡器管理員使用後端服務的權限」一節。該部分也說明如何授予此專案中所有後端服務的存取權,這樣您就不必每次建立新的後端服務時都授予存取權。

    11. 按一下 [建立]。

gcloud

  1. 使用 gcloud compute instance-templates create 指令,建立含有 HTTP 伺服器的 VM 執行個體範本。

    gcloud compute instance-templates create BACKEND_IG_TEMPLATE \
        --region=us-west1 \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
        --tags=allow-ssh,load-balanced-backend \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --metadata=startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2 -y
        a2ensite default-ssl
        a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://metadata.google.internal/computeMetadata/v1/instance/name)"
        echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        systemctl restart apache2' \
        --project=SERVICE_PROJECT_B_ID
    

    更改下列內容:

    • BACKEND_IG_TEMPLATE:執行個體群組範本的名稱。
    • SERVICE_PROJECT_B_ID:服務專案 B 的專案 ID,負載平衡器的後端和後端服務會在該專案中建立。
    • HOST_PROJECT_ID:共用虛擬私有雲主專案的專案 ID。
  2. 使用 gcloud compute instance-groups managed create 指令,在區域中建立代管執行個體群組。

    gcloud compute instance-groups managed create BACKEND_MIG \
        --zone=us-west1-a \
        --size=2 \
        --template=BACKEND_IG_TEMPLATE \
        --project=SERVICE_PROJECT_B_ID
    

    更改下列內容:

    • BACKEND_MIG:後端執行個體群組的名稱。
  3. 使用 gcloud compute health-checks create http 指令定義 HTTP 健康狀態檢查。

    gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
      --region=us-west1 \
      --use-serving-port \
      --project=SERVICE_PROJECT_B_ID
    

    更改下列內容:

    • HTTP_HEALTH_CHECK_NAME:HTTP 健康狀態檢查的名稱。
  4. 使用 gcloud compute backend-services create 指令定義後端服務。

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=HTTP_HEALTH_CHECK_NAME \
      --health-checks-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_B_ID
    

    更改下列內容:

    • BACKEND_SERVICE_NAME:在服務專案 B 中建立的後端服務名稱。
  5. 使用 gcloud compute backend-services add-backend 指令,將後端新增到後端服務。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --balancing-mode=UTILIZATION \
      --instance-group=BACKEND_MIG \
      --instance-group-zone=us-west1-a \
      --region=us-west1 \
      --project=SERVICE_PROJECT_B_ID
    

Terraform

  1. 建立執行個體範本。

    # Instance template
    resource "google_compute_instance_template" "default" {
      name     = "l7-ilb-backend-template"
      provider = google-beta
      project  = "my-service-project-b-id"
      region   = "us-west1"
      # For machine type, using small. For more options check https://cloud.google.com/compute/docs/machine-types
      machine_type = "e2-small"
      tags         = ["allow-ssh", "load-balanced-backend"]
      network_interface {
        network    = google_compute_network.lb_network.id
        subnetwork = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
        access_config {
          # add external ip to fetch packages like apache2, ssl
        }
      }
      disk {
        source_image = "debian-cloud/debian-12"
        auto_delete  = true
        boot         = true
      }
    
      # install apache2 and serve a simple web page
      metadata = {
        startup-script = <<EOF
        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://metadata.google.internal/computeMetadata/v1/instance/name)"
        sudo echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2
        EOF
      }
    }
  2. 建立代管執行個體群組。

    HTTP

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-b-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "http"
        port = 80
      }
    }

    HTTPS

    # MIG
    resource "google_compute_instance_group_manager" "default" {
      name               = "l7-ilb-backend-example"
      provider           = google-beta
      project            = "my-service-project-b-id"
      zone               = "us-west1-a"
      base_instance_name = "vm"
      target_size        = 2
      version {
        instance_template = google_compute_instance_template.default.id
        name              = "primary"
      }
      named_port {
        name = "https"
        port = 443
      }
    }
  3. 為後端建立健康狀態檢查。

    HTTP

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-b-id"
      timeout_sec        = 1
      check_interval_sec = 1
      http_health_check {
        port = "80"
      }
    }

    HTTPS

    # health check
    resource "google_compute_health_check" "default" {
      name               = "l7-ilb-basic-check"
      provider           = google-beta
      project            = "my-service-project-b-id"
      timeout_sec        = 1
      check_interval_sec = 1
      https_health_check {
        port = "443"
      }
    }
  4. 建立區域後端服務。

    # backend service
    resource "google_compute_region_backend_service" "default" {
      name                  = "l7-ilb-backend-service"
      provider              = google-beta
      project               = "my-service-project-b-id"
      region                = "us-west1"
      protocol              = "HTTP"
      load_balancing_scheme = "INTERNAL_MANAGED"
      timeout_sec           = 10
      health_checks         = [google_compute_health_check.default.id]
      backend {
        group           = google_compute_instance_group_manager.default.instance_group
        balancing_mode  = "UTILIZATION"
        capacity_scaler = 1.0
      }
    }

在服務專案 A 中建立負載平衡器前端和網址對應

本節的所有步驟都必須在服務專案 A 中執行。

主控台

開始設定

  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. 在「Name」(名稱) 中輸入負載平衡器的名稱。
  2. 在「區域」部分,選取 us-west1
  3. 在「Network」(網路) 中,選取「lb-network」(位於「Project: HOST_PROJECT_NAME下方)。

    如果您看到「共用虛擬私有雲網路中必須具備僅限 Proxy 的子網路」警告,請確認主機專案管理員已在 lb-network 共用虛擬私有雲網路的 us-west1 區域中建立 proxy-only-subnet。即使您沒有權限查看這個頁面上的僅限 Proxy 子網路,系統還是可以順利建立負載平衡器。

  4. 將視窗保持開啟,以便繼續操作。

設定後端

  1. 按一下「後端設定」
  2. 按一下「跨專案後端服務」
  3. 在「Project ID」中,輸入服務專案 B 的專案 ID
  4. 在「Select backend services」(選取後端服務)清單中,選取要使用的服務專案 B 中的後端服務。在本例中,請輸入 cross-ref-backend-service
  5. 按一下 [確定]

設定轉送規則

  • 按一下「轉送規則」。確認「cross-ref-backend-service」cross-ref-backend-service是任何不相符主機和路徑的唯一後端服務。

如要瞭解流量管理,請參閱「設定流量管理」一文。

設定前端

如要讓跨專案服務參照功能運作,前端必須使用共用虛擬私有雲主機專案中用來建立後端服務的相同網路 (lb-network)。

HTTP:

  1. 按一下「前端設定」
  2. 輸入轉寄規則的「Name」(名稱)cross-ref-http-forwarding-rule
  3. 將「Protocol」(通訊協定) 設為 HTTP
  4. 將「子網路」設為 lb-frontend-and-backend-subnet。請勿為前端選取 Proxy 專用子網路,即使清單中提供此選項也一樣。
  5. 將「Port」(通訊埠) 設為 80
  6. 按一下「IP address」選單,然後點選「Create IP address」
  7. 在「預留靜態內部 IP 位址」面板中,提供下列詳細資料:
    1. 在「Name」 中輸入 cross-ref-ip-address
    2. 在「Static IP address」(靜態 IP 位址) 中,點選「Let me choose」(自行選擇)。在「自訂 IP 位址」中輸入 10.1.2.98
    3. (選用) 如果您想與不同前端共用這個 IP 位址,請將「用途」設為「共用」
  8. 按一下 [完成]

適用於 HTTPS:

如果您在用戶端與負載平衡器間使用的是 HTTPS,則需要有一個或多個 SSL 憑證資源才能設定 Proxy。如要瞭解如何建立 SSL 憑證資源,請參閱「SSL 憑證」。內部應用程式負載平衡器目前不支援 Google 管理的憑證。

  1. 按一下「前端設定」
  2. 輸入轉寄規則的「Name」(名稱)cross-ref-https-forwarding-rule
  3. 在「Protocol」欄位中選取 HTTPS (includes HTTP/2)
  4. 將「子網路」設為 lb-frontend-and-backend-subnet。請勿為前端選取 Proxy 專用子網路,即使清單中提供此選項也一樣。
  5. 確認「Port」(通訊埠) 已設為 443,以允許 HTTPS 流量。
  6. 按一下「IP address」選單,然後點選「Create IP address」
  7. 在「預留靜態內部 IP 位址」面板中,提供下列詳細資料:
    1. 在「Name」 中輸入 cross-ref-ip-address
    2. 在「Static IP address」(靜態 IP 位址) 中,點選「Let me choose」(自行選擇)。在「自訂 IP 位址」中輸入 10.1.2.98
    3. (選用) 如果您想與不同前端共用這個 IP 位址,請將「用途」設為「共用」
  8. 按一下「憑證」清單。
    1. 如果您已擁有自行管理的 SSL 憑證資源,且想要做為主要 SSL 憑證使用,請從選單中選取所需資源。
    2. 否則,請選取「Create a new certificate」
      1. 輸入 SSL 憑證的「名稱」
      2. 在適當的欄位中,上傳 PEM 格式的檔案:
        • 公用金鑰憑證
        • 憑證鏈結
        • 私密金鑰
      3. 按一下 [建立]。
  9. 如要新增主要安全資料傳輸層 (SSL) 憑證資源以外的憑證資源,請按照下列指示操作:
    1. 按一下「新增憑證」
    2. 從「Certificates」清單中選取所需憑證,或是按一下「Create a new certificate」並按照先前的操作說明操作。
  10. 按一下 [完成]

檢查並完成設定

  • 按一下 [建立]。

測試負載平衡器

負載平衡器建立完成後,請按照「測試負載平衡器」一節所述步驟測試負載平衡器。

gcloud

  1. 選用:建立含有交叉參照後端服務的負載平衡器前,請先確認您要參照的後端服務是否可使用網址對應參照:

    gcloud compute backend-services list-usable \
        --region=us-west1 \
        --project=SERVICE_PROJECT_B_ID
    
  2. 建立網址對應,並將預設服務設為在服務專案 B 中建立的後端服務。

    gcloud compute url-maps create URL_MAP_NAME \
        --default-service=projects/SERVICE_PROJECT_B_ID/regions/us-west1/backendServices/BACKEND_SERVICE_NAME \
        --region=us-west1 \
        --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • URL_MAP_NAME:網址對應表的名稱。
    • BACKEND_SERVICE_NAME:在服務專案 B 中建立的後端服務名稱。
    • SERVICE_PROJECT_B_ID:服務專案 B 的專案 ID,負載平衡器的後端和後端服務會在此建立。
    • SERVICE_PROJECT_A_ID:服務專案 A 的專案 ID,負載平衡器的前端會建立在此專案中。

    如果您在服務專案 B 中沒有compute.backendServices.use後端服務的權限,就無法建立網址對應。

  3. 建立目標 Proxy。

    HTTP:

    gcloud compute target-http-proxies create HTTP_TARGET_PROXY_NAME \
      --url-map=URL_MAP_NAME \
      --url-map-region=us-west1 \
      --region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • HTTP_TARGET_PROXY_NAME:目標 HTTP Proxy 的名稱。

    適用於 HTTPS:

    使用 gcloud compute ssl-certificates create 指令建立地區 SSL 憑證。

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
      --certificate=PATH_TO_CERTIFICATE \
      --private-key=PATH_TO_PRIVATE_KEY \
      --region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • SSL_CERTIFICATE_NAME:SSL 憑證資源的名稱。
    • PATH_TO_CERTIFICATE:本機 SSL 憑證檔案的路徑,採用 PEM 格式。
    • PATH_TO_PRIVATE_KEY:PEM 格式的本機 SSL 憑證私密金鑰路徑。

    使用地區 SSL 憑證,搭配 gcloud compute target-https-proxies create 指令建立目標 Proxy。

    gcloud compute target-https-proxies create HTTPS_TARGET_PROXY_NAME \
      --url-map=URL_MAP_NAME \
      --region=us-west1 \
      --ssl-certificates=SSL_CERTIFICATE_NAME \
      --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • HTTPS_TARGET_PROXY_NAME:目標 HTTPS Proxy 的名稱。
  4. 建立轉送規則。跨專案服務參照功能才能運作,轉送規則必須使用共用虛擬私有雲主機專案中用來建立後端服務的相同網路 (lb-network)。

    HTTP:

    gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_CROSS_REF \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=HTTP_TARGET_PROXY_NAME \
      --target-http-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • HTTP_FORWARDING_RULE_NAME:用於處理 HTTP 流量的轉送規則名稱。

    適用於 HTTPS:

    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
      --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \
      --address=IP_ADDRESS_CROSS_REF \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=HTTPS_TARGET_PROXY_NAME \
      --target-https-proxy-region=us-west1 \
      --project=SERVICE_PROJECT_A_ID
    

    更改下列內容:

    • HTTPS_FORWARDING_RULE_NAME:用於處理 HTTPS 流量的轉送規則名稱。
  5. 如要測試負載平衡器,請按照「測試負載平衡器」一節所述的步驟操作。

Terraform

  1. 建立網址對應。

    # URL map
    resource "google_compute_region_url_map" "default" {
      name            = "l7-ilb-map"
      provider        = google-beta
      project         = "my-service-project-a-id"
      region          = "us-west1"
      default_service = google_compute_region_backend_service.default.id
    }
  2. 建立目標 Proxy。

    HTTP

    # HTTP target proxy
    resource "google_compute_region_target_http_proxy" "default" {
      name     = "l7-ilb-proxy"
      provider = google-beta
      project  = "my-service-project-a-id"
      region   = "us-west1"
      url_map  = google_compute_region_url_map.default.id
    }

    HTTPS

    建立地區 SSL 憑證

    # Use self-signed SSL certificate
    resource "google_compute_region_ssl_certificate" "default" {
      name        = "l7-ilb-cert"
      provider    = google-beta
      project     = "my-service-project-a-id"
      region      = "us-west1"
      private_key = file("sample-private.key") # path to PEM-formatted file
      certificate = file("sample-server.cert") # path to PEM-formatted file
    }

    使用地區 SSL 憑證建立目標 Proxy

    # HTTPS target proxy
    resource "google_compute_region_target_https_proxy" "default" {
      name             = "l7-ilb-proxy"
      provider         = google-beta
      project          = "my-service-project-a-id"
      region           = "us-west1"
      url_map          = google_compute_region_url_map.default.id
      ssl_certificates = [google_compute_region_ssl_certificate.default.id]
    }
  3. 建立轉寄規則。

    HTTP

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-a-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "80"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_http_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }

    HTTPS

    # Forwarding rule
    resource "google_compute_forwarding_rule" "default" {
      name                  = "l7-ilb-forwarding-rule"
      provider              = google-beta
      project               = "my-service-project-a-id"
      region                = "us-west1"
      ip_protocol           = "TCP"
      port_range            = "443"
      load_balancing_scheme = "INTERNAL_MANAGED"
      target                = google_compute_region_target_https_proxy.default.id
      network               = google_compute_network.lb_network.id
      subnetwork            = google_compute_subnetwork.lb_frontend_and_backend_subnet.id
      network_tier          = "PREMIUM"
      depends_on            = [google_compute_subnetwork.lb_frontend_and_backend_subnet]
    }
  4. 如要測試負載平衡器,請按照「測試負載平衡器」一節所述的步驟操作。

授予負載平衡器管理員使用後端服務的權限

如果您希望負載平衡器參照其他服務專案中的後端服務,負載平衡器管理員必須具備 compute.backendServices.use 權限。如要授予這項權限,您可以使用名為 Compute 負載平衡器服務使用者 (roles/compute.loadBalancerServiceUser) 的預先定義 IAM 角色。這個角色必須由服務專案管理員授予,且可在專案層級或個別後端服務層級套用。

如果您在建立後端服務時,已在後端服務層級授予必要權限,則不必執行這個步驟。您可以略過這個部分,也可以繼續閱讀,瞭解如何授予此專案中所有後端服務的存取權,這樣您就不必每次建立新的後端服務時都授予存取權。

在本例中,服務專案 B 的服務專案管理員必須執行一項下列指令,才能將 compute.backendServices.use 權限授予服務專案 A 的負載平衡器管理員。您可以在專案層級 (針對專案中的所有後端服務) 或各後端服務中執行這項操作。

主控台

專案層級權限

請按照下列步驟,為專案中的所有後端服務授予權限。

您必須具備 compute.regionBackendServices.setIamPolicyresourcemanager.projects.setIamPolicy 權限,才能完成這個步驟。

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往身分與存取權管理頁面

  2. 選取專案。

  3. 按一下「授予存取權」

  4. 在「New principals」(新增主體) 欄位中,輸入主體的電子郵件地址或其他 ID。

  5. 在「Select a role」(請選擇角色) 清單中,選取「Compute Load Balancer Services User」(Compute Load Balancer 服務使用者)

  6. 選用:為角色新增條件

  7. 按一下 [儲存]

個別後端服務的資源層級權限

請按照下列步驟,為專案中的個別後端服務授予權限。

您必須具備 compute.regionBackendServices.setIamPolicy 權限,才能完成這個步驟。

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

    前往「後端」

  2. 從後端服務清單中選取要授予存取權的後端服務,然後按一下「Permissions」(權限)。

  3. 按一下「新增主體」。

  4. 在「New principals」(新增主體) 欄位中,輸入主體的電子郵件地址或其他 ID。

  5. 在「Select a role」(請選擇角色) 清單中,選取「Compute Load Balancer Services User」(Compute Load Balancer 服務使用者)

  6. 按一下 [儲存]

gcloud

專案層級權限

請按照下列步驟,為專案中的所有後端服務授予權限。

您必須具備 compute.regionBackendServices.setIamPolicyresourcemanager.projects.setIamPolicy 權限,才能完成這個步驟。

gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser"

個別後端服務的資源層級權限

在後端服務層級,服務專案管理員可以使用下列任一指令授予 Compute 負載平衡器服務使用者角色 (roles/compute.loadBalancerServiceUser)。

您必須具備 compute.regionBackendServices.setIamPolicy 權限,才能完成這個步驟。

gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser" \
    --condition='expression=resource.name=="projects/SERVICE_PROJECT_B_ID/regions/us-west1/backend-services/BACKEND_SERVICE_NAME",title=Shared VPC condition'

gcloud compute backend-services add-iam-policy-binding BACKEND_SERVICE_NAME \
    --member="user:LOAD_BALANCER_ADMIN" \
    --role="roles/compute.loadBalancerServiceUser" \
    --project=SERVICE_PROJECT_B_ID \
    --region=us-west1

如要使用這些指令,請將 LOAD_BALANCER_ADMIN 替換為使用者的主要使用者,例如 test-user@gmail.com

您也可以使用條件並指定條件屬性,設定 IAM 權限,讓權限只套用至部分地區後端服務。

如要查看參照特定共用虛擬私有雲後端服務的網址對應,請按照下列步驟操作:

gcloud

如要查看參照區域共用虛擬私有雲後端服務的資源,請執行下列指令:

gcloud compute backend-services describe BACKEND_SERVICE_NAME \
    --region REGION

更改下列內容:

  • BACKEND_SERVICE_NAME:負載平衡器後端服務名稱
  • REGION:負載平衡器的地區

在指令輸出中,查看 usedBy 欄位,這會顯示參照後端服務的資源,如以下範例所示:

id: '123456789'
kind: compute#backendService
loadBalancingScheme: INTERNAL_MANAGED
...
usedBy:
-   reference: https://www.googleapis.com/compute/v1/projects/my-project/region/us-central1/urlMaps/my-url-map

後續步驟