使用 VM 執行個體群組後端設定跨區域內部 Proxy 網路負載平衡器

本文件說明如何為在 Compute Engine VM 上執行的服務,設定跨區域內部 Proxy 網路負載平衡器。

事前準備

在您依循這份指南操作之前,請先熟悉以下概念:

權限

如要依照本指南的說明操作,您必須能在專案中建立執行個體與修改網路。您必須是專案擁有者或編輯者,或是必須具有以下所有 Compute Engine 身分與存取權管理角色

工作 必要角色
建立網路、子網路和負載平衡器元件 Compute 網路管理員
新增與移除防火牆規則 Compute 安全管理員
建立執行個體 Compute 執行個體管理員

詳情請參閱下列指南:

設定總覽

您可以設定負載平衡器,如以下圖表所示:

跨區域內部 Proxy 網路負載平衡器高可用性部署。
跨區域內部 Proxy 網路負載平衡器高可用性部署 (按一下可放大)。

如圖所示,這個範例會在 VPC 網路中建立跨區域內部 Proxy 網路負載平衡器,其中在 REGION_AREGION_B 地區分別有一個後端服務和兩個後端代管執行個體群組 (MIG)。

下圖顯示以下內容:

  1. 具有下列子網路的虛擬私有雲網路:

    • 子網路 SUBNET_AREGION_A 中的 Proxy 專用子網路。
    • 子網路 SUBNET_BREGION_B 中的 Proxy 專用子網路。

    您必須在使用跨區域內部 Proxy 網路負載平衡器的虛擬私有雲端網路的每個地區,建立僅限 Proxy 的子網路。該地區的僅限 Proxy 子網路會在該地區的所有跨區域內部 Proxy 網路負載平衡器之間共用。系統會從僅限 Proxy 的子網路中分配從負載平衡器傳送至服務後端的封包來源位址。在這個範例中,REGION_B 區域的僅限 Proxy 子網路的主要 IP 位址範圍為 10.129.0.0/23REGION_A 的主要 IP 位址範圍則為 10.130.0.0/23,這是建議的子網路大小。

  2. 高可用性設定會為 REGION_AREGION_B 區域中的 Compute Engine VM 部署作業提供代管的執行個體群組後端。如果某個區域的後端發生故障,流量就會移轉至其他區域。

  3. 監控後端使用情況和健康狀態的全域後端服務。

  4. 全球目標 TCP Proxy,會接收使用者的要求,並將其轉送至後端服務。

  5. 全域轉送規則,具有負載平衡器的區域內部 IP 位址,可將每個傳入要求轉送至目標 Proxy。

    與轉送規則相關聯的內部 IP 位址,可以來自與後端相同網路和地區的子網路。請注意下列條件:

    • IP 位址可以 (但不必) 與後端執行個體群組位於相同的子網路。
    • IP 位址不得來自保留的僅限 Proxy 子網路,且其 --purpose 標記必須設為 GLOBAL_MANAGED_PROXY
    • 如果您想使用相同的內部 IP 位址搭配多個轉送規則,請將 IP 位址 --purpose 標記設為 SHARED_LOADBALANCER_VIP

設定網路和子網路

在虛擬私有雲網路中,針對已設定後端的每個區域設定子網路。此外,請在您要設定負載平衡器的每個區域中設定 proxy-only-subnet

這個範例會使用以下虛擬私人雲端網路、地區和子網路:

  • 聯播網。網路是名為 NETWORK自訂模式虛擬私人雲端網路

  • 後端子網路

    • REGION_A 地區中名為 SUBNET_A 的子網路使用 10.1.2.0/24 做為其主要 IP 範圍。
    • REGION_B 地區中名為 SUBNET_B 的子網路使用 10.1.3.0/24 做為其主要 IP 範圍。
  • Proxy 專用子網路

    • REGION_A 地區中名為 PROXY_SN_A 的子網路使用 10.129.0.0/23 做為其主要 IP 範圍。
    • REGION_B 地區中名為 PROXY_SN_B 的子網路使用 10.130.0.0/23 做為其主要 IP 範圍。

