設定跨區域內部應用程式負載平衡器,並使用混合式連線

本頁說明如何部署跨區域內部應用程式負載平衡器,將流量負載平衡至地端或其他公有雲的網路端點,並使用混合式連線存取這些端點。

如果尚未瞭解,請參閱混合式連線 NEG 總覽,瞭解設定混合式負載平衡的網路需求。

設定總覽

這個範例會為混合區域和混合式連線 NEG 後端設定跨區域內部應用程式負載平衡器,如下圖所示:

跨區域內部應用程式負載平衡器範例,適用於混合式可用區和混合式連線 NEG 後端。
跨區域內部應用程式負載平衡器範例,適用於混合式可用區和混合式連線 NEG 後端 (按一下可放大)。

設定混合式負載平衡部署作業前,請務必先設定混合式連線。視您選擇的混合式連線產品而定,使用 Cloud VPN 或 Cloud Interconnect (專屬或合作夥伴)。

設定 SSL 憑證資源

如以下說明,建立 Certificate Manager SSL 憑證資源:

建議使用 Google 代管的憑證。

權限

如要設定混合式負載平衡,您必須具備下列權限:

  • 開啟 Google Cloud

    • 在 Google Cloud 與地端部署環境或其他雲端環境之間建立混合式連線的權限。如需必要權限清單,請參閱相關的網路連線產品說明文件
    • 具備建立混合式連線 NEG 和負載平衡器的權限。Compute 負載平衡器管理員角色 (roles/compute.loadBalancerAdmin) 包含執行本指南所述工作所需的權限。
  • 地端部署環境或其他非Google Cloud 雲端環境

    • 設定網路端點的權限,允許地端環境或其他雲端環境中的服務,透過Google Cloud 使用 IP:Port 組合存取。如需更多資訊,請與環境的網路管理員聯絡。
    • 具備在內部部署環境或其他雲端環境中建立防火牆規則的權限,允許 Google 健康狀態檢查探測器連線至端點。

此外,如要完成本頁的操作說明,您需要建立混合式連線 NEG、負載平衡器和區域 NEG (及其端點),做為負載平衡器的 Google Cloud型後端。

因此您必須是專案擁有者或編輯者,或是需要下列 Compute Engine 身分與存取權管理角色

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

建立混合式連線

您的地端部署環境或其他雲端環境必須透過 Google Cloud 混合式連線連線,方法是使用 Cloud Interconnect VLAN 連結,或透過 Cloud Router 或路由器設備 VM 使用 Cloud VPN 通道。建議您使用高可用性連線。

啟用全域動態轉送的 Cloud Router 會透過邊界閘道通訊協定 (BGP) 瞭解特定端點,並將其程式化到 Google Cloud 虛擬私有雲網路中。系統不支援區域動態路由。也不支援靜態路徑。

您可以使用相同網路或相同專案中的不同虛擬私有雲網路,設定混合式網路 (Cloud Interconnect、Cloud VPN 或 Router 設備 VM) 和負載平衡器。注意事項:

  • 如果使用不同的虛擬私有雲網路,這兩個網路必須透過虛擬私有雲網路對等互連連線,或是必須是相同 Network Connectivity Center 中樞上的 VPC 輪輻

  • 如果使用相同的 VPC 網路,請確保 VPC 網路的子網路 CIDR 範圍與遠端 CIDR 範圍沒有衝突。如果 IP 位址重疊,系統會優先處理子網路路徑,而非遠端連線。

如需操作說明,請參閱下列文件:

設定外部環境 Google Cloud

如要為混合式負載平衡設定地端環境或其他雲端環境,請按照下列步驟操作:

  • 設定網路端點,將地端服務公開給Google Cloud (IP:Port)。
  • 在內部部署環境或其他雲端環境中設定防火牆規則。
  • 設定 Cloud Router,向您的私有環境通告特定必要路徑。

設定網路端點

設定混合式連線後,您可以使用 IP:port 組合,在內部部署環境或其他雲端環境中,設定一或多個可透過 Cloud Interconnect、Cloud VPN 或路由器設備連線的網路端點。這個IP:port組合會設定為混合式連線 NEG 的一或多個端點,並在稍後的程序中建立。 Google Cloud

如果 IP 端點有多個路徑,路由會遵循Cloud Router 總覽中說明的行為。

設定防火牆規則