跨區域內部應用程式負載平衡器可從 VPC 中的任何區域存取。因此,來自任何區域的用戶端都能在全球範圍內存取負載平衡器後端。

設定後端子網路

主控台

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

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

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

  3. 提供網路的「名稱」

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

  5. 為負載平衡器的後端建立子網路。在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    • 提供這個子網路的 [Name] (名稱)
    • 選取「區域」REGION_A
    • 輸入「IP 位址範圍」10.1.2.0/24
  6. 按一下 [完成]

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

  8. 為負載平衡器的後端建立子網路。在「New subnet」(新的子網路) 區段中,輸入以下資訊:

    • 提供這個子網路的 [Name] (名稱)
    • 選取「區域」REGION_B
    • 輸入「IP 位址範圍」10.1.3.0/24
  9. 按一下 [完成]

  10. 按一下 [建立]。

gcloud

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

    gcloud compute networks create NETWORK \
        --subnet-mode=custom
    
  2. 使用 gcloud compute networks subnets create 指令,在 REGION_A 地區的 NETWORK 網路中建立子網路:

    gcloud compute networks subnets create SUBNET_A \
        --network=NETWORK \
        --range=10.1.2.0/24 \
        --region=REGION_A
    
  3. 使用 gcloud compute networks subnets create 指令,在 REGION_B 地區的 NETWORK 網路中建立子網路:

    gcloud compute networks subnets create SUBNET_B \
        --network=NETWORK \
        --range=10.1.3.0/24 \
        --region=REGION_B
    

Terraform

如要建立虛擬私有雲網路,請使用 google_compute_network 資源

resource "google_compute_network" "default" {
  auto_create_subnetworks = false
  name                    = "lb-network-crs-reg"
  provider                = google-beta
}

如要在 lb-network-crs-reg 網路中建立 VPC 子網路,請使用 google_compute_subnetwork 資源

resource "google_compute_subnetwork" "subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.1.2.0/24"
  name          = "lbsubnet-uswest1"
  network       = google_compute_network.default.id
  region        = "us-west1"
}
resource "google_compute_subnetwork" "subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.1.3.0/24"
  name          = "lbsubnet-useast1"
  network       = google_compute_network.default.id
  region        = "us-east1"
}

API

networks.insert 方法提出 POST 要求。將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks

{
 "routingConfig": {
   "routingMode": "regional"
 },
 "name": "NETWORK",
 "autoCreateSubnetworks": false
}

subnetworks.insert 方法提出 POST 要求。將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

{
 "name": "SUBNET_A",
 "network": "projects/PROJECT_ID/global/networks/lb-network-crs-reg",
 "ipCidrRange": "10.1.2.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_A",
}

subnetworks.insert 方法提出 POST 要求。將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

{
 "name": "SUBNET_B",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "ipCidrRange": "10.1.3.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_B",
}

設定僅限 Proxy 的子網路

僅限 Proxy 子網路會提供一組 IP 位址, Google Cloud 用於代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立連至後端的新連線。

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

控制台

如果您使用的是 Google Cloud 主控台,可以等之後再於「負載平衡」頁面中建立僅限 Proxy 的子網路。

如果您現在想建立僅限 Proxy 的子網路,請按照下列步驟操作:

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

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

  2. 按一下虛擬私有雲網路的名稱。
  3. 在「子網路」分頁中,按一下「新增子網路」
  4. 提供僅限 Proxy 子網路的「名稱」
  5. 選取「區域」REGION_A
  6. 在「用途」清單中,選取「跨區域的 Managed Proxy」
  7. 在「IP address range」欄位中輸入 10.129.0.0/23
  8. 按一下「新增」。

REGION_B 中建立僅限 Proxy 的子網路

  1. 在「子網路」分頁中,按一下「新增子網路」
  2. 提供僅限 Proxy 子網路的「名稱」
  3. 選取「區域」REGION_B
  4. 在「用途」清單中,選取「跨區域的 Managed Proxy」
  5. 在「IP address range」欄位中輸入 10.130.0.0/23
  6. 按一下「新增」。

gcloud

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

    gcloud compute networks subnets create PROXY_SN_A \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_A \
        --network=NETWORK \
        --range=10.129.0.0/23
    
    gcloud compute networks subnets create PROXY_SN_B \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_B \
        --network=NETWORK \
        --range=10.130.0.0/23
    

Terraform

如要在 lb-network-crs-reg 網路中建立僅限 Proxy 的 VPC 子網路,請使用 google_compute_subnetwork 資源

resource "google_compute_subnetwork" "proxy_subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.129.0.0/23"
  name          = "proxy-only-subnet1"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-west1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}
resource "google_compute_subnetwork" "proxy_subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.130.0.0/23"
  name          = "proxy-only-subnet2"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-east1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}

API

使用 subnetworks.insert 方法建立僅限 Proxy 的子網路,並將 PROJECT_ID 替換為您的專案 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

    {
      "name": " PROXY_SN_A",
      "ipCidrRange": "10.129.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_A",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

    {
      "name": "PROXY_SN_B",
      "ipCidrRange": "10.130.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_B",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   

設定防火牆規則

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

  • fw-ilb-to-backends:輸入規則,適用於要進行負載平衡的執行個體,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 位址範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 位址範圍。這個範例會使用目標標記 allow-ssh 來辨識套用防火牆規則的 VM。

  • fw-healthcheck:輸入規則,適用於要進行負載平衡的執行個體,可允許來自 Google Cloud健康狀態檢查系統 (在 130.211.0.0/2235.191.0.0/16 中) 的所有 TCP 流量。這個範例會使用目標標記 load-balanced-backend 來辨識套用防火牆規則的 VM。

  • fw-backends:輸入規則,適用於要進行負載平衡的執行個體,可在 804438080 通訊埠上允許來自內部 Proxy 網路負載平衡器代管 Proxy 的 TCP 流量。這個範例會使用目標標記 load-balanced-backend 來辨識套用防火牆規則的 VM。

如果沒有這些防火牆規則,預設拒絕輸入規則將會封鎖傳入至後端執行個體的流量。

目標代碼定義後端執行個體。如未指定目標標記,防火牆規則會套用至 VPC 網路中的所有後端執行個體。建立後端 VM 時,請務必加入指定的目標標記,如「建立代管執行個體群組」一文所述。

主控台

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

    前往「防火牆政策」

  2. 按一下「Create firewall rule」(建立防火牆規則),建立允許連入 SSH 連線的規則:

    • Name (名稱):fw-ilb-to-backends
    • Network (網路):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. 按一下 [建立]。

  4. 再次按一下「Create firewall rule」(建立防火牆規則),建立允許Google Cloud 健康狀態檢查的規則:

    • Name (名稱):fw-healthcheck
    • Network (網路):NETWORK
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 目標指定的目標標記
    • 「Target tags」(目標標記)load-balanced-backend
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 通訊協定和通訊埠

      • 選擇「Specified protocols and ports」
      • 勾選「TCP」核取方塊,然後輸入 80 做為「Port number」(通訊埠編號)。

      最佳做法是將此規則限制為與健康檢查所使用的通訊協定和通訊埠相符。如果您將 tcp:80 用於通訊協定和通訊埠, Google Cloud 可以使用通訊埠 80 的 HTTP 與 VM 聯絡,但無法使用通訊埠 443 的 HTTPS 與 VM 聯絡。

  5. 按一下 [建立]。

  6. 第三次按一下「Create firewall rule」(建立防火牆規則),以建立允許負載平衡器 Proxy 伺服器連結後端的規則:

    • Name (名稱):fw-backends
    • Network (網路):NETWORK
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 目標指定的目標標記
    • 「Target tags」(目標標記)load-balanced-backend
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):10.129.0.0/2310.130.0.0/23
    • 通訊協定和通訊埠
      • 選擇「Specified protocols and ports」
      • 勾選「TCP」TCP核取方塊,然後輸入 80, 443, 8080 做為「Port number」(通訊埠編號)。
  7. 按一下 [建立]。

gcloud

  1. 建立 fw-ilb-to-backends 防火牆規則,允許與具有 allow-ssh 網路標記的 VM 建立 SSH 連線。若省略 source-ranges,Google Cloud 會將規則解讀為任何來源

    gcloud compute firewall-rules create fw-ilb-to-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  2. 建立 fw-healthcheck 規則,允許 Google Cloud健康狀態檢查。這個範例可允許來自健康狀態檢查探測器的所有 TCP 流量,但您可以根據自己的需求設定一組較少的通訊埠。

    gcloud compute firewall-rules create fw-healthcheck \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=load-balanced-backend \
        --rules=tcp
    
  3. 建立 fw-backends 規則,允許內部 Proxy 網路負載平衡器的 Proxy 連結後端。將 source-ranges 設為僅限 Proxy 子網路的已分配範圍,例如 10.129.0.0/2310.130.0.0/23

    gcloud compute firewall-rules create fw-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=SOURCE_RANGE \
        --target-tags=load-balanced-backend \
        --rules=tcp:80,tcp:443,tcp:8080
    

API

請向 firewalls.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立 fw-ilb-to-backends 防火牆規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls

{
 "name": "fw-ilb-to-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "0.0.0.0/0"
 ],
 "targetTags": [
   "allow-ssh"
 ],
 "allowed": [
  {
    "IPProtocol": "tcp",
    "ports": [
      "22"
    ]
  }
 ],
"direction": "INGRESS"
}