您必須在內部部署環境或其他雲端環境中建立下列防火牆規則:

  • 在內部部署或其他雲端環境中建立防火牆允許輸入規則,允許來自該區域僅限 Proxy 的子網路的流量連上端點。
  • 混合式 NEG 不必允許來自 Google 健康狀態檢查探測範圍的流量。不過,如果您在單一後端服務中同時使用混合式和區域 NEG,則必須允許區域 NEG 接收來自 Google 健康狀態檢查探測範圍的流量。

設定 Cloud Router,向地端部署環境或其他雲端環境通告下列自訂 IP 範圍

  • 區域僅限 Proxy 子網路的範圍。

設定 Google Cloud 環境

請務必在下列步驟中使用相同的虛擬私有雲網路 (在本程序中稱為 NETWORK),該網路用於設定環境之間的混合式連線。

此外,請確認使用的區域 (在本程序中稱為 REGION_AREGION_B) 與建立 Cloud VPN 通道或 Cloud Interconnect VLAN 連結時使用的區域相同。

您可以選擇設定 GEO 類型的 DNS 轉送政策,在區域中斷期間,將用戶端流量轉送至最接近用戶端的區域中的負載平衡器 VIP。

設定後端子網路

使用這個子網路建立負載平衡器的區域 NEG 後端:

主控台

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

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

  2. 前往用於設定環境間混合式連線的網路。

  3. 在「Subnets」(子網路) 區段中:

    • 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    • 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
      • 提供這個子網路的 [Name] (名稱)
      • 選取「區域」REGION_A
      • 輸入「IP address range」(IP 位址範圍)
    • 按一下 [完成]
  4. 點選「建立」

  5. 如要在不同區域新增更多子網路,請按一下「新增子網路」,然後針對 REGION_B 重複上述步驟。

gcloud

  1. 在用於設定環境間混合式連線的網路中建立子網路。

    gcloud compute networks subnets create SUBNET_A \
        --network=NETWORK \
        --range=LB_SUBNET_RANGE1 \
        --region=REGION_A
    
    gcloud compute networks subnets create SUBNET_B \
        --network=NETWORK \
        --range=LB_SUBNET_RANGE2 \
        --region=REGION_B
    

API

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/NETWORK",
 "ipCidrRange": "LB_SUBNET_RANGE1",
 "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": "LB_SUBNET_RANGE2",
 "region": "projects/PROJECT_ID/regions/REGION_B",
}

更改下列內容:

  • SUBNET_ASUBNET_B:子網路的名稱
  • LB_SUBNET_RANGE1LB_SUBNET_RANGE2:子網路的 IP 位址範圍
  • REGION_AREGION_B:您已設定負載平衡器的區域

設定僅限 Proxy 的子網路

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

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

控制台

如果您使用 Google Cloud 控制台,可以稍後在「Load balancing」(負載平衡) 頁面中建立僅限 Proxy 的子網路。

如要立即建立僅限 Proxy 的子網路,請按照下列步驟操作:

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

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

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

REGION_B 中建立僅限 Proxy 的子網路

  1. 按一下 [新增子網路]
  2. 提供僅限 Proxy 子網路的「名稱」
  3. 在「Region」(區域) 清單中選取「REGION_B」。
  4. 在「Purpose」(用途) 清單中,選取「Cross-region Managed Proxy」(跨區域受管理 Proxy)
  5. 在「IP address range」(IP 位址範圍) 欄位中,輸入 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=PROXY_ONLY_SUBNET_RANGE1
    
    gcloud compute networks subnets create PROXY_SN_B \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_B \
        --network=NETWORK \
        --range=PROXY_ONLY_SUBNET_RANGE2
    

更改下列內容:

  • PROXY_SN_APROXY_SN_B:僅限 Proxy 子網路的名稱
  • PROXY_ONLY_SUBNET_RANGE1PROXY_ONLY_SUBNET_RANGE2:Proxy 專用子網路的 IP 位址範圍
  • REGION_AREGION_B: 您設定負載平衡器的區域

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": "PROXY_ONLY_SUBNET_RANGE1",
      "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": "PROXY_ONLY_SUBNET_RANGE2",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_B",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
  

建立防火牆規則

在本範例中,您會為 Google Cloud上的區域 NEG 後端建立下列防火牆規則:

  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的執行個體,可允許來自Google Cloud 健康狀態檢查系統 (130.211.0.0/2235.191.0.0/16) 的流量。這個範例會使用目標標記 allow-health-check 來辨識應套用此規則的區域 NEG。
  • fw-allow-ssh:輸入規則,允許在 TCP 通訊埠 22 上來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。這個範例會使用目標標記 allow-ssh 來辨識應套用這項規則的虛擬機器 (VM) 執行個體。
  • fw-allow-proxy-only-subnet:允許連線從僅限 Proxy 的子網路傳送至區域 NEG 後端的輸入規則。