請向 firewalls.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立 fw-healthcheck 防火牆規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls

{
 "name": "fw-healthcheck",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "130.211.0.0/22",
   "35.191.0.0/16"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp"
   }
 ],
 "direction": "INGRESS"
}

建立 fw-backends 防火牆規則,允許代理子網路中的 TCP 流量,適用於 firewalls.insert 方法,並將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls

{
 "name": "fw-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "10.129.0.0/23",
   "10.130.0.0/23"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp",
     "ports": [
       "80"
     ]
   },
 {
     "IPProtocol": "tcp",
     "ports": [
       "443"
     ]
   },
   {
     "IPProtocol": "tcp",
     "ports": [
       "8080"
     ]
   }
 ],
 "direction": "INGRESS"
}

建立代管執行個體群組

本節說明如何建立範本和代管執行個體群組。代管執行個體群組提供的 VM 執行個體,會執行跨區域內部 Proxy 網路負載平衡器範例的後端伺服器。針對執行個體群組,您可以定義 HTTP 服務,並將通訊埠名稱對應至相關的通訊埠。負載平衡器的後端服務會將流量轉送至具名通訊埠。從用戶端到後端伺服器的流量會經過負載平衡。為示範之用,後端會提供自己的主機名稱。

主控台

  1. 在 Google Cloud 控制台中,前往「Instance templates」(執行個體範本) 頁面。

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

    1. 點選「建立執行個體範本」
    2. 在「Name」(名稱) 中輸入 gil4-backendeast1-template
    3. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get
    4. 點選「進階選項」
    5. 按一下「網路」,然後設定下列欄位:
      1. 在「Network tags」(網路標記) 中輸入 allow-sshload-balanced-backend
      2. 在「網路介面」中,選取下列項目:
        • Network (網路):NETWORK
        • Subnet (子網路):SUBNET_B
    6. 按一下 [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://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. 按一下 [建立]。

    8. 點選「建立執行個體範本」

    9. 在「Name」(名稱) 中輸入 gil4-backendwest1-template

    10. 確認「開機磁碟」已設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明使用僅在 Debian 上可用的指令,例如 apt-get

    11. 點選「進階選項」

    12. 按一下「網路」,然後設定下列欄位:

      1. 在「Network tags」(網路標記) 中輸入 allow-sshload-balanced-backend
      2. 在「網路介面」中,選取下列項目:
        • Network (網路):NETWORK
        • Subnet (子網路):SUBNET_A
    13. 按一下 [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://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    14. 按一下 [建立]。

  2. 前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。

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

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

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

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

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

    9. 按一下 [建立]。

    10. 點選「建立執行個體群組」

    11. 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。

    12. 在「Name」(名稱) 中輸入 gl4-ilb-migb

    13. 在「Location」(位置) 中,選取「Single zone」(單一可用區)

    14. 在「Region」(區域) 中選取 REGION_B

    15. 在「Zone」(區域) 中選取 ZONE_B

    16. 在「Instance template」(執行個體範本) 中選取 gil4-backendeast1-template

    17. 指定要在群組中建立的執行個體數量。

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

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

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

    18. 按一下 [建立]。

gcloud

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

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

    gcloud compute instance-templates create gil4-backendwest1-template \
       --region=REGION_A \
       --network=NETWORK \
       --subnet=SUBNET_A \
       --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://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
    gcloud compute instance-templates create gil4-backendeast1-template \
        --region=REGION_B \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --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://169.254.169.254/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 指令,在區域中建立代管執行個體群組。

    gcloud compute instance-groups managed create gl4-ilb-miga \
        --zone=ZONE_A \
        --size=2 \
        --template=gil4-backendwest1-template
    
    gcloud compute instance-groups managed create gl4-ilb-migb \
        --zone=ZONE_B \
        --size=2 \
        --template=gil4-backendeast1-template
    

API

使用 instanceTemplates.insert 方法建立執行個體範本,並將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name":"gil4-backendwest1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "tags":{
       "items":[
         "allow-ssh",
         "load-balanced-backend"
       ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
            "key":"startup-script",
            "value":"#! /bin/bash\napt-get update\napt-get install
            apache2 -y\na2ensite default-ssl\na2enmod ssl\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_A/subnetworks/SUBNET_A",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-12"
         },
         "autoDelete":true
       }
     ]
  }
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name":"gil4-backendeast1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "tags":{
       "items":[
         "allow-ssh",
         "load-balanced-backend"
       ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
            "key":"startup-script",
            "value":"#! /bin/bash\napt-get update\napt-get install
            apache2 -y\na2ensite default-ssl\na2enmod ssl\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_B/subnetworks/SUBNET_B",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-12"
         },
         "autoDelete":true
       }
     ]
  }
}