主控台

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

    前往「防火牆政策」頁面

  2. 按一下「Create firewall rule」(建立防火牆規則),建立允許健康狀態檢查探測器流量的規則:

    1. 輸入 fw-allow-health-check 的「Name」(名稱)
    2. 在「Network」(網路) 中選取 NETWORK
    3. 在「Targets」(目標) 中選取 Specified target tags
    4. 在「Target tags」(目標標記) 欄位填入 allow-health-check
    5. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)
    6. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 130.211.0.0/2235.191.0.0/16
    7. 在「Protocols and ports」(通訊協定和通訊埠) 中選取「Specified protocols and ports」(指定的通訊協定和通訊埠)
    8. 選取「TCP」TCP,然後輸入 80 做為通訊埠編號。
    9. 點選「建立」
  3. 再次按一下「建立防火牆規則」,建立允許連入 SSH 連線的規則:

    1. Name (名稱):fw-allow-ssh
    2. Network (網路):NETWORK
    3. Priority (優先順序):1000
    4. 「Direction of traffic」(流量方向):[ingress] (輸入)
    5. 「Action on match」(相符時執行的動作):[allow] (允許)
    6. 「Target」(目標):指定的目標標記
    7. 「Target tags」(目標標記)allow-ssh
    8. 來源篩選器IPv4 範圍
    9. Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    10. 「Protocols and ports」(通訊協定和通訊埠):選擇「Specified protocols and ports」(指定的通訊協定和通訊埠)
    11. 選取「TCP」TCP,然後輸入 22 做為通訊埠編號。
    12. 點選「建立」
  4. 再次按一下「建立防火牆規則」,建立允許僅限 Proxy 子網路連入連線的規則:

    1. Name (名稱):fw-allow-proxy-only-subnet
    2. Network (網路):NETWORK
    3. Priority (優先順序):1000
    4. 「Direction of traffic」(流量方向):[ingress] (輸入)
    5. 「Action on match」(相符時執行的動作):[allow] (允許)
    6. 「Target」(目標):指定的目標標記
    7. 「Target tags」(目標標記)allow-proxy-only-subnet
    8. 來源篩選器IPv4 範圍
    9. 來源 IPv4 範圍PROXY_ONLY_SUBNET_RANGE1PROXY_ONLY_SUBNET_RANGE2
    10. 「Protocols and ports」(通訊協定和通訊埠):選擇「Specified protocols and ports」(指定的通訊協定和通訊埠)
    11. 選取「TCP」TCP,然後輸入 80 做為通訊埠編號。
    12. 點選「建立」

gcloud

  1. 建立 fw-allow-health-check-and-proxy 規則,允許健康狀態檢查在 TCP 通訊埠 80 上連線至後端執行個體: Google Cloud

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp:80
    
  2. 建立 fw-allow-ssh 防火牆規則,允許與具有 allow-ssh 網路標記的 VM 建立 SSH 連線。若省略 source-ranges,Google Cloud 會將規則解讀為任何來源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. 為僅限 Proxy 的子網路建立允許輸入的防火牆規則,允許負載平衡器在 TCP 通訊埠 80 上與後端執行個體通訊:

    gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-proxy-only-subnet \
        --source-ranges=PROXY_ONLY_SUBNET_RANGE1,PROXY_ONLY_SUBNET_RANGE2 \
        --rules=tcp:80
    

設定可用區 NEG

如果是 Google Cloud型後端,建議您在設定混合式連線的同一區域中,設定多個區域 NEG。

在本例中,請在 REGION_A 地區設定區域性 NEG (具有 GCE_VM_IP_PORT 類型端點)。請先在 ZONE_A 區域中建立 VM。接著在 ZONE_A 可用區中建立區域性 NEG,然後將 VM 的網路端點新增至 NEG。如要支援高可用性,請在 REGION_B 區域中設定類似的區域 NEG。如果某個地區的後端發生故障,流量會容錯移轉至其他地區。

建立 VM

主控台

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

    前往 VM 執行個體

  2. 使用下列名稱和區域組合,針對每個 VM 重複執行步驟 3 至 8。

    • 名稱:vm-a1
      • 區域:ZONE_A,位於REGION_A
      • 子網路:SUBNET_A
    • 名稱:vm-b1
      • 區域:ZONE_B,位於REGION_B
      • 子網路:SUBNET_B
  3. 點選「建立執行個體」

  4. 按照上一個步驟指定名稱。

  5. 在「Region」(區域) 中,選取先前步驟指定的選項。

  6. 在「Zone」(可用區) 中,選取先前步驟指定的選項。

  7. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Choose」(選擇),以變更映像檔。

  8. 在「Advanced options」(進階選項) 專區中,展開「Networking」(網路),然後執行下列操作:

    • 新增下列「Network tags」(網路標記)allow-sshallow-health-checkallow-proxy-only-subnet
    • 在「Network interfaces」(網路介面) 區段中,按一下「Add a network interface」(新增網路介面),進行下列變更,然後按一下「Done」(完成)
      • Network (網路):NETWORK
      • 子網路:如先前步驟所示。
      • 「Primary internal IP」(主要內部 IP):臨時 (自動)
      • External IP (外部 IP):臨時
    • 展開「管理」。在「Automation」(自動化) 欄位中,複製並貼上下列指令碼內容。所有 VM 的指令碼內容皆相同:

      #! /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. 點選「建立」

gcloud

執行下列指令來建立 VM,並使用這些組合做為 VM 的名稱和區域。兩個 VM 的指令碼內容完全相同。

gcloud compute instances create VM_NAME \
    --zone=GCP_NEG_ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
    --subnet=LB_SUBNET_NAME \
    --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'
  • VM_NAME (共 vm-a1)
    • 區域 REGION_A 中的可用區 GCP_NEG_ZONEZONE_A
    • 子網路 LB_SUBNET_NAME (如 SUBNET_A)
  • VM_NAME (共 vm-b1)
    • 區域 REGION_B 中的可用區 GCP_NEG_ZONEZONE_B
    • 子網路 LB_SUBNET_NAME (如 SUBNET_B)

建立可用區 NEG

主控台

如要建立可用區網路端點群組,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 使用下列名稱和區域組合,針對每個區域 NEG 重複執行步驟 3 至 8:

    • 名稱:neg-1
      • 區域:ZONE_A,位於REGION_A區域
      • 子網路:SUBNET_A
    • 名稱:neg-2
      • 區域:ZONE_B,位於REGION_B區域
      • 子網路:SUBNET_B
  3. 按一下「建立網路端點群組」

  4. 按照上一個步驟指定名稱。

  5. 選取「網路端點群組類型」網路端點群組 (區域性)

  6. 選取「網路」NETWORK

  7. 選取先前步驟中指定的「子網路」

  8. 選取先前步驟中指定的「Zone」(可用區)

  9. 輸入預設通訊埠80

  10. 點選「建立」

將端點新增至可用區性 NEG:

  1. 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 按一下上一個步驟建立的網路端點群組「名稱」。畫面上即會出現「網路端點群組詳細資料」頁面。

  3. 在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面會出現「Add network endpoint」(新增網路端點) 頁面。

  4. 選取某個 VM 執行個體,將其內部 IP 位址新增為網路端點。「網路介面」部分會顯示 VM 的名稱、區域和子網路。

  5. 輸入新網路端點的「IP address」(IP 位址)

  6. 選擇「Port type」(通訊埠類型)

    1. 如果您選取「預設」,則端點會使用網路端點群組中所有端點的預設通訊埠 80。由於 Apache 伺服器會在通訊埠 80 提供要求服務,因此這個範例已足夠。
    2. 如果您選取「Custom」(自訂),請輸入端點要使用的「Port number」(通訊埠編號)
  7. 如要新增更多端點,請按一下「新增網路端點」,然後重複以上步驟。

  8. 新增所有端點後,按一下「建立」

gcloud

  1. 使用名稱、可用區和子網路組合,建立可用區 NEG (含 GCE_VM_IP_PORT 端點)。使用 gcloud compute network-endpoint-groups create 指令

    gcloud compute network-endpoint-groups create GCP_NEG_NAME \
        --network-endpoint-type=GCE_VM_IP_PORT \
        --zone=GCP_NEG_ZONE \
        --network=NETWORK \
        --subnet=LB_SUBNET_NAME
    
    • 名稱:neg-1
      • 區域 GCP_NEG_ZONE:位於區域 REGION_AZONE_A
      • 子網路 LB_SUBNET_NAMESUBNET_A
    • 名稱:neg-2
      • 區域 GCP_NEG_ZONE:位於區域 REGION_BZONE_B
      • 子網路 LB_SUBNET_NAMESUBNET_B

    您可以在建立 NEG 時使用 --default-port 選項指定通訊埠,也可以為每個端點指定通訊埠編號,如下一步所示。

  2. 將端點新增至 neg1neg2

    gcloud compute network-endpoint-groups update neg1 \
        --zone=ZONE_A \
        --add-endpoint='instance=vm-a1,port=80'
    
    gcloud compute network-endpoint-groups update neg2 \
        --zone=ZONE_B \
        --add-endpoint='instance=vm-b1,port=80'
    