使用 instanceGroupManagers.insert 方法,在每個區域中建立受管理的執行個體群組,並將 PROJECT_ID 替換為您的專案 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl4-ilb-miga",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-miga",
  "targetSize": 2
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl4-ilb-migb",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-migb",
  "targetSize": 2
}

設定負載平衡器

本範例說明如何建立下列跨區域內部 Proxy 網路負載平衡器資源:

  • 全球 TCP 健康狀態檢查。
  • 全域後端服務,其 MIG 與後端相同。
  • 全球目標 Proxy。
  • 兩個含有區域 IP 位址的全域轉送規則。針對轉送規則的 IP 位址,請使用 SUBNET_ASUBNET_B IP 位址範圍。如果您嘗試使用僅限 Proxy 的子網路,轉送規則建立作業將會失敗。

Proxy 可用性

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

  • 為負載平衡器選取其他區域。如果您在其他區域有後端,這可能是一個實用的選項。
  • 選取已分配專屬 Proxy 子網路的 VPC 網路。
  • 等待容量問題解決。

主控台

開始設定

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

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

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「Proxy load balancer」,然後點選「Next」
  5. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  6. 在「跨區域或單一區域部署」部分,選取「最適合跨區域工作負載」,然後點選「下一步」
  7. 按一下 [設定]

基本設定

  1. 提供負載平衡器的「名稱」
  2. 在「Network」(網路) 中選取 NETWORK