設定混合式連線 NEG

建立 NEG 時,請使用可盡量縮短 Google Cloud 與地端部署系統或其他雲端環境之間地理距離的可用區。舉例來說,如果您在德國法蘭克福的內部部署環境中代管服務,建立 NEG 時可以指定 europe-west3-a Google Cloud 可用區。

如果您使用 Cloud Interconnect,建立 NEG 時使用的可用區會與 Cloud Interconnect 連結設定所在的區域相同。

混合式 NEG 僅支援分散式 Envoy 健康狀態檢查

主控台

如要建立混合式連線網路端點群組,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 按一下「建立網路端點群組」

  3. 使用下列名稱和區域組合,針對每個混合 NEG 重複執行步驟 4 至 9。

    • 名稱 ON_PREM_NEG_NAMEhybrid-1
      • 可用區:ON_PREM_NEG_ZONE1
      • 子網路:SUBNET_A
    • 名稱 ON_PREM_NEG_NAMEhybrid-2
      • 可用區:ON_PREM_NEG_ZONE2
      • 子網路:SUBNET_B
  4. 按照上一個步驟的說明設定名稱。

  5. 選取「網路端點群組類型」混合式連線網路端點群組 (可用區)

  6. 選取「網路」NETWORK

  7. 在「Subnet」(子網路) 中,選擇上一個步驟指定的選項。

  8. 在「Zone」(可用區) 中,選取上一個步驟指定的選項。

  9. 輸入「預設通訊埠」

  10. 按一下 [建立]。

將端點新增至混合式連線 NEG:

  1. 前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。

    前往網路端點群組

  2. 按一下上一個步驟建立的網路端點群組「名稱」。畫面上即會出現「Network endpoint group detail」(網路端點群組詳細資料) 頁面。

  3. 在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面會出現「Add network endpoint」(新增網路端點) 頁面。

  4. 輸入新網路端點的「IP address」(IP 位址)

  5. 選擇「Port type」(通訊埠類型)

    1. 如果您選取「預設」,則端點會使用網路端點群組中所有端點的預設通訊埠。
    2. 如果選取「自訂」,您可以輸入端點要使用的其他「通訊埠編號」
  6. 如要新增更多端點,請按一下「新增網路端點」,然後重複以上步驟。

  7. 新增所有非Google Cloud 端點後,按一下「建立」

gcloud

  1. 建立使用下列名稱組合的混合式連線 NEG。使用 gcloud compute network-endpoint-groups create 指令

    gcloud compute network-endpoint-groups create ON_PREM_NEG_NAME \
        --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
        --zone=ON_PREM_NEG_ZONE \
        --network=NETWORK
    
    • 名稱 ON_PREM_NEG_NAMEhybrid-1
      • 區域 ON_PREM_NEG_ZONEON_PREM_NEG_ZONE1
    • 名稱 ON_PREM_NEG_NAMEhybrid-2
      • 區域 GCP_NEG_ZONEON_PREM_NEG_ZONE2
  2. 將內部部署後端 VM 端點新增至 ON_PREM_NEG_NAME

    gcloud compute network-endpoint-groups update ON_PREM_NEG_NAME \
        --zone=ON_PREM_NEG_ZONE \
        --add-endpoint="ip=ON_PREM_IP_ADDRESS_1,port=PORT_1" \
        --add-endpoint="ip=ON_PREM_IP_ADDRESS_2,port=PORT_2"
    

您可以使用這項指令,新增先前在內部部署或雲端環境中設定的網路端點。視需要重複執行 --add-endpoint

設定負載平衡器

主控台

gcloud

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

    gcloud compute health-checks create http gil7-basic-check \
       --use-serving-port \
       --global
    
  2. 使用 gcloud compute backend-services create 指令建立後端服務並啟用記錄功能。

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

    gcloud compute backend-services add-backend BACKEND_SERVICE \
      --global \
      --balancing-mode=RATE \
      --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \
      --network-endpoint-group=neg1 \
      --network-endpoint-group-zone=ZONE_A \
      --network-endpoint-group=neg2 \
      --network-endpoint-group-zone=ZONE_B
    

    如要瞭解如何設定平衡模式,請參閱 --max-rate-per-endpoint 標記的 gcloud CLI 說明文件。

  4. 將混合式 NEG 新增至後端服務,以做為後端使用。

    gcloud compute backend-services add-backend BACKEND_SERVICE \
      --global \
      --balancing-mode=RATE \
      --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \
      --network-endpoint-group=hybrid1 \
      --network-endpoint-group-zone=ON_PREM_NEG_ZONE1 \
      --network-endpoint-group=hybrid2 \
      --network-endpoint-group-zone=ON_PREM_NEG_ZONE2 \
    

    如要進一步瞭解如何設定平衡模式,請參閱 --max-rate-per-endpoint 參數的 gcloud CLI 說明文件。

  5. 使用 gcloud compute url-maps create 指令建立網址對應。

    gcloud compute url-maps create gil7-map \
      --default-service=BACKEND_SERVICE \
      --global
    
  6. 建立目標 Proxy。

    HTTP:

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

    gcloud compute target-http-proxies create gil7-http-proxy \
      --url-map=gil7-map \
      --global
    

    HTTPS:

    如要建立 Google 代管的憑證,請參閱下列說明文件:

    建立 Google 代管憑證後,請將憑證附加至目標 Proxy。跨區域內部應用程式負載平衡器不支援憑證對應。

    如要建立自行管理的憑證,請參閱下列說明文件:

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

    export LB_CERT=PATH_TO_PEM_FORMATTED_FILE
    
    export LB_PRIVATE_KEY=PATH_TO_PEM_LB_PRIVATE_FILE
    

    使用 gcloud certificate-manager certificates create 指令建立全區域 SSL 憑證。

    gcloud certificate-manager certificates create gilb-certificate \
      --private-key-file=$LB_CERT \
      --certificate-file=$LB_PRIVATE_KEY \
      --scope=all-regions
    

    使用 SSL 憑證,透過 gcloud compute target-https-proxies create 指令建立目標 Proxy

    gcloud compute target-https-proxies create gil7-https-proxy \
      --url-map=gil7-map \
      --certificate-manager-certificates=gilb-certificate \
      --global
    
  7. 建立兩項轉送規則,一項使用 REGION_A 地區的 VIP IP_ADDRESS1,另一項使用 REGION_B 地區的 VIP IP_ADDRESS2。請使用 LB_SUBNET_RANGE1LB_SUBNET_RANGE2 IP 位址範圍,做為轉送規則的 IP 位址。如果您嘗試使用僅限 Proxy 的子網路,轉送規則建立作業就會失敗。

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

    HTTP:

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

    gcloud compute forwarding-rules create FWRULE_A \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=IP_ADDRESS1 \
      --ports=80 \
      --target-http-proxy=gil7-http-proxy \
      --global
    
    gcloud compute forwarding-rules create FWRULE_B \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=IP_ADDRESS2 \
      --ports=80 \
      --target-http-proxy=gil7-http-proxy \
      --global
    

    HTTPS:

    使用加上正確旗標的 gcloud compute forwarding-rules create 指令建立轉送規則。

    gcloud compute forwarding-rules create FWRULE_A \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=IP_ADDRESS1 \
      --ports=443 \
      --target-https-proxy=gil7-https-proxy \
      --global
    
    gcloud compute forwarding-rules create FWRULE_B \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=IP_ADDRESS2 \
      --ports=443 \
      --target-https-proxy=gil7-https-proxy \
      --global
    

將網域連結至負載平衡器

建立負載平衡器後,請記下與負載平衡器相關聯的 IP 位址,例如 IP_ADDRESS1IP_ADDRESS2。如要將網域指向負載平衡器,請使用 Cloud DNS 或網域註冊服務建立 A 記錄。如果 SSL 憑證中新增了多個網域,請為每個網域新增 A 記錄,並全部指向負載平衡器的 IP 位址。

測試負載平衡器

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

  1. 建立用戶端 VM:

    gcloud compute instances create l7-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 l7-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 l7-ilb-client-a \
       --zone=ZONE_A
    
    gcloud compute ssh l7-ilb-client-b \
       --zone=ZONE_B
    
  3. 確認 IP 位址是否提供主機名稱。

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

      HTTP 測試:

      curl IP_ADDRESS1
      
      curl IP_ADDRESS2
      

      HTTPS 測試:

      curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS1:443
      
      curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS2:443
      

      DOMAIN_NAME 替換為您的應用程式網域名稱,例如 test.example.com

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

    • 選用:使用設定的 DNS 記錄,解析最接近用戶端 VM 的 IP 位址。例如,DNS_ENTRY 可以是 service.example.com

      curl DNS_ENTRY
      