使用兩個轉送規則設定前端

  1. 按一下「前端設定」
    1. 提供轉送規則的「Name」(名稱)
    2. 在「子網路區域」清單中選取「REGION_A」。

      保留僅限 Proxy 的子網路

    3. 在「Subnetwork」(子網路) 清單中選取「SUBNET_A」。
    4. 在「IP address」清單中,按一下「Create IP address」。系統會開啟「保留靜態內部 IP 位址」頁面。
      • 為靜態 IP 位址提供名稱
      • 在「Static IP address」清單中,選取「Let me choose」
      • 在「Custom IP address」(自訂 IP 位址) 欄位中輸入 10.1.2.99
      • 選取「預訂」
  2. 按一下 [完成]
  3. 如要新增第二個轉寄規則,請按一下「新增前端 IP 和通訊埠」
    1. 提供轉送規則的「Name」(名稱)
    2. 在「子網路區域」清單中選取「REGION_B」。

      保留僅限 Proxy 的子網路

    3. 在「Subnetwork」(子網路) 清單中選取「SUBNET_B」。
    4. 在「IP address」清單中,按一下「Create IP address」。系統會開啟「保留靜態內部 IP 位址」頁面。
      • 為靜態 IP 位址提供名稱
      • 在「Static IP address」清單中,選取「Let me choose」
      • 在「Custom IP address」(自訂 IP 位址) 欄位中輸入 10.1.3.99
      • 選取「預訂」
  4. 按一下 [完成]
設定後端服務
  1. 按一下「後端設定」
  2. 在「Create or select backend services」清單中,按一下「Create a backend service」
  3. 為後端服務提供「Name」(名稱)
  4. 在「Protocol」中,選取「TCP」
  5. 在「Named Port」(已命名的通訊埠) 中輸入 http
  6. 在「Backend type」(後端類型) 清單中,選取「Instance group」(執行個體群組)
  7. 在「New backend」部分中:
    • 在「Instance group」清單中,選取 REGION_A 中的 gl4-ilb-miga
    • 將「Port numbers」(通訊埠編號) 設為 80
    • 按一下 [完成]
    • 如要新增其他後端,請按一下「新增後端」
    • 在「Instance group」清單中,選取 REGION_B 中的 gl4-ilb-migb
    • 將「Port numbers」(通訊埠編號) 設為 80
    • 按一下 [完成]
  8. 在「健康狀態檢查」清單中,按一下「建立健康狀態檢查」
    • 在「Name」(名稱) 欄位中輸入 global-http-health-check
    • 將「Protocol」(通訊協定) 設為 HTTP
    • 將「Port」(通訊埠) 設為 80
    • 按一下 [儲存]

檢查設定

  1. 按一下「檢查並完成」
  2. 查看負載平衡器設定。
  3. 按一下 [建立]。

gcloud

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

    gcloud compute health-checks create tcp global-health-check \
       --use-serving-port \
       --global
    
  2. 使用 gcloud compute backend-services create 指令定義後端服務。

    gcloud compute backend-services create gl4-gilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=TCP \
      --enable-logging \
      --logging-sample-rate=1.0 \
      --health-checks=global-health-check \
      --global-health-checks \
      --global
    
  3. 使用 gcloud compute backend-services add-backend 指令,將後端新增到後端服務。

    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-miga \
      --instance-group-zone=ZONE_A \
      --global
    
    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  4. 建立目標 Proxy。

    使用 gcloud compute target-tcp-proxies create 指令建立目標 Proxy。

    gcloud compute target-tcp-proxies create gilb-tcp-proxy \
      --backend-service=gl4-gilb-backend-service \
      --global
    
  5. 建立兩個轉送規則,一個在 REGION_B 中使用 VIP (10.1.2.99),另一個在 REGION_A 中使用 VIP (10.1.3.99)。如需更多資訊,請參閱「預留靜態內部 IPv4 位址」。

    如果是自訂網路,您必須參照轉送規則中的子網路。請注意,這是 VM 子網路,而不是 Proxy 子網路。

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

    gcloud compute forwarding-rules create gil4forwarding-rule-a \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=10.1.2.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    
    gcloud compute forwarding-rules create gil4forwarding-rule-b \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=10.1.3.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    