執行 100 個要求

執行 100 個 curl 要求,並從回應中確認這些要求已達到負載平衡。

HTTP

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

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

HTTPS

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

    DOMAIN_NAME 替換為您的應用程式網域名稱,例如 test.example.com

    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS1:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS1: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    
    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS2:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS2: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

測試容錯移轉

  1. 確認後端健康狀態不良或無法連線時,是否會容錯移轉至 REGION_A 區域中的後端。REGION_B我們從 REGION_B 中移除所有後端,模擬這個情況:

    gcloud compute backend-services remove-backend BACKEND_SERVICE \
       --balancing-mode=RATE \
       --network-endpoint-group=neg2 \
       --network-endpoint-group-zone=ZONE_B
    
  2. 使用 SSH 連線至 REGION_B 中的用戶端 VM。

    gcloud compute ssh l7-ilb-client-b \
       --zone=ZONE_B
    
  3. 將要求傳送至 REGION_B 區域中經過負載平衡的 IP 位址。 輸出結果會與下列內容相似:

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

額外設定選項

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

設定 DNS 轉送政策

如果用戶端位於多個區域,您可能需要使用這些區域的 VIP,讓用戶端存取跨區域內部應用程式負載平衡器。您可以使用 GEO 類型的 DNS 轉送政策,將用戶端流量轉送至最接近用戶端的區域中的負載平衡器 VIP。這種多區域設定可將延遲時間和網路傳輸費用降至最低。此外,您也可以設定以 DNS 為基礎的全球負載平衡解決方案,防範區域性服務中斷。

Cloud DNS 支援健康狀態檢查,並在端點未通過健康狀態檢查時,自動執行容錯移轉。容錯移轉期間,Cloud DNS 會自動調整其餘健康端點之間的流量分配。詳情請參閱「管理 DNS 轉送政策和健康狀態檢查」。

gcloud

如要建立 TTL 為 30 秒的 DNS 項目,請使用 gcloud dns record-sets create 指令

gcloud dns record-sets create DNS_ENTRY --ttl="30" \
  --type="A" --zone="service-zone" \
  --routing-policy-type="GEO" \
  --routing-policy-data="REGION_A=gil7-forwarding-rule-a@global;REGION_B=gil7-forwarding-rule-b@global" \
  --enable-health-checking

更改下列內容:

  • DNS_ENTRY:記錄集的 DNS 或網域名稱

    例如 service.example.com

  • REGION_AREGION_B: 您已設定負載平衡器的區域

API

ResourceRecordSets.create 方法發出 POST 要求,即可建立 DNS 記錄。PROJECT_ID 替換為您的專案 ID。

POST https://www.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/SERVICE_ZONE/rrsets
{
  "name": "DNS_ENTRY",
  "type": "A",
  "ttl": 30,
  "routingPolicy": {
    "geo": {
      "items": [
        {
          "location": "REGION_A",
          "healthCheckedTargets": {
            "internalLoadBalancers": [
              {
                "loadBalancerType": "globalL7ilb",
                "ipAddress": "IP_ADDRESS",
                "port": "80",
                "ipProtocol": "tcp",
                "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
                "project": "PROJECT_ID"
              }
            ]
          }
        },
        {
          "location": "REGION_B",
          "healthCheckedTargets": {
            "internalLoadBalancers": [
              {
                "loadBalancerType": "globalL7ilb",
                "ipAddress": "IP_ADDRESS_B",
                "port": "80",
                "ipProtocol": "tcp",
                "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
                "project": "PROJECT_ID"
              }
            ]
          }
        }
      ]
    }
  }
}

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

先前步驟中建立的負載平衡器已設定 用戶端 HTTP Keep-Alive 超時的預設值。

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

控制台

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

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

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

gcloud

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

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

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

      gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
          --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
          --global
    

更改下列內容:

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

啟用離群值偵測

您可以在全域後端服務上啟用離群值偵測,找出不正常的無伺服器 NEG,並減少傳送至不正常無伺服器 NEG 的要求數量。

您可以使用下列其中一種方法,在後端服務上啟用離群值偵測功能:

  • consecutiveErrors 方法 (outlierDetection.consecutiveErrors),其中 5xx 系列 HTTP 狀態碼會視為錯誤。
  • consecutiveGatewayFailure 方法 (outlierDetection.consecutiveGatewayFailure),其中只有 502503504 HTTP 狀態碼符合錯誤資格。

請按照下列步驟,為現有後端服務啟用離群值偵測功能。請注意,即使啟用離群值偵測功能,部分要求仍可能會傳送至不正常的服務,並向用戶端傳回 5xx 狀態碼。如要進一步降低錯誤率,您可以為離群值偵測參數設定更積極的值。詳情請參閱outlierDetection 欄位

主控台

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

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

  2. 按一下您要編輯後端服務的負載平衡器名稱。

  3. 在「Load balancer details」(負載平衡器詳細資料) 頁面中,按一下「Edit」(編輯)

  4. 在「Edit cross-region internal Application Load Balancer」(編輯跨區域內部應用程式負載平衡器) 頁面上,按一下「Backend configuration」(後端設定)

  5. 在「Backend configuration」(後端設定) 頁面上,針對要修改的後端服務,點選「Edit」(編輯)

  6. 向下捲動並展開「進階設定」部分。

  7. 在「Outlier detection」(離群值偵測) 專區中,勾選「Enable」(啟用) 核取方塊。

  8. 按一下「編輯」,設定離群值偵測。

    確認下列選項已設為指定的值:

    屬性
    連續錯誤 5
    間隔 1000
    基礎排除時間 30000
    排除百分比上限 50
    強制執行連續錯誤 100

    在本例中,離群值偵測分析每秒執行一次。如果 Envoy Proxy 連續收到五個以上的 HTTP 5xx 狀態碼,後端端點就會從該 Envoy Proxy 的負載平衡集區中排除 30 秒。如果強制執行百分比設為 100%,每當異常情況偵測分析執行時,後端服務就會強制從這些特定 Envoy Proxy 的負載平衡集區中,排除健康狀態不良的端點。如果符合排除條件,最多可從負載平衡集區中排除 50% 的後端端點。

  9. 按一下 [儲存]

  10. 如要更新後端服務,請按一下「更新」

  11. 如要更新負載平衡器,請在「Edit cross-region internal Application Load Balancer」(編輯跨區域內部應用程式負載平衡器) 頁面上,按一下「Update」(更新)

gcloud

  1. 將後端服務匯出至 YAML 檔案。

    gcloud compute backend-services export BACKEND_SERVICE_NAME \
      --destination=BACKEND_SERVICE_NAME.yaml --global
    

    BACKEND_SERVICE_NAME 改為後端服務名稱。

  2. 編輯後端服務的 YAML 設定,在 outlierDetection 區段中新增離群值偵測的欄位,如下列 YAML 設定中醒目顯示的部分所示:

    在本例中,離群值偵測分析每秒執行一次。如果 Envoy Proxy 連續收到五個以上的 HTTP 5xx 狀態碼,後端端點就會從該 Envoy Proxy 的負載平衡集區中排除 30 秒。如果強制執行百分比設為 100%,每當異常情況偵測分析執行時,後端服務就會強制從這些特定 Envoy Proxy 的負載平衡集區中,排除健康狀態不良的端點。如果符合排除條件,最多可從負載平衡集區中排除 50% 的後端端點。

    name: BACKEND_SERVICE_NAME
    backends:
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/networkEndpointGroups/SERVERLESS_NEG_NAME
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/networkEndpointGroups/SERVERLESS_NEG_NAME_2
    outlierDetection:
      baseEjectionTime:
        nanos: 0
        seconds: 30
      consecutiveErrors: 5
      enforcingConsecutiveErrors: 100
      interval:
        nanos: 0
        seconds: 1
      maxEjectionPercent: 50
    port: 80
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
    sessionAffinity: NONE
    timeoutSec: 30
    ...
    

    更改下列內容:

    • BACKEND_SERVICE_NAME:後端服務的名稱
    • PROJECT_ID:您的專案 ID
    • REGION_AREGION_B: 已設定負載平衡器的區域。
    • SERVERLESS_NEG_NAME:第一個無伺服器 NEG 的名稱
    • SERVERLESS_NEG_NAME_2:第二個無伺服器 NEG 的名稱
  3. 匯入最新設定,更新後端服務。

    gcloud compute backend-services import BACKEND_SERVICE_NAME \
      --source=BACKEND_SERVICE_NAME.yaml --global
    

    後端服務現已啟用離群值偵測功能。

後續步驟