API

請向 healthChecks.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立健康狀態檢查。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks

{
"name": "global-health-check",
"type": "TCP",
"httpHealthCheck": {
  "portSpecification": "USE_SERVING_PORT"
}
}

請對 backendServices.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立全域後端服務。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices

{
"name": "gl4-gilb-backend-service",
"backends": [
  {
    "group": "projects/PROJECT_ID/zones/ZONE_A/instanceGroups/gl4-ilb-miga",
    "balancingMode": "CONNECTION"
  },
  {
    "group": "projects/PROJECT_ID/zones/ZONE_B/instanceGroups/gl4-ilb-migb",
    "balancingMode": "CONNECTION"
  }
],
"healthChecks": [
  "projects/PROJECT_ID/regions/global/healthChecks/global-health-check"
],
"loadBalancingScheme": "INTERNAL_MANAGED"
}

請對 targetTcpProxies.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立目標 TCP proxy。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetTcpProxy

{
"name": "l4-ilb-proxy",
}

請對 forwardingRules.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

請對 globalForwardingRules.insert 方法提出 POST 要求,並將 PROJECT_ID 替換為您的專案 ID,藉此建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

測試負載平衡器

建立 VM 執行個體來測試連線能力

  1. REGION_BREGION_A 區域中建立用戶端 VM:

    gcloud compute instances create l4-ilb-client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_A \
        --zone=ZONE_A \
        --tags=allow-ssh
    
    gcloud compute instances create l4-ilb-client-b \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --zone=ZONE_B \
        --tags=allow-ssh
    
  2. 使用 SSH 連線至每個用戶端執行個體。

    gcloud compute ssh l4-ilb-client-a --zone=ZONE_A
    
    gcloud compute ssh l4-ilb-client-b --zone=ZONE_B
    
  3. 驗證 IP 位址是否提供主機名稱

    • 確認用戶端 VM 可連上這兩個 IP 位址。指令應成功執行,並傳回處理要求的後端 VM 名稱:

      curl 10.1.2.99
      
      curl 10.1.3.99
      

測試容錯移轉

  1. REGION_B 中的後端處於不良狀態或無法連線時,請確認是否會將後端移轉至 REGION_A 區域。如要模擬備援,請從 REGION_B 中移除所有後端:

    gcloud compute backend-services remove-backend gl4-gilb-backend-service \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  2. 使用 SSH 連線至 REGION_B 中的用戶端 VM。

    gcloud compute ssh l4-ilb-client-b \
       --zone=ZONE_B
    
  3. 將要求傳送至 REGION_B 區域中的負載平衡 IP 位址。指令輸出內容會顯示 REGION_A 中後端 VM 的回應:

    {
    RESULTS=
    for i in {1..100}
    do
      RESULTS="$RESULTS:$(curl 10.1.3.99)"
    done
    echo "***"
    echo "*** Results of load-balancing to 10.1.3.99: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
    }
    

額外設定選項

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

保留用戶端連線資訊的 Proxy 通訊協定

內部 Proxy 網路負載平衡器會終止來自用戶端的 TCP 連線,並建立與 VM 執行個體的新連線。根據預設,系統不會保留原本的用戶端 IP 和通訊埠資訊。

如要保留原始連線資訊並傳送至您的執行個體,請啟用 Proxy 通訊協定 (版本 1)。這個通訊協定會將另一個標頭 (當中包含來源 IP 位址、目的地 IP 位址和通訊埠編號) 做為要求的一部分傳送給執行個體。

請確認內部 Proxy 網路負載平衡器的後端執行個體,是否執行支援 Proxy 通訊協定標頭的 HTTP 或 HTTPS 伺服器。如果 HTTP 或 HTTPS 伺服器未設定為支援 Proxy 通訊協定標頭,後端執行個體會傳回空白回應。舉例來說,PROXY 通訊協定無法與 Apache HTTP 伺服器軟體搭配使用。您可以使用其他網路伺服器軟體,例如 Nginx。

如果您為使用者流量設定了 PROXY 通訊協定,那麼您必須進一步執行健康狀態檢查設定,才能在同一個通訊埠上提供流量及檢查健康狀態。如要在同一個通訊埠上提供流量及檢查健康狀態,請將健康狀態檢查的 --proxy-header 設為與負載平衡器設定相符。

Proxy 通訊協定標頭通常是一行使用者可以理解的文字,格式如下:

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

以下是 PROXY 通訊協定的範例:

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

在上例中,用戶端 IP 為 192.0.2.1,負載平衡 IP 為 198.51.100.1,用戶端通訊埠為 15221,目標通訊埠則為 110

如果用戶端的 IP 位址不明,負載平衡器會產生下列格式的 PROXY 通訊協定標頭:

PROXY UNKNOWN\r\n

更新目標 TCP Proxy 的 Proxy 通訊協定標頭

本頁負載平衡器設定範例說明如何在建立內部 Proxy 網路負載平衡器時啟用 Proxy 通訊協定標頭。請按照下列步驟,變更現有目標 TCP Proxy 的 Proxy 通訊協定標頭。

主控台

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

    前往「負載平衡」

  2. 按一下負載平衡器的 「Edit」

  3. 按一下「前端設定」

  4. 將「Proxy protocol」欄位的值變更為「On」

  5. 按一下 [Update] (更新),儲存您所做的變更。

gcloud

在下列指令中,請根據您的需求編輯 --proxy-header 欄位,並將其設為 NONEPROXY_V1

gcloud compute target-ssl-proxies update int-tcp-target-proxy \
    --proxy-header=[NONE | PROXY_V1]

在多個內部轉送規則中使用相同的 IP 位址

如要讓多個內部轉送規則共用相同的內部 IP 位址,您必須保留 IP 位址,並將其 --purpose 旗標設為 SHARED_LOADBALANCER_VIP

gcloud

gcloud compute addresses create SHARED_IP_ADDRESS_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME \
    --purpose=SHARED_LOADBALANCER_VIP

啟用工作階段相依性

範例設定會建立沒有工作階段相依性的後端服務。

這些程序會說明如何更新範例負載平衡器的後端服務,以便後端服務使用用戶端 IP 相依性或產生的 Cookie 相依性。

啟用用戶端 IP 相依性後,負載平衡器會根據從用戶端 IP 位址和負載平衡器 IP 位址 (內部轉送規則的內部 IP 位址) 建立的雜湊,將特定用戶端的要求導向至同一個後端 VM。

控制台

如何啟用用戶端 IP 工作階段相依性:

  1. 前往 Google Cloud 控制台的「負載平衡」頁面。
    前往「負載平衡」
  2. 點選「後端」
  3. 按一下您為本範例建立的後端服務名稱,然後按一下「編輯」
  4. 在「後端服務詳細資料」頁面中,按一下「進階設定」
  5. 在「Session affinity」(工作階段相依性) 下方,從選單中選取「Client IP」(用戶端 IP)
  6. 按一下「更新」

gcloud

使用以下 gcloud 指令更新 BACKEND_SERVICE 後端服務,並指定用戶端 IP 工作階段相依性:

gcloud compute backend-services update BACKEND_SERVICE \
    --global \
    --session-affinity=CLIENT_IP

啟用連線排除功能

您可以啟用後端服務的連線排除功能,確保提供流量的執行個體在停止運作、遭到手動移除或由自動配置器移除時,使用者經歷的干擾可降至最低程度。如要進一步瞭解連線排除功能,請參閱「啟用連線排除功能」說明文件。

後續步驟