使用 VM 執行個體群組後端設定內部直通式網路負載平衡器

本指南使用範例來說明 Google Cloud內部直通式網路負載平衡器的基礎知識。在按照本指南操作之前,請先熟悉以下內容:


如要直接在 Google Cloud 控制台按照逐步指南操作,請按一下「Guide me」(逐步引導)

逐步引導


權限

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

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

詳情請參閱下列指南:

設定僅限 IPv4 子網路和後端的負載平衡器

本指南說明如何設定及測試內部直通式網路負載平衡器。本節中的步驟說明如何設定以下項目:

  1. 使用名為 lb-network自訂模式虛擬私有雲網路的範例。
  2. 單一堆疊子網路 (stack-type 設為 IPv4),這是 IPv4 流量所需的子網路。在自訂模式虛擬私有雲網路中建立單一堆疊子網路時,您需要為子網路選擇 IPv4 子網路範圍
  3. 允許連入連線到後端 VM 的防火牆規則。
  4. 後端執行個體群組,位於下列地區和子網路:
    • 區域:us-west1
    • 子網路:lb-subnet,主要 IPv4 位址範圍為 10.1.2.0/24
  5. 四個後端 VM:us-west1-a 區域中非代管執行個體群組中的兩個 VM,以及 us-west1-c 區域中非代管執行個體群組中的兩個 VM。為了展示全域存取權,這個範例會在不同的區域和子網路中建立第二個測試用戶端 VM:
    • 區域:europe-west1
    • 子網路:europe-subnet,主要 IP 位址範圍為 10.3.4.0/24
  6. 一個用來測試連線的用戶端 VM。
  7. 以下內部直通式網路負載平衡器元件:
    • 後端服務的健康狀態檢查。
    • 一個位於 us-west1 地區的內部後端服務,用於管理兩個區域性執行個體群組之間的連線分配。
    • 一個用於負載平衡器前端的內部轉送規則和內部 IP 位址。

這個範例的架構如下所示:

內部直通式網路負載平衡器設定範例。
內部直通式網路負載平衡器示例設定 (按一下可放大)。

設定網路、地區和子網路

如要建立範例網路和子網路,請按照以下步驟操作。

主控台

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

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

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

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

  4. 在「Subnets」(子網路) 區段中,執行下列操作:

    1. 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    2. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
      • Name (名稱):lb-subnet
      • Region (區域):us-west1
      • IP stack type (IP 堆疊類型):IPv4 (單一堆疊)
      • IP address range (IP 位址範圍):10.1.2.0/24
    3. 按一下 [完成]
    4. 按一下「Add subnet」(新增子網路),然後輸入下列資訊:
      • Name (名稱):europe-subnet
      • Region (區域):europe-west1
      • IP stack type (IP 堆疊類型):IPv4 (單一堆疊)
      • IP address range (IP 位址範圍):10.3.4.0/24
    5. 按一下 [完成]
  5. 按一下 [建立]。

gcloud

  1. 建立自訂虛擬私人雲端網路:

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

    gcloud compute networks subnets create lb-subnet \
      --network=lb-network \
      --range=10.1.2.0/24 \
      --region=us-west1
    
  3. lb-network 網路中建立另一個子網路,用於測試 europe-west1 區域的全域存取權:

    gcloud compute networks subnets create europe-subnet \
      --network=lb-network \
      --range=10.3.4.0/24 \
      --region=europe-west1
    

API

networks.insert 方法提出 POST 要求。

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

{
 "routingConfig": {
   "routingMode": "REGIONAL"
 },
 "name": "lb-network",
 "autoCreateSubnetworks": false
}

subnetworks.insert 方法提出兩項 POST 要求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks

{
 "name": "lb-subnet",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "ipCidrRange": "10.1.2.0/24",
 "privateIpGoogleAccess": false
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks

{
 "name": "europe-subnet",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
  "ipCidrRange": "10.3.4.0/24",
  "privateIpGoogleAccess": false
}

設定防火牆規則

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

  • fw-allow-lb-access:輸入規則,適用於虛擬私人雲端網路中的所有目標,允許來源在 10.1.2.0/2410.3.4.0/24 範圍內的流量。這項規則允許來自這兩個子網路的任何用戶端的傳入流量。稍後您可以設定及測試全域存取權

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

  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的執行個體,允許來自 Google Cloud 健康檢查系統 (130.211.0.0/2235.191.0.0/16) 的流量。這個範例會使用目標標記 allow-health-check 來辨識應套用此規則的執行個體。

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

主控台

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

    前往「防火牆政策」

  2. 如要允許子網路流量,請按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-lb-access
    • Network (網路):lb-network
    • Priority (優先順序):1000
    • 流量方向ingress
    • 相符時執行的動作allow
    • 「Targets」(目標)All instances in the network
    • Source filter (來源篩選器):IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):10.1.2.0/24
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  3. 按一下 [建立]。

  4. 如要允許連入 SSH 連線,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network
    • Priority (優先順序):1000
    • 流量方向ingress
    • 「Action on match」(相符時執行的動作)allow
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-ssh
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • Protocols and ports:選取「Specified protocols and ports」,勾選「TCP」核取方塊,然後在「Ports」中輸入 22
  5. 按一下 [建立]。

  6. 如要允許 Google Cloud 健康狀態檢查,請第三次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-health-check
    • Network (網路):lb-network
    • Priority (優先順序):1000
    • 流量方向ingress
    • 「Action on match」(相符時執行的動作)allow
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  7. 按一下 [建立]。

gcloud

  1. 建立 fw-allow-lb-access 防火牆規則,允許從子網路內進行通訊:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24,10.3.4.0/24 \
        --rules=tcp,udp,icmp
    
  2. 建立 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
    
  3. 建立 fw-allow-health-check 規則,允許 Google Cloud健康狀態檢查。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

API

firewalls.insert 方法發出 POST 要求,建立 fw-allow-lb-access 防火牆規則。

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

{
 "name": "fw-allow-lb-access",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "priority": 1000,
 "sourceRanges": [
   "10.1.2.0/24", "10.3.4.0/24"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp"
   },
   {
     "IPProtocol": "udp"
   },
   {
     "IPProtocol": "icmp"
   }
 ],
 "direction": "INGRESS",
 "logConfig": {
   "enable": false
 },
 "disabled": false
}

firewalls.insert 方法發出 POST 要求,建立 fw-allow-ssh 防火牆規則。

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

{
 "name": "fw-allow-ssh",
      "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "priority": 1000,
 "sourceRanges": [
   "0.0.0.0/0"
 ],
 "targetTags": [
   "allow-ssh"
 ],
 "allowed": [
  {
    "IPProtocol": "tcp",
    "ports": [
      "22"
    ]
  }
 ],
"direction": "INGRESS",
"logConfig": {
  "enable": false
},
"disabled": false
}

firewalls.insert 方法發出 POST 要求,建立 fw-allow-health-check 防火牆規則。

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

{
 "name": "fw-allow-health-check",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "priority": 1000,
 "sourceRanges": [
   "130.211.0.0/22",
   "35.191.0.0/16"
 ],
 "targetTags": [
   "allow-health-check"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp"
   },
   {
     "IPProtocol": "udp"
   },
   {
     "IPProtocol": "icmp"
   }
 ],
 "direction": "INGRESS",
 "logConfig": {
   "enable": false
 },
 "disabled": false
}

建立後端 VM 和執行個體群組

本範例使用兩個「非代管」執行個體群組,每個群組都包含兩個後端 (伺服器) VM。為了示範內部直通式網路負載平衡器的區域性質,這兩個執行個體群組是放在不同的區域 us-west1-aus-west1-c 中。

  • 執行個體群組 ig-a 包含以下兩個 VM:
    • vm-a1
    • vm-a2
  • 執行個體群組 ig-c 包含以下兩個 VM:
    • vm-c1
    • vm-c2

傳輸至以上四個後端 VM 的流量都已達到負載平衡。

為了支援這個範例和其他設定選項,四個 VM 各自執行 Apache 網路伺服器,用於監聽下列 TCP 通訊埠:80、8008、8080、8088、443 和 8443。

每個 VM 都會獲指派 lb-subnet 中的內部 IP 位址和臨時外部 (公開) IP 位址。您可以稍後移除外部 IP 位址

雖然後端 VM 的外部 IP 位址並非必要,但對於本範例來說,它們非常實用,因為它們允許後端 VM 從網際網路下載 Apache,並且可以透過 SSH 進行連線

根據預設,Apache 會設定為繫結至任何 IP 位址。內部直通式網路負載平衡器會透過保留目的地 IP 來傳遞封包。請確認在後端 VM 上執行的伺服器軟體正在監聽負載平衡器內部轉送規則的 IP 位址。如果您設定了多個內部轉送規則,請確保您的軟體會監聽與每個規則相關聯的內部 IP 位址。由內部直通式網路負載平衡器傳遞至後端 VM 的封包目的地 IP 位址是轉送規則的內部 IP 位址。

為方便說明,這些後端 VM 會執行 Debian GNU/Linux 12。

主控台

建立後端 VM

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

    前往 VM 執行個體

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

    • 名稱:vm-a1,區域:us-west1-a
    • 名稱:vm-a2,區域:us-west1-a
    • 名稱:vm-c1,區域:us-west1-c
    • 名稱:vm-c2,區域:us-west1-c
  3. 點選「建立執行個體」

  4. 按照步驟 2 指定的名稱設定「Name」(名稱)

  5. 在「Region」(區域) 中選取 us-west1,然後選擇步驟 2 列出的「Zone」(可用區)

  6. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Change」變更圖片。

  7. 點選「進階選項」

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

    1. 在「Network tags」(網路標記) 中輸入 allow-sshallow-health-check
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):lb-subnet
      • IP stack type (IP 堆疊類型):IPv4 (單一堆疊)
      • 主要內部 IPv4 位址臨時 (自動)
      • 外部 IPv4 位址臨時
  9. 按一下「Management」(管理),然後在「Startup script」(開機指令碼) 欄位中輸入下列指令碼。四個 VM 的指令碼內容完全相同。

    
    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    
  10. 按一下 [建立]。

建立執行個體群組

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

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

  2. 使用下列組合,重複以下的步驟來建立兩個非代管執行個體群組,每個非代管執行個體群組各包含兩個 VM。

    • 執行個體群組名稱:ig-a,區域:us-west1-a,VM:vm-a1vm-a2
    • 執行個體群組名稱:ig-c,區域:us-west1-c,VM:vm-c1vm-c2
  3. 點選「建立執行個體群組」

  4. 按一下「New unmanaged instance group」(新增非代管的執行個體群組)

  5. 按照步驟 2 指定的名稱設定「Name」(名稱)

  6. 在「Location」(位置) 區段,為「Region」(區域) 選取 us-west1,然後選擇步驟 2 列出的「Zone」(可用區)

  7. 在「Network」中選取 lb-network

  8. 在「Subnetwork」(子網路) 中,選取 lb-subnet

  9. 在「VM instances」(VM 執行個體) 區段中,按照步驟 2 指定的 VM 新增 VM。

  10. 按一下 [建立]。

gcloud

  1. 使用下列四個 [VM-NAME][ZONE] 組合,透過執行以下指令四次來建立四個 VM。四個 VM 的指令碼內容完全相同。

    • VM-NAMEvm-a1ZONEus-west1-a
    • VM-NAMEvm-a2ZONEus-west1-a
    • VM-NAMEvm-c1ZONEus-west1-c
    • VM-NAMEvm-c2ZONEus-west1-c
    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
  2. 在每個區域中建立兩個非代管執行個體群組:

    gcloud compute instance-groups unmanaged create ig-a \
        --zone=us-west1-a
    gcloud compute instance-groups unmanaged create ig-c \
        --zone=us-west1-c
    
  3. 將 VM 新增至適當的執行個體群組:

    gcloud compute instance-groups unmanaged add-instances ig-a \
        --zone=us-west1-a \
        --instances=vm-a1,vm-a2
    gcloud compute instance-groups unmanaged add-instances ig-c \
        --zone=us-west1-c \
        --instances=vm-c1,vm-c2
    

API

針對四個 VM,請使用以下 VM 名稱和區域:

  • VM-NAMEvm-a1ZONEus-west1-a
  • VM-NAMEvm-a2ZONEus-west1-a
  • VM-NAMEvm-c1ZONEus-west1-c
  • VM-NAMEvm-c2ZONEus-west1-c

您可以執行下列 gcloud 指令,取得目前的 DEBIAN_IMAGE_NAME

gcloud compute images list \
 --filter="family=debian-12"

instances.insert 方法發出四個 POST 要求,建立四個後端 VM:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
 "name": "VM-NAME",
 "tags": {
   "items": [
     "allow-health-check",
     "allow-ssh"
   ]
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/[ZONE]/machineTypes/e2-standard-2",
 "canIpForward": false,
 "networkInterfaces": [
   {
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
     "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
     "accessConfigs": [
       {
         "type": "ONE_TO_ONE_NAT",
         "name": "external-nat",
         "networkTier": "PREMIUM"
       }
     ]
   }
 ],
 "disks": [
   {
     "type": "PERSISTENT",
     "boot": true,
     "mode": "READ_WRITE",
     "autoDelete": true,
     "deviceName": "VM-NAME",
     "initializeParams": {
       "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
       "diskType": "projects/PROJECT_ID/zones/zone/diskTypes/pd-standard",
       "diskSizeGb": "10"
     }
   }
 ],
 "metadata": {
   "items": [
     {
       "key": "startup-script",
       "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nfile_ports=\"/etc/apache2/ports.conf\"\nfile_http_site=\"/etc/apache2/sites-available/000-default.conf\"\nfile_https_site=\"/etc/apache2/sites-available/default-ssl.conf\"\nhttp_listen_prts=\"Listen 80\\nListen 8008\\nListen 8080\\nListen 8088\"\nhttp_vh_prts=\"*:80 *:8008 *:8080 *:8088\"\nhttps_listen_prts=\"Listen 443\\nListen 8443\"\nhttps_vh_prts=\"*:443 *:8443\"\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://metadata.google.internal/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nprt_conf=\"$(cat \"$file_ports\")\"\nprt_conf_2=\"$(echo \"$prt_conf\" | sed \"s|Listen 80|${http_listen_prts}|\")\"\nprt_conf=\"$(echo \"$prt_conf_2\" | sed \"s|Listen 443|${https_listen_prts}|\")\"\necho \"$prt_conf\" | tee \"$file_ports\"\nhttp_site_conf=\"$(cat \"$file_http_site\")\"\nhttp_site_conf_2=\"$(echo \"$http_site_conf\" | sed \"s|*:80|${http_vh_prts}|\")\"\necho \"$http_site_conf_2\" | tee \"$file_http_site\"\nhttps_site_conf=\"$(cat \"$file_https_site\")\"\nhttps_site_conf_2=\"$(echo \"$https_site_conf\" | sed \"s|_default_:443|${https_vh_prts}|\")\"\necho \"$https_site_conf_2\" | tee \"$file_https_site\"\nsystemctl restart apache2"
     }
   ]
 },
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

instanceGroups.insert 方法發出 POST 要求,建立兩個執行個體群組。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups

{
 "name": "ig-a",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups

{
 "name": "ig-c",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
}

instanceGroups.addInstances 方法提出 POST 要求,將執行個體新增至每個執行個體群組。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a/addInstances

{
 "instances": [
   {
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1",
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a2"
   }
 ]
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c/addInstances

{
 "instances": [
   {
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c1",
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c2"
   }
 ]
}

設定負載平衡器元件

以下步驟會設定所有內部直通式網路負載平衡器元件,先從健康狀態檢查和後端服務開始,然後再設定前端元件:

  • 健康狀態檢查:在本範例中,您使用 HTTP 健康狀態檢查,檢查 HTTP 200 (OK) 回應。詳情請參閱內部轉送網路負載平衡器總覽的健康狀態檢查一節

  • 後端服務:由於需要透過內部負載平衡器傳送 HTTP 流量,因此必須使用 TCP,而非 UDP。

  • 轉送規則:這個範例會建立一個內部轉送規則。

  • 內部 IP 位址:在這個範例中,您需要在建立轉送規則時指定內部 IP 位址 10.1.2.99

主控台

開始設定

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

    前往「負載平衡」

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

在「Create internal passthrough Network Load Balancer」(建立內部直通式網路負載平衡器) 頁面中,輸入下列資訊:

  • 負載平衡器名稱be-ilb
  • 區域us-west1
  • Network (網路):lb-network

設定後端

  1. 按一下「後端設定」
  2. 如要只處理 IPv4 流量,請在「後端」的「New Backend」 區段中,將「IP 堆疊類型」設為「IPv4 (單一堆疊)」
  3. 在「Instance group」(執行個體群組) 中,選取 ig-c 執行個體群組,然後按一下「Done」(完成)
  4. 按一下「新增後端」,然後重複執行新增 ig-a 的步驟。
  5. 在「Health check」清單中,選取「Create a health check」,輸入以下資訊,然後按一下「Save」

    • 名稱:hc-http-80
    • 通訊協定: HTTP
    • 通訊埠: 80
    • Proxy 通訊協定: NONE
    • 要求路徑: /

    請注意,使用 Google Cloud 控制台建立負載平衡器時,系統會啟用全域健康狀態檢查。如要建立區域健康狀態檢查,請使用 gcloud 或 API。

  6. 繼續操作之前,請先驗證「Backend configuration」旁是否有藍色勾號。

設定前端

  1. 按一下「前端設定」
  2. 在「New Frontend IP and port」部分執行下列操作:
    1. 在「Name」(名稱) 中輸入 fr-ilb
    2. 在「Subnetwork」(子網路) 中,選取 lb-subnet
    3. 在「Internal IP purpose」(內部 IP 用途) 區段的「IP address」(IP 位址) 清單中,選取「Create IP address」(建立 IP 位址),輸入下列資訊,然後按一下「Reserve」(保留)
      • 名稱:ip-ilb
      • IP 版本: IPv4
      • Static IP addressLet me choose
      • 自訂 IP 位址: 10.1.2.99
    4. 在「Ports」(通訊埠) 中,選取「Multiple」(多個),然後在「Port numbers」(通訊埠編號) 中輸入 80800880808088
    5. 繼續操作之前,請先驗證「Frontend configuration」旁是否有藍色勾號。

檢閱設定

  1. 按一下「檢查並完成」
  2. 查看負載平衡器設定。
  3. 選用:按一下「等效程式碼」,查看用來建立負載平衡器的 REST API 要求。
  4. 按一下 [建立]。

gcloud

  1. 建立新的區域 HTTP 健康狀態檢查,以測試通訊埠 80 上連至 VM 的 HTTP 連線。

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. 針對 HTTP 流量建立後端服務:

    gcloud compute backend-services create be-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 將兩個執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c
    
  4. 為後端服務建立轉送規則。建立轉送規則時,請為子網路中的內部 IP 指定 10.1.2.99

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

regionHealthChecks.insert 方法發出 POST 要求,建立健康狀態檢查。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionHealthChecks

{
"name": "hc-http-80",
"type": "HTTP",
"httpHealthCheck": {
  "port": 80
}
}

regionBackendServices.insert 方法發出 POST 要求,建立區域後端服務。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices

{
"name": "be-ilb",
"backends": [
  {
    "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a",
    "balancingMode": "CONNECTION"
  },
  {
    "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c",
    "balancingMode": "CONNECTION"
  }
],
"healthChecks": [
  "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80"
],
"loadBalancingScheme": "INTERNAL",
"connectionDraining": {
  "drainingTimeoutSec": 0
 }
}

forwardingRules.insert 方法發出 POST 要求,建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"ports": [
  "80", "8008", "8080", "8088"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

測試負載平衡器

以下測試示範如何驗證您的負載平衡器設定,並瞭解其預期行為。

建立用戶端 VM

本範例會在與後端 (伺服器) VM 相同的地區中建立用戶端 VM (vm-client)。該用戶端用於驗證負載平衡器的設定,以及示範「測試」一節中所述的預期行為。

主控台

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

    前往 VM 執行個體

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

  3. 在「Name」(名稱) 中輸入 vm-client

  4. 在「區域」部分,選取 us-west1

  5. 在「可用區」部分,選取 us-west1-a

  6. 點選「進階選項」

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

    1. 在「網路標記」中輸入 allow-ssh
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • 「Subnet」(子網路)lb-subnet
  8. 按一下 [建立]。

gcloud

用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用該地區中的任何子網路。在本範例中,用戶端位於 us-west1-a 區域,並使用與後端 VM 相同的子網路。

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

API

instances.insert 方法提出 POST 要求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances

{
 "name": "vm-client",
 "tags": {
   "items": [
     "allow-ssh"
   ]
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2",
 "canIpForward": false,
 "networkInterfaces": [
   {
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
     "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
     "accessConfigs": [
       {
         "type": "ONE_TO_ONE_NAT",
         "name": "external-nat",
         "networkTier": "PREMIUM"
       }
     ]
   }
 ],
 "disks": [
   {
     "type": "PERSISTENT",
     "boot": true,
     "mode": "READ_WRITE",
     "autoDelete": true,
     "deviceName": "vm-client",
     "initializeParams": {
       "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
       "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard",
       "diskSizeGb": "10"
     }
   }
 ],
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

測試從用戶端 VM 建立連線

這項測試會從不同的用戶端 VM 與負載平衡器聯絡;也就是說,不是從負載平衡器的後端 VM 進行聯絡。預期的行為是要在四個後端 VM 之間分配流量,因為尚未設定工作階段相依性

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 使用 curl 聯絡負載平衡器的 IP 位址,向負載平衡器發出網路要求。重複發出要求,系統便會顯示來自不同後端 VM 的回應。產生回應的 VM 名稱會顯示在 HTML 回應的文字中,這要歸功於每個後端 VM 上的 /var/www/html/index.html 內容。舉例來說,預期的回應會像 Page served from: vm-a1Page served from: vm-a2 這樣。

    curl http://10.1.2.99
    

    轉送規則設定為用於通訊埠 80800880808088,如要將流量傳送至其他通訊埠,請在 IP 位址後方加上冒號 (:) 和通訊埠號碼,如下所示:

    curl http://10.1.2.99:8008
    

    如果您將服務標籤新增至內部轉送規則,則可以使用內部 DNS 透過負載平衡器的服務名稱來與其聯絡。

      curl http://web-test.fr-ilb.il4.us-west1.lb.PROJECT_ID.internal
      

對負載平衡器的 IP 位址執行連線偵測 (ping)

這項測試會顯示預期的行為:您無法對負載平衡器的 IP 位址執行連線偵測 (ping)。這是因為內部直通式網路負載平衡器並非個別裝置,是透過虛擬網路程式設計實作。

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 嘗試對負載平衡器的 IP 位址執行連線偵測 (ping)。請注意,在本範例中,您不會收到回應,而且 ping 指令會在 10 秒後逾時。

    timeout 10 ping 10.1.2.99
    

從負載平衡的 VM 傳送要求

這項測試會顯示,當後端 VM 將封包傳送至負載平衡器轉送規則的 IP 位址時,這些要求會轉送回自身。無論後端 VM 的健康狀態檢查狀態為何,都會發生這種情況。

內部直通式網路負載平衡器是使用虛擬網路程式設計和客體 OS 中的 VM 設定實作的。在 Linux VM 上,訪客環境會在作業系統的本機轉送表中,為負載平衡器的 IP 位址建立路徑。

由於這個本機路徑位於 VM 本身 (而非虛擬私人雲端網路中的路徑),因此系統不會透過虛擬私人雲端網路處理傳送至負載平衡器 IP 位址的封包。相反地,傳送至負載平衡器 IP 位址的封包會留在 VM 的作業系統中。

  1. 連線至後端 VM,例如 vm-a1

    gcloud compute ssh vm-a1 --zone=us-west1-a
    
  2. 使用 curl 向負載平衡器發出網路要求 (依 IP 位址或服務名稱)。回應來自發出要求的相同後端 VM。我們會以相同方式回覆重複要求。從 vm-a1 進行測試時,預期的回應一律為 Page served from: vm-a1

    curl http://10.1.2.99
    
  3. 檢查本機轉送表,尋找與負載平衡器本身的 IP 位址 10.1.2.99 相符的目的地。這個路徑是內部直通式網路負載平衡器的必要部分,但它也說明瞭為什麼來自負載平衡器後方 VM 的要求一律會由同一個 VM 回應。

    ip route show table local | grep 10.1.2.99
    

當內部直通式網路負載平衡器的後端 VM 將封包傳送至負載平衡器的轉送規則 IP 位址時,封包會一律轉送回提出要求的 VM。這是因為內部直通式網路負載平衡器是直通式負載平衡器,實作方式是在 VM 的客體 OS 中為負載平衡器的 IP 位址建立本機路徑,如本節所述。如果您有負載平衡後端需要將 TCP 流量傳送至負載平衡器 IP 位址的用途,且需要將流量分配為來自非負載平衡後端,請考慮改用地區內部 Proxy 網路負載平衡器

詳情請參閱「以內部直通式網路負載平衡器做為下一個躍點」。

設定具有雙層子網路和後端的負載平衡器

本文件說明如何設定及測試支援 IPv4 和 IPv6 流量的內部直通式網路負載平衡器。本節中的步驟說明如何設定以下項目:

  1. 本頁範例使用名為 lb-network-dual-stack 的自訂模式虛擬私有雲網路。IPv6 流量需要自訂模式子網路
  2. 雙重堆疊子網路 (stack-type 設為 IPv4_IPv6),這是 IPv6 流量所需的子網路。在自訂模式虛擬私有雲網路上建立雙重堆疊子網路時,您可以為子網路選擇 IPv6 存取類型。在這個範例中,我們將子網路的 ipv6-access-type 參數設為 INTERNAL。這表示這個子網路中的新 VM 可同時指派內部 IPv4 位址和內部 IPv6 位址。如需操作說明,請參閱有關新增雙層子網路的 VPC 說明文件。
  3. 允許連入連線到後端 VM 的防火牆規則。
  4. 後端執行個體群組,位於下列地區和子網路:
    • 區域:us-west1
    • 子網路:lb-subnet,主要 IPv4 位址範圍為 10.1.2.0/24。雖然您會選擇在子網路上設定哪個 IPv4 位址範圍,但系統會自動指派 IPv6 位址範圍。Google 提供固定大小 (/64) 的 IPv6 CIDR 區塊。
  5. 四個後端雙層架構 VM:us-west1-a 區域中非代管執行個體群組中的兩個 VM,以及 us-west1-c 區域中非代管執行個體群組中的兩個 VM。為了展示全域存取權,這個範例會在不同的區域和子網路中建立第二個測試用戶端 VM:
    • 區域:europe-west1
    • 子網路:europe-subnet,主要 IP 位址範圍為 10.3.4.0/24
  6. 一個用來測試連線的用戶端 VM。
  7. 以下內部直通式網路負載平衡器元件:
    • 後端服務的健康狀態檢查。
    • 一個位於 us-west1 地區的內部後端服務,用於管理兩個區域性執行個體群組之間的連線分配。
    • 負載平衡器前端的兩個內部轉送規則。

下圖為此範例的架構:

雙堆疊虛擬私有雲網路,其中包含後端服務,用於管理兩個區域性執行個體群組的連線分配。
內部直通式網路負載平衡器示例設定 (按一下可放大)。

設定網路、地區和子網路

本頁所述的內部直通式網路負載平衡器範例,是在名為 lb-network-dual-stack自訂模式 VPC 網路中建立。

如要設定內部 IPv6 範圍的子網路,請啟用虛擬私有雲網路 ULA 內部 IPv6 範圍。內部 IPv6 子網路範圍會從這個範圍分配。

主控台

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

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

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

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

  4. 如要在這個網路的子網路上設定內部 IPv6 位址範圍,請完成下列步驟:

    1. 在「私人 IPv6 位址設定」部分,選取「為這個 VPC 網路設定 ULA 內部 IPv6 範圍」
    2. 在「Allocate internal IPv6 range」(分配內部 IPv6 範圍) 部分,選取「自動」或「手動」。如果您選取「手動」,請在 fd20::/20 範圍內輸入 /48 範圍。如果範圍已在使用中,系統會提示您提供其他範圍。
  5. 在「子網路建立模式」中,選取「自訂」

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

    • Name (名稱):lb-subnet
    • Region (區域):us-west1
    • IP 堆疊類型IPv4 和 IPv6 (雙重堆疊)
    • IPv4 範圍10.1.2.0/24
    • IPv6 存取權類型內部
  7. 按一下 [完成]

  8. 按一下「Add subnet」(新增子網路),然後輸入下列資訊:

    • Name (名稱):europe-subnet
    • Region (區域):europe-west1
    • IP stack type (IP 堆疊類型):IPv4 (單一堆疊)
    • IP address range (IP 位址範圍):10.3.4.0/24
  9. 按一下 [完成]

  10. 按一下 [建立]。

gcloud

  1. 如要建立新的自訂模式 VPC 網路,請執行 gcloud compute networks create 指令

    如要在這個網路的任何子網路上設定內部 IPv6 範圍,請使用 --enable-ula-internal-ipv6 標記。這個選項會從 Google Cloud 用於內部 IPv6 子網路範圍的 fd20::/20 範圍中,指派 /48 ULA 前置字串。如果您想選取已指派的 /48 IPv6 範圍,請使用 --internal-ipv6-range 標記指定範圍。

    gcloud compute networks create lb-network-dual-stack \
     --subnet-mode=custom \
     --enable-ula-internal-ipv6 \
     --internal-ipv6-range=ULA_IPV6_RANGE \
     --bgp-routing-mode=regional
    

    ULA_IPV6_RANGE 替換為 Google 用於內部 IPv6 子網路範圍的 fd20::/20 範圍內的 /48 前置字元。如果您未使用 --internal-ipv6-range 標記,Google 會為網路選取 /48 前置字元,例如 fd20:bc7:9a1c::/48

  2. NETWORK 網路中,為 us-west1 地區的後端建立子網路,並為 europe-west1 地區的全球存取權測試建立另一個子網路。

    如要建立子網路,請執行 gcloud compute networks subnets create 指令

    gcloud compute networks subnets create lb-subnet \
     --network=lb-network-dual-stack \
     --range=10.1.2.0/24 \
     --region=us-west1 \
     --stack-type=IPV4_IPV6 \
     --ipv6-access-type=INTERNAL
    
    gcloud compute networks subnets create europe-subnet \
     --network=lb-network-dual-stack \
     --range=10.3.4.0/24 \
     --region=europe-west1 \
     --stack-type=IPV4_IPV6 \
     --ipv6-access-type=INTERNAL
    

API

建立新的自訂模式 VPC 網路。

如要在這個網路的任何子網路上設定內部 IPv6 範圍,請將 enableUlaInternalIpv6 設為 true。這個選項會從 Google 用於內部 IPv6 子網路範圍的 fd20::/20 範圍中,指派 /48 範圍。如果您想選取要指派的 /48 IPv6 範圍,請使用 internalIpv6Range 欄位指定範圍。

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
 {
   "autoCreateSubnetworks": false,
   "name": "lb-network-dual-stack",
   "mtu": MTU,
   "enableUlaInternalIpv6": true,
   "internalIpv6Range": "ULA_IPV6_RANGE",
   "routingConfig": {
   "routingMode": "DYNAMIC_ROUTING_MODE"
  }
 }
 

更改下列內容:

  • PROJECT_ID:建立 VPC 網路的專案 ID。
  • MTU:網路的最大傳輸單位。MTU 可以是 1460 (預設) 或 1500。請先詳閱最大傳輸單位總覽,再將 MTU 設為 1500
  • ULA_IPV6_RANGE:Google 用於內部 IPv6 子網路範圍的 fd20::/20 範圍內 /48 前置碼。如果您未提供 internalIpv6Range 的值,Google 會為網路選取 /48 前置字串。
  • DYNAMIC_ROUTING_MODE:可使用 globalregional 控制網路中 Cloud Router 的路由廣告行為。詳情請參閱動態轉送模式

    詳情請參閱 networks.insert 方法

subnetworks.insert 方法提出兩項 POST 要求。

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
 {
   "ipCidrRange": "10.1.2.0/24",
   "network": "lb-network-dual-stack",
   "name": "lb-subnet"
   "stackType": IPV4_IPV6,
   "ipv6AccessType": Internal
 }
 

 POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
 {
   "ipCidrRange": "10.3.4.0/24",
   "network": "lb-network-dual-stack",
   "name": "europe-subnet"
   "stackType": IPV4_IPV6,
   "ipv6AccessType": Internal
 }
 

設定防火牆規則

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

  • fw-allow-lb-access:輸入規則,適用於虛擬私人雲端網路中的所有目標,允許來源在 10.1.2.0/2410.3.4.0/24 範圍內的流量。這項規則允許來自這兩個子網路的任何用戶端的傳入流量。之後,您可以設定及測試全域存取權

  • fw-allow-lb-access-ipv6:輸入規則,適用於虛擬私人雲端網路中的所有目標,允許來源在子網路中設定的 IPv6 範圍內的流量。這項規則允許來自這兩個子網路中任何用戶端的 IPv6 流量。之後,您可以設定及測試全域存取權

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

  • fw-allow-health-check:輸入規則,適用於要進行負載平衡的執行個體,允許來自 Google Cloud 健康檢查系統 (130.211.0.0/2235.191.0.0/16) 的流量。這個範例會使用目標標記 allow-health-check 來辨識應套用此規則的執行個體。

  • fw-allow-health-check-ipv6:輸入規則,適用於要進行負載平衡的執行個體,允許來自 Google Cloud 健康狀態檢查系統 (2600:2d00:1:b029::/64) 的流量。這個範例會使用目標標記 allow-health-check-ipv6 來辨識應套用此規則的執行個體。

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

主控台

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

    前往「防火牆政策」

  2. 如要建立允許子網路流量的規則,請按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-lb-access
    • Network (網路):lb-network-dual-stack
    • Priority (優先順序):1000
    • 流量方向ingress
    • 相符時執行的動作allow
    • 「Targets」(目標)All instances in the network
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):10.1.2.0/2410.3.4.0/24
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  3. 按一下 [建立]。

  4. 如要允許 IPv6 子網路流量,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-lb-access-ipv6
    • Network (網路):lb-network-dual-stack
    • Priority (優先順序):1000
    • 流量方向ingress
    • 相符時執行的動作allow
    • 「Targets」(目標)All instances in the network
    • Source filter (來源篩選器):IPv6 範圍
    • 來源 IPv6 範圍lb-subnet 中指派的 IPV6_ADDRESS
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  5. 按一下 [建立]。

  6. 如要允許連入 SSH 連線,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network-dual-stack
    • Priority (優先順序):1000
    • 流量方向ingress
    • 「Action on match」(相符時執行的動作)allow
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-ssh
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • Protocols and ports:選取「Specified protocols and ports」,勾選「TCP」核取方塊,然後在「Ports」中輸入 22
  7. 按一下 [建立]。

  8. 如要允許 Google Cloud IPv6 健康狀態檢查,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-health-check-ipv6
    • Network (網路):lb-network-dual-stack
    • Priority (優先順序):1000
    • 流量方向ingress
    • 「Action on match」(相符時執行的動作)allow
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check-ipv6
    • Source filter (來源篩選器):IPv6 範圍
    • 來源 IPv6 範圍2600:2d00:1:b029::/64
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  9. 按一下 [建立]。

  10. 如要允許 Google Cloud 健康狀態檢查,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-health-check
    • Network (網路):lb-network-dual-stack
    • Priority (優先順序):1000
    • 流量方向ingress
    • 「Action on match」(相符時執行的動作)allow
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):130.211.0.0/2235.191.0.0/16
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  11. 按一下 [建立]。

gcloud

  1. 建立 fw-allow-lb-access 防火牆規則,允許與子網路進行通訊:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24,10.3.4.0/24 \
        --rules=all
    
  2. 建立 fw-allow-lb-access-ipv6 防火牆規則,允許與子網路進行通訊:

    gcloud compute firewall-rules create fw-allow-lb-access-ipv6 \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --source-ranges=IPV6_ADDRESS \
        --rules=all
    

    IPV6_ADDRESS 替換為 lb-subnet 中指派的 IPv6 位址。

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

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  4. 建立 fw-allow-health-check-ipv6 規則,允許Google Cloud IPv6 健康狀態檢查。

    gcloud compute firewall-rules create fw-allow-health-check-ipv6 \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check-ipv6 \
        --source-ranges=2600:2d00:1:b029::/64 \
        --rules=tcp,udp
    
  5. 建立 fw-allow-health-check 規則,允許 Google Cloud健康狀態檢查。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network-dual-stack \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

API

  1. firewalls.insert 方法發出 POST 要求,建立 fw-allow-lb-access 防火牆規則。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    
    {
    "name": "fw-allow-lb-access",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
    "priority": 1000,
    "sourceRanges": [
      "10.1.2.0/24", "10.3.4.0/24"
    ],
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      },
      {
        "IPProtocol": "icmp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    
  2. firewalls.insert 方法發出 POST 要求,建立 fw-allow-lb-access-ipv6 防火牆規則。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    
    {
     "name": "fw-allow-lb-access-ipv6",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
     "priority": 1000,
     "sourceRanges": [
       "IPV6_ADDRESS"
     ],
     "allowed": [
       {
          "IPProtocol": "tcp"
        },
        {
          "IPProtocol": "udp"
        },
        {
          "IPProtocol": "icmp"
        }
     ],
     "direction": "INGRESS",
     "logConfig": {
        "enable": false
     },
     "disabled": false
    }
    

    IPV6_ADDRESS 替換為 lb-subnet 中指派的 IPv6 位址。

  3. firewalls.insert 方法發出 POST 要求,建立 fw-allow-ssh 防火牆規則。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    
    {
    "name": "fw-allow-ssh",
         "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
    "priority": 1000,
    "sourceRanges": [
      "0.0.0.0/0"
    ],
    "targetTags": [
      "allow-ssh"
    ],
    "allowed": [
     {
       "IPProtocol": "tcp",
       "ports": [
         "22"
       ]
     }
    ],
    "direction": "INGRESS",
    "logConfig": {
     "enable": false
    },
    "disabled": false
    }
    
  4. firewalls.insert 方法發出 POST 要求,建立 fw-allow-health-check-ipv6 防火牆規則。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    
    {
    "name": "fw-allow-health-check-ipv6",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
    "priority": 1000,
    "sourceRanges": [
      "2600:2d00:1:b029::/64"
    ],
    "targetTags": [
      "allow-health-check-ipv6"
    ],
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    
  5. firewalls.insert 方法發出 POST 要求,建立 fw-allow-health-check 防火牆規則。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    
    {
    "name": "fw-allow-health-check",
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
    "priority": 1000,
    "sourceRanges": [
      "130.211.0.0/22",
      "35.191.0.0/16"
    ],
    "targetTags": [
      "allow-health-check"
    ],
    "allowed": [
      {
        "IPProtocol": "tcp"
      },
      {
        "IPProtocol": "udp"
      },
      {
        "IPProtocol": "icmp"
      }
    ],
    "direction": "INGRESS",
    "logConfig": {
      "enable": false
    },
    "disabled": false
    }
    

建立後端 VM 和執行個體群組

本範例使用兩個「非代管」執行個體群組,每個群組都包含兩個後端 (伺服器) VM。為了示範內部直通式網路負載平衡器的區域性質,這兩個執行個體群組是放在不同的區域 us-west1-aus-west1-c 中。

  • 執行個體群組 ig-a 包含以下兩個 VM:
    • vm-a1
    • vm-a2
  • 執行個體群組 ig-c 包含以下兩個 VM:
    • vm-c1
    • vm-c2

傳輸至以上四個後端 VM 的流量都已達到負載平衡。

為了支援這個範例和其他設定選項,四個 VM 各自執行 Apache 網路伺服器,並監聽下列 TCP 連接埠:808008808080884438443

每個 VM 都會獲指派 lb-subnet 中的內部 IP 位址和臨時外部 (公開) IP 位址。您可以稍後移除外部 IP 位址

雖然後端 VM 的外部 IP 位址並非必要,但對於本範例來說,它們非常實用,因為它們允許後端 VM 從網際網路下載 Apache,並且可以透過 SSH 進行連線

根據預設,Apache 會設定為繫結至任何 IP 位址。內部直通式網路負載平衡器會透過保留目的地 IP 來傳遞封包。

請確認在後端 VM 上執行的伺服器軟體正在監聽負載平衡器內部轉送規則的 IP 位址。如果您設定了多個內部轉送規則,請確保您的軟體會監聽與每個規則相關聯的內部 IP 位址。由內部直通式網路負載平衡器傳遞至後端 VM 的封包目的地 IP 位址是轉送規則的內部 IP 位址。

如果您使用的是代管執行個體群組,請確認子網路堆疊類型與代管執行個體群組使用的執行個體範本堆疊類型相符。如果代管執行個體群組使用雙層堆疊執行個體範本,則子網路必須是雙層堆疊。

為方便說明,這些後端 VM 會執行 Debian GNU/Linux 12。

主控台

建立後端 VM

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

    前往 VM 執行個體

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

    • 名稱:vm-a1,區域:us-west1-a
    • 名稱:vm-a2,區域:us-west1-a
    • 名稱:vm-c1,區域:us-west1-c
    • 名稱:vm-c2,區域:us-west1-c
  3. 點選「建立執行個體」

  4. 按照步驟 2 指定的名稱設定「Name」(名稱)

  5. 在「Region」中選取 us-west1,然後選擇步驟 2 列出的「Zone」

  6. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Change」變更圖片。

  7. 點選「進階選項」

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

    1. 在「Network tags」(網路標記) 中輸入 allow-sshallow-health-check-ipv6
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network-dual-stack
      • Subnet (子網路):lb-subnet
      • IP 堆疊類型IPv4 和 IPv6 (雙重堆疊)
      • 主要內部 IPv4 位址臨時 (自動)
      • 外部 IPv4 位址臨時
    3. 按一下「Management」(管理),然後在「Startup script」(開機指令碼) 欄位中輸入下列指令碼。四個 VM 的指令碼內容完全相同。

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  9. 按一下 [建立]。

建立執行個體群組

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

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

  2. 使用下列組合,重複以下的步驟來建立兩個非代管執行個體群組,每個非代管執行個體群組各包含兩個 VM。

    • 執行個體群組名稱:ig-a,區域:us-west1-a,VM:vm-a1vm-a2
    • 執行個體群組名稱:ig-c,區域:us-west1-c,VM:vm-c1vm-c2
  3. 點選「建立執行個體群組」

  4. 按一下「New unmanaged instance group」(新增非代管的執行個體群組)

  5. 按照步驟 2 指定的名稱設定「Name」(名稱)

  6. 在「Location」(位置) 區段,為「Region」(區域) 選取 us-west1,然後選擇步驟 2 列出的「Zone」(可用區)

  7. 在「Network」(網路) 中選取 lb-network-dual-stack

  8. 在「Subnetwork」(子網路) 中,選取 lb-subnet

  9. 在「VM instances」(VM 執行個體) 區段中,按照步驟 2 指定的 VM 新增 VM。

  10. 按一下 [建立]。

gcloud

  1. 如要建立四個 VM,請使用下列四個 [VM-NAME][ZONE] 組合,執行 gcloud compute instances create 指令四次。四個 VM 的指令碼內容完全相同。

    • VM-NAMEvm-a1ZONEus-west1-a
    • VM-NAMEvm-a2ZONEus-west1-a
    • VM-NAMEvm-c1ZONEus-west1-c
    • VM-NAMEvm-c2ZONEus-west1-c

      gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check-ipv6 \
        --subnet=lb-subnet \
        --stack-type=IPV4_IPV6 \
        --metadata=startup-script='#! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed'
      
  2. 在每個區域中建立兩個非代管執行個體群組:

    gcloud compute instance-groups unmanaged create ig-a \
        --zone=us-west1-a
    gcloud compute instance-groups unmanaged create ig-c \
        --zone=us-west1-c
    
  3. 將 VM 新增至適當的執行個體群組:

    gcloud compute instance-groups unmanaged add-instances ig-a \
        --zone=us-west1-a \
        --instances=vm-a1,vm-a2
    gcloud compute instance-groups unmanaged add-instances ig-c \
        --zone=us-west1-c \
        --instances=vm-c1,vm-c2
    

API

針對四個 VM,請使用以下 VM 名稱和區域:

  • VM-NAMEvm-a1ZONEus-west1-a
  • VM-NAMEvm-a2ZONEus-west1-a
  • VM-NAMEvm-c1ZONEus-west1-c
  • VM-NAMEvm-c2ZONEus-west1-c

您可以執行下列 gcloud 指令,取得目前的 DEBIAN_IMAGE_NAME

gcloud compute images list \
 --filter="family=debian-12"

instances.insert 方法發出四個 POST 要求,建立四個後端 VM:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
 "name": "VM-NAME",
 "tags": {
   "items": [
     "allow-health-check-ipv6",
     "allow-ssh"
   ]
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/[ZONE]/machineTypes/e2-standard-2",
 "canIpForward": false,
 "networkInterfaces": [
   {
     "stackType": "IPV4_IPV6",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
     "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
     "accessConfigs": [
       {
         "type": "ONE_TO_ONE_NAT",
         "name": "external-nat",
         "networkTier": "PREMIUM"
       }
     ]
   }
 ],
 "disks": [
   {
     "type": "PERSISTENT",
     "boot": true,
     "mode": "READ_WRITE",
     "autoDelete": true,
     "deviceName": "VM-NAME",
     "initializeParams": {
       "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
       "diskType": "projects/PROJECT_ID/zones/zone/diskTypes/pd-standard",
       "diskSizeGb": "10"
     }
   }
 ],
 "metadata": {
   "items": [
     {
       "key": "startup-script",
       "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nfile_ports=\"/etc/apache2/ports.conf\"\nfile_http_site=\"/etc/apache2/sites-available/000-default.conf\"\nfile_https_site=\"/etc/apache2/sites-available/default-ssl.conf\"\nhttp_listen_prts=\"Listen 80\\nListen 8008\\nListen 8080\\nListen 8088\"\nhttp_vh_prts=\"*:80 *:8008 *:8080 *:8088\"\nhttps_listen_prts=\"Listen 443\\nListen 8443\"\nhttps_vh_prts=\"*:443 *:8443\"\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nprt_conf=\"$(cat \"$file_ports\")\"\nprt_conf_2=\"$(echo \"$prt_conf\" | sed \"s|Listen 80|${http_listen_prts}|\")\"\nprt_conf=\"$(echo \"$prt_conf_2\" | sed \"s|Listen 443|${https_listen_prts}|\")\"\necho \"$prt_conf\" | tee \"$file_ports\"\nhttp_site_conf=\"$(cat \"$file_http_site\")\"\nhttp_site_conf_2=\"$(echo \"$http_site_conf\" | sed \"s|*:80|${http_vh_prts}|\")\"\necho \"$http_site_conf_2\" | tee \"$file_http_site\"\nhttps_site_conf=\"$(cat \"$file_https_site\")\"\nhttps_site_conf_2=\"$(echo \"$https_site_conf\" | sed \"s|_default_:443|${https_vh_prts}|\")\"\necho \"$https_site_conf_2\" | tee \"$file_https_site\"\nsystemctl restart apache2"
     }
   ]
 },
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

instanceGroups.insert 方法發出 POST 要求,建立兩個執行個體群組。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups

{
 "name": "ig-a",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
 "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups

{
 "name": "ig-c",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
 "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
}

instanceGroups.addInstances 方法提出 POST 要求,將執行個體新增至每個執行個體群組。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a/addInstances

{
 "instances": [
   {
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1",
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a2"
   }
 ]
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c/addInstances

{
 "instances": [
   {
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c1",
     "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c2"
   }
 ]
}

設定負載平衡器元件

以下步驟會設定所有內部直通式網路負載平衡器元件,先從健康狀態檢查和後端服務開始,然後再設定前端元件:

  • 健康狀態檢查:在本範例中,您使用 HTTP 健康狀態檢查,檢查 HTTP 200 (OK) 回應。詳情請參閱內部轉送網路負載平衡器總覽的健康狀態檢查一節

  • 後端服務:由於需要透過內部負載平衡器傳送 HTTP 流量,因此必須使用 TCP,而非 UDP。

  • 轉送規則:這個範例會為 IPv4 和 IPv6 流量建立兩個內部轉送規則。

  • 內部 IP 位址:在這個範例中,您需要在建立 IPv4 轉送規則時指定內部 IP 位址 10.1.2.99。詳情請參閱「內部 IP 位址」。雖然您可以選擇要設定哪個 IPv4 位址,但系統會自動指派 IPv6 位址。

主控台

開始設定

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

    前往「負載平衡」

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

在「Create internal passthrough Network Load Balancer」(建立內部直通式網路負載平衡器) 頁面中,輸入下列資訊:

  • 負載平衡器名稱be-ilb
  • 區域us-west1
  • Network (網路):lb-network-dual-stack

後端設定

  1. 按一下「後端設定」
  2. 在「Backends」的「New Backend」部分,將「IP stack type」設為「IPv4 和 IPv6 (雙重堆疊)」
  3. 在「Instance group」(執行個體群組) 中,選取 ig-a 執行個體群組,然後按一下「Done」(完成)
  4. 按一下「新增後端」,然後重複執行新增 ig-c 的步驟。
  5. 在「Health check」(健康狀態檢查) 清單中,選取「Create a health check」(建立健康狀態檢查),輸入下列資訊,然後按一下「Save」(儲存)
    • 名稱hc-http-80
    • 範圍區域性
    • 「Protocol」HTTP
    • Port80
    • Proxy protocol (Proxy 通訊協定):NONE
    • Request path (要求路徑):/
  6. 確認「後端設定」旁是否有藍色勾號。

前端設定

  1. 按一下 [Frontend configuration] (前端設定)。在「New Frontend IP and port」部分中,執行下列操作:
    1. 在「Name」(名稱) 中輸入 fr-ilb-ipv6
    2. 如要處理 IPv6 流量,請執行下列操作:
      1. 在「IP 版本」部分,選取「IPv6」
      2. 在「Subnetwork」(子網路) 中,選取 lb-subnet。轉送規則中的 IPv6 位址範圍一律為臨時位址。
      3. 在「Ports」中,選取「Multiple」,然後在「Port number」欄位中輸入 80800880808088
      4. 按一下 [完成]
    3. 如要處理 IPv4 流量,請按照下列步驟操作:
      1. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)
      2. 在「Name」(名稱) 中輸入 fr-ilb
      3. 在「Subnetwork」(子網路) 中,選取 lb-subnet
      4. 在「Internal IP purpose」(內部 IP 用途) 區段中,從「IP address」(IP 位址) 清單中選取「Create IP address」(建立 IP 位址),輸入下列資訊,然後按一下「Reserve」(保留)
        • 名稱:ip-ilb
        • IP 版本: IPv4
        • Static IP addressLet me choose
        • 自訂 IP 位址: 10.1.2.99
      5. 在「Ports」(通訊埠) 中,選取「Multiple」(多個),然後在「Port numbers」(通訊埠編號) 中輸入 80800880808088
      6. 按一下 [完成]
      7. 繼續操作之前,請先驗證「Frontend configuration」旁是否有藍色勾號。

檢閱設定

  1. 按一下 [Review and finalize] (檢查並完成)。檢查所有設定。
  2. 如果設定正確無誤,請按一下 [Create] (建立)。內部直通式網路負載平衡器的建立作業需要幾分鐘的時間。

gcloud

  1. 建立新的區域 HTTP 健康狀態檢查,以測試通訊埠 80 上連至 VM 的 HTTP 連線。

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. 針對 HTTP 流量建立後端服務:

    gcloud compute backend-services create be-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 將兩個執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c
    
  4. 為後端服務建立兩個轉送規則。建立 IPv4 轉送規則時,請為 IPv4 位址的子網路內部 IP 位址指定 10.1.2.99

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    
    gcloud compute forwarding-rules create fr-ilb-ipv6 \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --subnet=lb-subnet \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1 \
        --ip-version=IPV6
    

API

regionHealthChecks.insert 方法發出 POST 要求,建立健康狀態檢查。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionHealthChecks

{
"name": "hc-http-80",
"type": "HTTP",
"httpHealthCheck": {
  "port": 80
}
}

regionBackendServices.insert 方法發出 POST 要求,建立區域後端服務。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices

{
"name": "be-ilb",
"backends": [
  {
    "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a",
    "balancingMode": "CONNECTION"
  },
  {
    "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c",
    "balancingMode": "CONNECTION"
  }
],
"healthChecks": [
  "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80"
],
"loadBalancingScheme": "INTERNAL",
"connectionDraining": {
  "drainingTimeoutSec": 0
 }
}

forwardingRules.insert 方法發出 POST 要求,建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb-ipv6",
"IPProtocol": "TCP",
"ports": [
  "80", "8008", "8080", "8088"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"ipVersion": "IPV6",
"networkTier": "PREMIUM"
}

forwardingRules.insert 方法發出 POST 要求,建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"ports": [
  "80", "8008", "8080", "8088"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

測試負載平衡器

如要測試負載平衡器,請在與負載平衡器相同的地區中建立用戶端 VM,然後從用戶端傳送流量至負載平衡器。

建立用戶端 VM

本範例會在與後端 (伺服器) VM 相同的地區中建立用戶端 VM (vm-client)。該用戶端用於驗證負載平衡器的設定,以及示範「測試」一節中所述的預期行為。

主控台

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

    前往 VM 執行個體

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

  3. 在「Name」(名稱) 中輸入 vm-client

  4. 在「區域」部分,選取 us-west1

  5. 在「可用區」部分,選取 us-west1-a

  6. 點選「進階選項」

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

    1. 在「網路標記」中輸入 allow-ssh
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network-dual-stack
      • 「Subnet」(子網路)lb-subnet
      • IP 堆疊類型IPv4 和 IPv6 (雙重堆疊)
      • 「Primary internal IP」(主要內部 IP)臨時 (自動)
      • 外部 IP臨時
    3. 按一下 [完成]
  8. 按一下 [建立]。

gcloud

用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用該地區中的任何子網路。在本範例中,用戶端位於 us-west1-a 區域,並使用與後端 VM 相同的子網路。

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --stack-type=IPV4_IPV6 \
    --tags=allow-ssh \
    --subnet=lb-subnet

API

instances.insert 方法提出 POST 要求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances

{
 "name": "vm-client",
 "tags": {
   "items": [
     "allow-ssh"
   ]
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2",
 "canIpForward": false,
 "networkInterfaces": [
   {
     "stackType": "IPV4_IPV6",
     "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack",
     "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
     "accessConfigs": [
       {
         "type": "ONE_TO_ONE_NAT",
         "name": "external-nat",
         "networkTier": "PREMIUM"
       }
     ]
   }
 ],
 "disks": [
   {
     "type": "PERSISTENT",
     "boot": true,
     "mode": "READ_WRITE",
     "autoDelete": true,
     "deviceName": "vm-client",
     "initializeParams": {
       "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
       "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard",
       "diskSizeGb": "10"
     }
   }
 ],
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

測試連線

這項測試會從不同的用戶端 VM 與負載平衡器聯絡;也就是說,不是從負載平衡器的後端 VM 進行聯絡。預期的行為是要在四個後端 VM 之間分配流量。

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 說明 IPv6 轉送規則 fr-ilb-ipv6。請注意說明中的 IPV6_ADDRESS

    gcloud compute forwarding-rules describe fr-ilb-ipv6 --region=us-west1
    
  3. 說明 IPv4 轉送規則 fr-ilb

    gcloud compute forwarding-rules describe fr-ilb --region=us-west1
    
  4. 在具備 IPv6 連線能力的用戶端上執行下列指令:

    $ curl -m 10 -s http://IPV6_ADDRESS:80
    

    舉例來說,如果指派的 IPv6 位址為 [fd20:1db0:b882:802:0:46:0:0/96]:80,指令應如下所示:

    $  curl -m 10 -s http://[fd20:1db0:b882:802:0:46:0:0]:80
    
  5. 在具備 IPv4 連線能力的用戶端上,執行下列指令:

    $ curl -m 10 -s http://10.1.2.99:80
    

    將預留位置替換為有效值:

    • IPV6_ADDRESSfr-ilb-ipv6 轉送規則中的臨時 IPv6 位址。

設定僅限 IPv6 子網路和後端的負載平衡器

本文件說明如何設定及測試僅支援 IPv6 流量的內部直通式網路負載平衡器。本節中的步驟說明如何設定以下項目:

  1. 名為 lb-network-ipv6-only 的自訂模式虛擬私有雲網路。IPv6 流量需要自訂模式子網路
  2. 內部 僅限 IPv6 子網路,名稱為 lb-subnet-ipv6-only (stack-type 設為 IPv6_ONLY),僅限 IPv6 流量需要這個子網路。
  3. 允許連入連線到後端 VM 的防火牆規則。
  4. 後端執行個體群組,位於本範例的以下區域和子網路:
    • 區域:us-west1
    • 子網路:lb-subnet-ipv6-only系統會自動指派子網路的 IPv6 位址範圍。Google 提供固定大小 (/64) 的 IPv6 CIDR 區塊。
  5. 四個後端 僅限 IPv6 VM:us-west1-a 區域中非代管執行個體群組中的兩個 VM,以及 us-west1-c 區域中非代管執行個體群組中的兩個 VM。
  6. 後端 VM 上的 IPv6 TCP 伺服器。伺服器會在負載平衡器轉送規則的指定 VIP 和指定網路介面上,監聽傳入的連線。伺服器會接受傳入的用戶端連線、傳送回應,然後關閉連線。
  7. 一個用來測試連線的用戶端 VM。
  8. 以下內部直通式網路負載平衡器元件:
    • 一個用於後端服務的健康狀態檢查
    • 一個位於 us-west1 地區的內部後端服務,用於管理兩個區域性執行個體群組之間的連線分配
    • IPv6 轉送規則

設定網路、地區和子網路

本頁所述的內部直通式網路負載平衡器範例,是在名為 lb-network-ipv6-only自訂模式 VPC 網路中建立。

如要設定內部 IPv6 範圍的子網路,請啟用虛擬私有雲網路 ULA 內部 IPv6 範圍。內部 IPv6 子網路範圍會從這個範圍分配。

稍後,在本文件的「使用啟動 Bash 指令碼在後端 VM 上安裝 IPv6 TCP 伺服器」一節中,我們會使用內部 IPv6 子網路範圍建立路由規則,藉此將來自虛擬私有雲子網路的流量,透過指定的閘道和網路介面進行路由。

主控台

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

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

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

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

  4. 如要在這個網路的子網路上設定內部 IPv6 位址範圍,請完成下列步驟:

    1. 在「私人 IPv6 位址設定」部分,選取「為這個 VPC 網路設定 ULA 內部 IPv6 範圍」
    2. 在「Allocate internal IPv6 range」(分配內部 IPv6 範圍) 部分,選取「自動」或「手動」。如果您選取「手動」,請在 fd20::/20 範圍內輸入 /48 範圍。如果範圍已在使用中,系統會提示您提供其他範圍。
  5. 在「子網路建立模式」中,選取「自訂」

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

    • Name (名稱):lb-subnet-ipv6-only
    • Region (區域):us-west1
    • IP 堆疊類型IPv6 (單一堆疊)
    • IPv6 存取權類型內部
  7. 按一下 [完成]

  8. 按一下 [建立]。

gcloud

  1. 如要建立新的自訂模式 VPC 網路,請執行 gcloud compute networks create 指令

    如要在這個網路的任何子網路上設定 內部 IPv6 範圍,請使用 --enable-ula-internal-ipv6 標記。

    gcloud compute networks create lb-network-ipv6-only \
      --subnet-mode=custom \
      --enable-ula-internal-ipv6 \
      --bgp-routing-mode=regional
    
  2. ipv6-access-type 設為 INTERNAL,設定子網路。這表示這個子網路中的 VM 只能使用內部 IPv6 位址。如要建立子網路,請執行 gcloud compute networks subnets create 指令

    gcloud compute networks subnets create lb-subnet-ipv6-only \
      --network=lb-network-ipv6-only \
      --region=us-west1 \
      --stack-type=IPV6_ONLY \
      --ipv6-access-type=INTERNAL
    

設定防火牆規則

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

  • fw-allow-lb-access-ipv6-only:輸入規則,適用於虛擬私有雲端網路中的所有目標,允許來自所有 IPv6 來源的流量。

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

  • fw-allow-health-check-ipv6-only:輸入規則,適用於要進行負載平衡的執行個體,允許來自 Google Cloud 健康檢查系統 (2600:2d00:1:b029::/64) 的流量。這個範例會使用目標標記 allow-health-check-ipv6 來辨識必須套用這項規則的執行個體。

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

主控台

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

    前往「防火牆政策」

  2. 如要允許 IPv6 子網路流量,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入以下資訊:

    • Name (名稱):fw-allow-lb-access-ipv6-only
    • Network (網路):lb-network-ipv6-only
    • Priority (優先順序):1000
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「允許」
    • 「Targets」(目標)All instances in the network
    • Source filter (來源篩選器):IPv6 範圍
    • 來源 IPv6 範圍::/0
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  3. 按一下 [建立]。

  4. 如要允許連入 SSH 連線,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入下列資訊:

    • Name (名稱):fw-allow-ssh
    • Network (網路):lb-network-ipv6-only
    • Priority (優先順序):1000
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「Allow」(允許)
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-ssh
    • 來源篩選器IPv4 範圍
    • Source IPv4 ranges (來源 IPv4 範圍):0.0.0.0/0
    • Protocols and ports:選取「Specified protocols and ports」,勾選「TCP」核取方塊,然後在「Ports」中輸入 22
  5. 按一下 [建立]。

  6. 如要允許 Google Cloud IPv6 健康狀態檢查,請再次按一下「Create firewall rule」(建立防火牆規則),然後輸入下列資訊:

    • Name (名稱):fw-allow-health-check-ipv6-only
    • Network (網路):lb-network-ipv6-only
    • Priority (優先順序):1000
    • Direction of traffic (流量方向):「Ingress」(輸入)
    • 「Action on match」(相符時執行的動作)「Allow」(允許)
    • 目標指定的目標標記
    • 「Target tags」(目標標記)allow-health-check-ipv6
    • Source filter (來源篩選器):IPv6 範圍
    • 來源 IPv6 範圍2600:2d00:1:b029::/64
    • 「Protocols and ports」(通訊協定和通訊埠)「Allow all」(全部允許)
  7. 按一下 [建立]。

gcloud

  1. 建立 fw-allow-lb-access-ipv6 防火牆規則,允許與子網路進行通訊:

    gcloud compute firewall-rules create fw-allow-lb-access-ipv6-only \
        --network=lb-network-ipv6-only \
        --action=allow \
        --direction=ingress \
        --source-ranges=::/0 \
        --rules=all
    

    IPV6_ADDRESS 替換為 lb-subnet-ipv6-only 中指派的 IPv6 位址。

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

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network-ipv6-only \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. 建立 fw-allow-health-check-ipv6 規則,允許Google Cloud IPv6 健康狀態檢查。

    gcloud compute firewall-rules create fw-allow-health-check-ipv6-only \
        --network=lb-network-ipv6-only \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check-ipv6 \
        --source-ranges=2600:2d00:1:b029::/64 \
        --rules=tcp,udp
    

建立後端 VM 和執行個體群組

本範例使用兩個「非代管」執行個體群組,每個群組各有兩個後端 VM。為了示範內部直通式網路負載平衡器的區域性質,這兩個執行個體群組是放在不同的區域 us-west1-aus-west1-c 中。

  • 執行個體群組 ig-a 包含以下兩個 VM:
    • vm-a1
    • vm-a2
  • 執行個體群組 ig-c 包含以下兩個 VM:
    • vm-c1
    • vm-c2

傳輸至以上四個後端 VM 的流量都已達到負載平衡。

主控台

建立後端 VM

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

    前往 VM 執行個體

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

    • 名稱:vm-a1,區域:us-west1-a
    • 名稱:vm-a2,區域:us-west1-a
    • 名稱:vm-c1,區域:us-west1-c
    • 名稱:vm-c2,區域:us-west1-c
  3. 點選「建立執行個體」

  4. 按照步驟 2 指定的名稱設定「Name」(名稱)

  5. 在「Region」中選取 us-west1,然後選擇步驟 2 列出的「Zone」

  6. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Change」變更圖片。

  7. 點選「進階選項」

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

    1. 在「Network tags」(網路標記) 中輸入 allow-sshallow-health-check-ipv6
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network-ipv6-only
      • Subnet (子網路):lb-subnet-ipv6-only
      • IP 堆疊類型IPv6 (單一堆疊)
      • 「Primary internal IPv6 address」(主要內部 IPv6 位址)臨時 (自動)
  9. 按一下 [建立]。

後端 VM 需要執行 IPv6 TCP 伺服器,以便監聽傳入的連線。設定負載平衡器後,您可以在後端 VM 上安裝此伺服器。這是因為伺服器指令碼會建立一個套接字,並繫結至負載平衡器的轉送規則。

建立執行個體群組

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

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

  2. 使用下列組合,重複以下的步驟來建立兩個非代管執行個體群組,每個非代管執行個體群組各包含兩個 VM。

    • 執行個體群組名稱:ig-a,區域:us-west1-a,VM:vm-a1vm-a2
    • 執行個體群組名稱:ig-c,區域:us-west1-c,VM:vm-c1vm-c2
  3. 點選「建立執行個體群組」

  4. 按一下「New unmanaged instance group」(新增非代管的執行個體群組)

  5. 按照步驟 2 指定的名稱設定「Name」(名稱)

  6. 在「Location」(位置) 區段,為「Region」(區域) 選取 us-west1,然後選擇步驟 2 列出的「Zone」(可用區)

  7. 在「Network」(網路) 中選取 lb-network-ipv6-only

  8. 在「Subnetwork」(子網路) 中,選取 lb-subnet-ipv6-only

  9. 在「VM instances」(VM 執行個體) 區段中,按照步驟 2 指定的 VM 新增 VM。

  10. 按一下 [建立]。

gcloud

  1. 如要建立四個 VM,請使用下列四個 [VM-NAME][ZONE] 組合,執行 gcloud compute instances create 指令四次。

    • VM-NAMEvm-a1ZONEus-west1-a
    • VM-NAMEvm-a2ZONEus-west1-a
    • VM-NAMEvm-c1ZONEus-west1-c
    • VM-NAMEvm-c2ZONEus-west1-c
    gcloud beta compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check-ipv6 \
        --subnet=lb-subnet-ipv6-only \
        --stack-type=IPV6_ONLY
    

    後端 VM 需要執行 IPv6 TCP 伺服器,以便監聽傳入的連線。設定負載平衡器後,您可以在後端 VM 上安裝此伺服器。這是因為伺服器指令碼會建立一個套接字,並繫結至負載平衡器的轉送規則。

  2. 在每個區域中建立兩個非代管執行個體群組:

    gcloud beta compute instance-groups unmanaged create ig-a \
        --zone=us-west1-a
    gcloud beta compute instance-groups unmanaged create ig-c \
        --zone=us-west1-c
    
  3. 將 VM 新增至適當的執行個體群組:

    gcloud beta compute instance-groups unmanaged add-instances ig-a \
      --zone=us-west1-a \
      --instances=vm-a1,vm-a2
    gcloud beta compute instance-groups unmanaged add-instances ig-c \
      --zone=us-west1-c \
      --instances=vm-c1,vm-c2
    

設定負載平衡器元件

以下步驟會設定所有內部直通式網路負載平衡器元件,先從健康狀態檢查和後端服務開始,然後再設定前端元件:

主控台

開始設定

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

    前往「負載平衡」

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

在「Create internal passthrough Network Load Balancer」(建立內部直通式網路負載平衡器) 頁面中,輸入下列資訊:

  • 負載平衡器名稱ilb-ipv6-only
  • 區域us-west1
  • Network (網路):lb-network-ipv6-only

後端設定

  1. 按一下「後端設定」
  2. 在「Backends」的「New Backend」區段中,將「IP 堆疊類型」設為「IPv6 (單一堆疊)」
  3. 在「Instance group」(執行個體群組) 中,選取 ig-a 執行個體群組,然後按一下「Done」(完成)
  4. 按一下「新增後端」,然後重複執行新增 ig-c 的步驟。
  5. 在「Health check」(健康狀態檢查) 清單中,選取「Create a health check」(建立健康狀態檢查),輸入下列資訊,然後按一下「Save」(儲存)
    • 名稱hc-http-80
    • 範圍區域性
    • 「Protocol」HTTP
    • Port80
    • Proxy protocol (Proxy 通訊協定):NONE
    • Request path (要求路徑):/
  6. 確認「後端設定」旁是否有藍色勾號。

前端設定

  1. 按一下 [Frontend configuration] (前端設定)。在「New Frontend IP and port」部分中,執行以下操作:
    1. 在「Name」(名稱) 中輸入 fr-ilb-ipv6-only
    2. 如要處理 IPv6 流量,請執行下列操作:
      1. 在「IP 版本」中,選取「IPv6」。您將在下一個章節中建立的 IPv6 TCP 伺服器會繫結至轉送規則的 VIP。
      2. 在「Subnetwork」(子網路) 中,選取 lb-subnet-ipv6-only。轉送規則中的 IPv6 位址範圍一律是臨時的。
      3. 在「Ports」(通訊埠) 中,選取「Multiple」(多個),然後在「Port number」(通訊埠號碼) 欄位中輸入 80800880808088
      4. 按一下 [完成]
    3. 繼續操作之前,請先驗證「Frontend configuration」(前端設定)旁是否有藍色勾號。

檢閱設定

  1. 按一下 [Review and finalize] (檢查並完成)。檢查所有設定。
  2. 如果設定正確無誤,請按一下 [Create] (建立)。內部直通式網路負載平衡器的建立作業需要幾分鐘的時間。

gcloud

  1. 建立新的區域 HTTP 健康狀態檢查,以測試通訊埠 80 上連至 VM 的 HTTP 連線。

    gcloud beta compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. 建立後端服務:

    gcloud beta compute backend-services create ilb-ipv6-only \
        --load-balancing-scheme=INTERNAL \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 將兩個執行個體群組新增至後端服務:

    gcloud beta compute backend-services add-backend ilb-ipv6-only \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    
    gcloud beta compute backend-services add-backend ilb-ipv6-only \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c
    
  4. 使用暫時性 IPv6 位址建立 IPv6 轉送規則。

    gcloud beta compute forwarding-rules create fr-ilb-ipv6-only \
        --region=us-west1 \
        --load-balancing-scheme=INTERNAL \
        --subnet=lb-subnet-ipv6-only \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=ilb-ipv6-only \
        --backend-service-region=us-west1 \
        --ip-version=IPV6
    

    您將在下個章節中建立的 IPv6 TCP 伺服器會繫結至轉送規則的 VIP。

使用開機 Bash 指令碼在後端 VM 上安裝 IPv6 TCP 伺服器

在這個範例中,後端 VM 的 Bash 啟動指令碼包含以下內容:

  • 網路指令,用於透過指定閘道和網路介面,將來自子網路的所有傳出封包轉送。
  • Python 伺服器指令碼 (server.py) 是 IPv6 TCP 伺服器,會在指定的 VIP 和網路介面上監聽傳入的連線。它會接受傳入的用戶端連線、傳送回應,然後關閉連線。

您需要在 Bash 指令碼中新增下列詳細資料:

  • 閘道位址
  • 子網路範圍
  • 轉送規則的 VIP
  • 網路介面

您可以在後端 VM 中執行 ip -6 route show table all 指令,找出閘道位址和子網路範圍。如要進一步瞭解啟動 Bash 指令碼中使用的指令,請參閱這個設定的「附錄」一節。

如要在 VM 執行個體中新增開機指令碼,請按照下列步驟操作:

主控台

  1. 在您先前建立的 VM 執行個體清單中,按一下需要更新的 VM 執行個體。

  2. 按一下 [編輯]

  3. 在「Metadata」專區中,在「Startup script」欄位輸入下列指令碼。

    #!/bin/bash
    
    # Replace these with your actual values. Run the 'ip -6 route show table all' command to find the correct values.
    GATEWAY_ADDRESS=fe80::57:2ff:fe36:ffbe
    SUBNET_RANGE=fd20:307:120c:2000::/64
    
    # Add a custom default route to routing table 1.
    # The following command sends packets to the gateway using the network interface named 'ens4'.
    sudo ip route add default via $GATEWAY_ADDRESS dev ens4 table 1
    
    # Add a source-based policy routing rule.
    # The following command adds a rule to route all outgoing packets originating
    # from a specified subnet. If the source address matches the subnet,
    # the system uses the default route defined in table 1 to forward the traffic.
    sudo ip -6 rule add from $SUBNET_RANGE table 1
    
    # Allow the server to bind to a non-local IPv6 address--the VIP of the load balancer.
    sudo sysctl -w net.ipv6.ip_nonlocal_bind=1
    
    # Overview:
    # This script sets up a simple IPv6 TCP server using Python's socket library.
    # The server binds to a specific network interface and listens on a specified Virtual IP (VIP) address and port (default: 80).
    # It accepts incoming client connections, sends a simple response ("Thank you for connecting"), and then closes the connection.
    # Key features:
    # - Uses IPv6 (AF_INET6) for networking.
    # - Binds to a specific network interface using SO_BINDTODEVICE.
    # - Handles multiple client connections in a loop.
    # - Demonstrates basic socket programming concepts like binding, listening, accepting, and sending data.
    # Note: Replace placeholders like 'FORWARDING_RULE_VIP' and 'ens4' with actual values for your setup.
    
    # Write the Python file locally.
    cat << 'EOF' > server.py
    
    # Import the socket library to work with network connections
    import socket
    import urllib.request
    
    # Fetch the VM hostname from Google Cloud metadata server
    def get_vm_hostname():
        url = "http://metadata.google.internal/computeMetadata/v1/instance/name"
        req = urllib.request.Request(url, headers={"Metadata-Flavor": "Google"})
        with urllib.request.urlopen(req) as response:
            return response.read().decode()
    
    vm_hostname = get_vm_hostname()
    
    # Create a socket object for IPv6 and TCP connections
    # AF_INET6 specifies IPv6, SOCK_STREAM specifies TCP
    server_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    
    # Set the SO_REUSEADDR option to allow reusing the address
    # This is useful to avoid "address already in use" errors when restarting the server
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # Specify the network interface to bind the server to
    # Replace "ens4" with the name of your network interface
    interface_name = "ens4"
    # Get the index of the network interface
    interface_index = socket.if_nametoindex(interface_name)
    # Bind the socket to the specified network interface
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface_name.encode())
    
    # Bind the socket to an address and port
    # Replace 'FORWARDING_RULE_VIP' with the actual VIP (Virtual IP) address
    server_address = ('FORWARDING_RULE_VIP', 80, 0, 0)
    server_socket.bind(server_address)
    
    # Start listening for incoming connections
    # The argument '5' specifies the maximum number of queued connections
    server_socket.listen(5)
    
    # Print a message indicating that the server is ready to accept connections
    print(f"Server listening on {server_address}, bound to {interface_name}")
    
    # Serve incoming connections
    while True:
        client_socket, client_address = server_socket.accept()
        print(f"Accepted connection from {client_address}")
    
        # Generate response body
        body = f"Thank you for connecting to {vm_hostname}\n"
    
        # Construct a proper HTTP/1.1 response
        response = (
            "HTTP/1.1 200 OK\r\n"
            f"Content-Length: {len(body)}\r\n"
            "Content-Type: text/plain\r\n"
            "Connection: close\r\n"
            "\r\n"
            f"{body}"
        )
    
        # Send the response and close the connection
        client_socket.sendall(response.encode())
        client_socket.close()
    EOF
    
    # Make the Python script executable
    chmod +x server.py
    
    # Run the server
    sudo python3 server.py
    
    
  4. 按一下 [儲存]

  5. 重新啟動執行個體

gcloud

  1. 建立開機指令碼。

    nano startup.sh
    
  2. 新增下列指令碼並儲存檔案。

    #!/bin/bash
    
    # Replace these with your actual values. Run the 'ip -6 route show table all' command to find the correct values.
    GATEWAY_ADDRESS=fe80::57:2ff:fe36:ffbe
    SUBNET_RANGE=fd20:307:120c:2000::/64
    
    # Add a custom default route to routing table 1.
    # The following command sends packets to the gateway using the network interface named 'ens4'.
    sudo ip route add default via $GATEWAY_ADDRESS dev ens4 table 1
    
    # Add a source-based policy routing rule.
    # The following command adds a rule to route all outgoing packets originating
    # from a specified subnet. If the source address matches the subnet,
    # the system uses the default route defined in table 1 to forward the traffic.
    sudo ip -6 rule add from $SUBNET_RANGE table 1
    
    # Allow the server to bind to a non-local IPv6 address--the VIP of the load balancer.
    sudo sysctl -w net.ipv6.ip_nonlocal_bind=1
    
    # Overview:
    # This script sets up a simple IPv6 TCP server using Python's socket library.
    # The server binds to a specific network interface and listens on a specified Virtual IP (VIP) address and port (default: 80).
    # It accepts incoming client connections, sends a simple response ("Thank you for connecting"), and then closes the connection.
    # Key features:
    # - Uses IPv6 (AF_INET6) for networking.
    # - Binds to a specific network interface using SO_BINDTODEVICE.
    # - Handles multiple client connections in a loop.
    # - Demonstrates basic socket programming concepts like binding, listening, accepting, and sending data.
    # Note: Replace placeholders like 'FORWARDING_RULE_VIP' and 'ens4' with actual values for your setup.
    
    # Write the Python file locally.
    cat << 'EOF' > server.py
    
    # Import the socket library to work with network connections
    import socket
    import urllib.request
    
    # Fetch the VM hostname from Google Cloud metadata server
    def get_vm_hostname():
        url = "http://metadata.google.internal/computeMetadata/v1/instance/name"
        req = urllib.request.Request(url, headers={"Metadata-Flavor": "Google"})
        with urllib.request.urlopen(req) as response:
            return response.read().decode()
    
    vm_hostname = get_vm_hostname()
    
    # Create a socket object for IPv6 and TCP connections
    # AF_INET6 specifies IPv6, SOCK_STREAM specifies TCP
    server_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    
    # Set the SO_REUSEADDR option to allow reusing the address
    # This is useful to avoid "address already in use" errors when restarting the server
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # Specify the network interface to bind the server to
    # Replace "ens4" with the name of your network interface
    interface_name = "ens4"
    # Get the index of the network interface
    interface_index = socket.if_nametoindex(interface_name)
    # Bind the socket to the specified network interface
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface_name.encode())
    
    # Bind the socket to an address and port
    # Replace 'FORWARDING_RULE_VIP' with the actual VIP (Virtual IP) address
    server_address = ('FORWARDING_RULE_VIP', 80, 0, 0)
    server_socket.bind(server_address)
    
    # Start listening for incoming connections
    # The argument '5' specifies the maximum number of queued connections
    server_socket.listen(5)
    
    # Print a message indicating that the server is ready to accept connections
    print(f"Server listening on {server_address}, bound to {interface_name}")
    
    # Serve incoming connections
    while True:
        client_socket, client_address = server_socket.accept()
        print(f"Accepted connection from {client_address}")
    
        # Generate response body
        body = f"Thank you for connecting to {vm_hostname}\n"
    
        # Construct a proper HTTP/1.1 response
        response = (
            "HTTP/1.1 200 OK\r\n"
            f"Content-Length: {len(body)}\r\n"
            "Content-Type: text/plain\r\n"
            "Connection: close\r\n"
            "\r\n"
            f"{body}"
        )
    
        # Send the response and close the connection
        client_socket.sendall(response.encode())
        client_socket.close()
    EOF
    
    # Make the Python script executable
    chmod +x server.py
    
    # Run the server
    sudo python3 server.py
    
    
  3. 將中繼資料檔案新增至 VM 執行個體。

    gcloud compute instances add-metadata VM-NAME \
      --metadata-from-file=startup-script=startup.sh
    
  4. 重新啟動執行個體

測試負載平衡器

如要測試負載平衡器,請在與負載平衡器相同的地區中建立用戶端 VM,然後從用戶端傳送流量至負載平衡器。

建立用戶端 VM

本範例會在與後端 (伺服器) VM 相同的地區中建立用戶端 VM (vm-client)。該用戶端用於驗證負載平衡器的設定,以及示範測試一節中所述的預期行為。

主控台

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

    前往 VM 執行個體

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

  3. 在「Name」(名稱) 中輸入 vm-client

  4. 在「區域」部分,選取 us-west1

  5. 在「可用區」部分,選取 us-west1-a

  6. 點選「進階選項」

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

    1. 在「網路標記」中輸入 allow-ssh
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network-ipv6-only
      • 「Subnet」(子網路)lb-subnet-ipv6-only
      • IP 堆疊類型IPv6 (單一堆疊)
    3. 按一下 [完成]
  8. 按一下 [建立]。

gcloud

用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用該地區中的任何子網路。在本範例中,用戶端位於 us-west1-a 區域,並使用與後端 VM 相同的子網路。

gcloud beta compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --stack-type=IPV6_ONLY \
    --tags=allow-ssh \
    --subnet=lb-subnet-ipv6-only

測試連線

這項測試會從不同的用戶端 VM 與負載平衡器聯絡;也就是說,不是從負載平衡器的後端 VM 進行聯絡。預期的行為是要在四個後端 VM 之間分配流量。

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

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 說明 IPv6 轉送規則 fr-ilb-ipv6-only。請注意說明中的 IPV6_ADDRESS

    gcloud beta compute forwarding-rules describe fr-ilb-ipv6-only \
        --region=us-west1
    
  3. 在具備 IPv6 連線能力的用戶端上執行下列指令:

    curl http://IPV6_ADDRESS:80
    

    舉例來說,如果指派的 IPv6 位址為 [fd20:307:120c:2000:0:1:0:0/96]:80,指令應如下所示:

    curl http://[fd20:307:120c:2000:0:1:0:0]:80
    

額外設定選項

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

啟用全域存取權

您可以為內部直通式網路負載平衡器範例啟用全域存取權,讓所有區域中的用戶端都能存取。示例負載平衡器的後端仍必須位於同一個區域 (us-west1)。

內部直通式網路負載平衡器,具有全域存取權。
內部直通式網路負載平衡器 (具有全球存取權) (按一下可放大)。

如要設定全域存取權,請進行下列設定變更。

主控台

編輯負載平衡器的轉送規則

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

    前往「負載平衡」

  2. 在「Name」欄中,按一下內部直通式網路負載平衡器。範例負載平衡器的名稱為 be-ilb

  3. 按一下「前端設定」

  4. 按一下「編輯」圖示

  5. 在「全域存取權」下方,選取「啟用」

  6. 按一下 [完成]

  7. 按一下「更新」

在「Load balancer details」(負載平衡器詳細資料) 頁面上,確認前端設定顯示「Regional (REGION) with global access」(區域性 (REGION) 具有全域存取權)

gcloud

  1. 更新範例負載平衡器的轉送規則 fr-ilb,加入 --allow-global-access 旗標。

    gcloud compute forwarding-rules update fr-ilb \
       --region=us-west1 \
       --allow-global-access
    
  2. 您可以使用 forwarding-rules describe 指令,判斷轉送規則是否已啟用全域存取權。例如:

    gcloud compute forwarding-rules describe fr-ilb \
       --region=us-west1 \
       --format="get(name,region,allowGlobalAccess)"
    

    啟用全域存取權後,輸出內容會在轉送規則的名稱和地區後方顯示 True 字樣。

API

forwardingRules/patch 方法提出 PATCH 要求。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

{
"allowGlobalAccess": true
}

建立 VM 用戶端來測試全域存取權

主控台

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

    前往 VM 執行個體

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

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

  4. 將「區域」設為 europe-west1

  5. 將「可用區」設為 europe-west1-b

  6. 點選「進階選項」

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

    1. 在「網路標記」中輸入 allow-ssh
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • 「Subnet」(子網路)europe-subnet
  8. 按一下 [建立]。

gcloud

用戶端 VM 可以位於與負載平衡器相同地區的任何區域中,也可以使用該地區中的任何子網路。在本範例中,用戶端位於 europe-west1-b 區域,並使用與後端 VM 相同的子網路。

gcloud compute instances create vm-client2 \
    --zone=europe-west1-b \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=europe-subnet

API

instances.insert 方法提出 POST 要求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/europe-west1-b/instances

{
"name": "vm-client2",
"tags": {
  "items": [
    "allow-ssh"
  ]
},
"machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/europe-west1-b/machineTypes/e2-standard-2",
"canIpForward": false,
"networkInterfaces": [
  {
    "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
    "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks/europe-subnet",
    "accessConfigs": [
      {
        "type": "ONE_TO_ONE_NAT",
        "name": "external-nat",
        "networkTier": "PREMIUM"
      }
    ]
  }
],
"disks": [
  {
    "type": "PERSISTENT",
    "boot": true,
    "mode": "READ_WRITE",
    "autoDelete": true,
    "deviceName": "vm-client2",
    "initializeParams": {
      "sourceImage": "projects/debian-cloud/global/images/debian-image-name",
      "diskType": "projects/PROJECT_ID/zones/europe-west1-b/diskTypes/pd-standard",
      "diskSizeGb": "10"
    }
  }
],
"scheduling": {
  "preemptible": false
},
"deletionProtection": false
}

連線至 VM 用戶端並測試連線功能

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

  gcloud compute ssh vm-client2 --zone=europe-west1-b
  

請在所有設定的通訊埠上測試能否連線至負載平衡器,就像您從 us-west1 區域的 vm-client 進行測試一樣。請在轉送規則中設定的四個通訊埠上測試 HTTP 連線:

  curl http://10.1.2.99
  curl http://10.1.2.99:8008
  curl http://10.1.2.99:8080
  curl http://10.1.2.99:8088
  

設定代管執行個體群組

範例設定建立了兩個非代管執行個體群組。您可以改為使用代管執行個體群組 (包括區域和地區性代管執行個體群組) 做為內部轉送網路負載平衡器的後端。

代管執行個體群組需要您建立執行個體範本。本程序說明如何使用單一地區性代管執行個體群組來取代範例中的兩個區域性非代管執行個體群組。地區性代管執行個體群組會自動在該地區的多個區域中建立 VM,使得在區域之間分配實際工作環境流量更加容易。

代管執行個體群組也支援自動調度資源自動修復功能。如果您將自動調度資源功能與內部直通式網路負載平衡器搭配使用,則無法根據負載平衡進行資源調度。

本程序會說明如何修改範例內部直通式網路負載平衡器的後端服務,以便使用區域性代管執行個體群組。

主控台

執行個體範本

  1. 前往 Google Cloud 控制台的「VM instance templates」(VM 執行個體範本) 頁面。

    前往 VM 執行個體範本

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

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

  4. 選擇機器類型

  5. 在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Change」變更圖片。

  6. 點選「進階選項」

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

    1. 在「Network tags」(網路標記) 中輸入 allow-sshallow-health-check
    2. 在「網路介面」中,選取下列項目:
      • Network (網路):lb-network
      • Subnet (子網路):lb-subnet
  8. 按一下「Management」(管理),然後在「Startup script」(開機指令碼) 欄位中輸入下列指令碼:

    #! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed
    
  9. 按一下 [建立]。

代管執行個體群組

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

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

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

  3. 將「Name」(名稱) 設為 ig-ilb

  4. 針對「Location」(位置),選擇「Multi-zone」(多區域),然後將「Region」(地區) 設為 us-west1

  5. 將「Instance template」(執行個體範本) 設為 template-vm-ilb

  6. 選用步驟:設定自動調度資源功能。您無法根據 HTTP 負載平衡用量自動調度執行個體群組的資源,因為執行個體群組是內部直通式網路負載平衡器的後端。

  7. 將「Minimum number of instances」(執行個體數量下限) 設為 1,並將「Maximum number of instances」(執行個體數量上限) 設為 6

  8. 選用步驟:設定自動修復功能。如果您設定自動修復功能,請對內部直通式網路負載平衡器使用與後端服務相同的健康狀態檢查。在本範例中,請使用 hc-http-80

  9. 按一下 [建立]。

gcloud

  1. 建立執行個體範本。或者,您也可以設定其他參數,例如機器類型,以供映像檔範本使用。

    gcloud compute instance-templates create template-vm-ilb \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --region=us-west1 \
        --network=lb-network \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    
  2. 使用範本建立一個地區性代管執行個體群組:

    gcloud compute instance-groups managed create ig-ilb \
        --template=template-vm-ilb \
        --region=us-west1 \
        --size=6
    
  3. 將地區性代管執行個體群組新增至您已建立的後端服務,以做為後端使用:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-ilb \
        --instance-group-region=us-west1
    
  4. 中斷兩個非代管 (區域性) 執行個體群組與後端服務的連線:

    gcloud compute backend-services remove-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    gcloud compute backend-services remove-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c
    

從後端 VM 移除外部 IP 位址

當您建立後端 VM 時,系統會為每個 VM 指派一個臨時外部 IP 位址,以便透過開機指令碼下載 Apache。由於後端 VM 僅由內部直通式網路負載平衡器使用,因此可以移除其外部 IP 位址。移除外部 IP 位址可防止後端 VM 直接存取網際網路。

主控台

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

    前往 VM 執行個體

  2. 針對每個後端 VM 重複執行以下步驟。

  3. 按一下後端 VM 的名稱,例如 vm-a1

  4. 按一下「編輯」圖示

  5. 在「Network interfaces」(網路介面) 區段中,按一下網路。

  6. 在「外部 IP」清單中,選取「無」,然後按一下「完成」

  7. 按一下 [儲存]

gcloud

  1. 如要查詢執行個體的區域 (例如,如果您使用的是地區性代管執行個體群組),請針對每個執行個體執行以下指令以確定其區域。請將 [SERVER-VM] 改成要查詢的 VM 名稱。

    gcloud compute instances list --filter="name=[SERVER-VM]"
    
  2. 針對每個後端 VM 重複執行以下步驟。將 [SERVER-VM] 替換為 VM 的名稱,並將 [ZONE] 替換為 VM 的區域。

    gcloud compute instances delete-access-config [SERVER-VM] \
        --zone=[ZONE] \
        --access-config-name=external-nat
    

API

針對每個後端 VM,向 instances.deleteAccessConfig 方法提出 POST 要求,將 vm-a1 替換為 VM 的名稱,並將 us-west1-a 替換為 VM 的區域。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1/deleteAccessConfig?accessConfig=external-nat&networkInterface=None

使用已保留的內部 IP 位址

建立後端 VM 和執行個體群組時,VM 執行個體會使用暫時性的內部 IPv4 或 IPv6 位址。

以下步驟說明如何將內部 IPv4 或 IPv6 位址推送至靜態內部 IPv4 或 IPv6 位址,然後更新 VM 執行個體,以便使用靜態內部 IP 位址:

  1. 將使用中的臨時內部 IPv4 或 IPv6 位址升級為靜態位址
  2. 變更或指派內部 IPv6 位址至現有執行個體

或者,您也可以按照下列步驟預留新的靜態內部 IPv4 或 IPv6 位址,然後更新 VM 執行個體,以便使用靜態內部 IP 位址:

  1. 預留新的靜態內部 IPv4 或 IPv6 位址

    與內部 IPv4 保留功能不同,內部 IPv6 保留功能不支援從子網路中保留特定 IP 位址。而是從子網路的 /64 內部 IPv6 位址範圍,自動分配 /96 內部 IPv6 位址範圍。

  2. 變更或指派內部 IPv6 位址至現有執行個體

詳情請參閱「如何保留靜態內部 IP 位址」。

在所有通訊埠上接收流量

負載平衡器的轉送規則 (而非後端服務) 會決定負載平衡器接收流量的通訊埠。如要瞭解各個元件的用途,請參閱「元件」一節。

建立這個負載平衡器範例的轉送規則時,您已設定 80800880808088 通訊埠。安裝 Apache 的啟動指令碼也會將其設定為接受通訊埠 4438443 上的 HTTPS 連線。

如要支援這六個通訊埠,您可以設定轉送規則,接受所有通訊埠的流量。透過這項策略,您也可以設定防火牆規則,允許連入連線到後端 VM,讓後端 VM 只允許特定連接埠。

本程序說明如何刪除負載平衡器目前的轉送規則,並建立可接受所有通訊埠流量的新規則。

如要進一步瞭解何時使用這項設定,請參閱內部直通式網路負載平衡器和使用一般 IP 位址的轉送規則

主控台

刪除轉送規則並建立新規則

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

    前往「負載平衡」

  2. 按一下 be-ilb 負載平衡器,然後點選「編輯」

  3. 按一下「前端設定」

  4. 將游標懸停在 10.1.2.9 轉送規則上,然後按一下 「刪除」

  5. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)

  6. 在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,輸入以下資訊,然後按一下「Done」(完成)

    • Name (名稱):fr-ilb
    • 子網路lb-subnet
    • 內部 IPip-ilb
    • 連接埠全部
  7. 繼續操作之前,請先驗證「Frontend configuration」(前端設定) 旁是否有藍色勾號。

  8. 按一下「檢查並完成」,查看負載平衡器的配置設定。

  9. 按一下 [建立]。

gcloud

  1. 刪除現有的轉送規則 fr-ilb

    gcloud compute forwarding-rules delete fr-ilb \
        --region=us-west1
    
  2. 建立具有相同名稱的替換轉送規則,其通訊埠設定使用關鍵字 ALL。轉送規則的其他參數則維持不變。

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=ALL \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

forwardingRules.delete 方法發出 DELETE 要求,即可刪除轉送規則。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

forwardingRules.insert 方法發出 POST 要求,建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"allPorts": true,
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

測試所有通訊埠設定的流量

連線至用戶端 VM 執行個體並測試 HTTP 和 HTTPS 連線。

  • 連線至用戶端 VM:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  • 測試所有四個通訊埠的 HTTP 連線:

    curl http://10.1.2.99
    curl http://10.1.2.99:8008
    curl http://10.1.2.99:8080
    curl http://10.1.2.99:8088
    
  • 測試 4438443 上的 HTTPS 連線。由於範例設定中的每個 Apache 伺服器都使用自行簽署的憑證,因此必須使用 --insecure 旗標。

    curl https://10.1.2.99 --insecure
    curl https://10.1.2.99:8443 --insecure
    

  • 觀察 HTTP 要求 (在所有四個連接埠上) 和 HTTPS 要求 (在兩個連接埠上) 是否都分散在所有後端 VM 中。

使用兩個轉送規則在多個通訊埠上接收流量

建立這個負載平衡器範例的轉送規則時,您已設定 80800880808088 通訊埠。安裝 Apache 的啟動指令碼也會將其設定為在通訊埠 4438443 上接受 HTTPS 連線。

除了設定單一轉送規則來接受所有通訊埠的流量,您也可以建立多個轉送規則,每個規則支援五個或更少的通訊埠。

本程序說明如何以兩個轉送規則取代範例負載平衡器的轉送規則,其中一個規則會處理 80800880808088 通訊埠上的流量,另一個則會處理 4438443 通訊埠上的流量。

如要進一步瞭解何時使用這項設定,請參閱內部直通式網路負載平衡器和使用一般 IP 位址的轉送規則

主控台

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

    前往「轉送規則」

  2. 在「Name」欄中,依序按一下 fr-ilb 和「Delete」

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

    前往「負載平衡」

  4. 在「Name」(名稱) 欄中,按一下 be-ilb

  5. 按一下 [編輯]

  6. 按一下「前端設定」

  7. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)

  8. 在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,執行下列操作:

    1. 在「Name」(名稱) 中輸入 fr-ilb-http
    2. 在「Subnetwork」(子網路) 中,選取 lb-subnet
    3. 在「內部 IP 用途」部分,選取「共用」
    4. 在「IP address」(IP 位址) 清單中,選取「Create IP address」(建立 IP 位址),輸入以下資訊,然後按一下「Reserve」(保留)
      • Name (名稱):internal-10-1-2-99
      • 「Static IP address」(靜態 IP 位址):[Let me choose] (自行選擇)
      • Custom IP address (自訂 IP 位址):10.1.2.99
    5. 在「Ports」(通訊埠) 中,選取「Multiple」(多個),然後在「Port numbers」(通訊埠編號) 中輸入 80800880808088
    6. 按一下 [完成]
  9. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)

  10. 在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,執行以下操作:

    1. 在「Name」(名稱) 中輸入 fr-ilb-https
    2. 在「Subnetwork」(子網路) 中,選取 lb-subnet
    3. 在「內部 IP 用途」部分,選取「共用」
    4. 在「IP 位址」清單中選取 internal-10-1-2-99
    5. 在「Ports」(通訊埠) 部分,選取「Multiple」(多個),然後在「Port numbers」(通訊埠編號) 中輸入 4438443
    6. 按一下 [完成]
  11. 按一下「檢查並完成」,查看負載平衡器的配置設定。

  12. 按一下「更新」

gcloud

  1. 刪除現有的轉送規則 fr-ilb

    gcloud compute forwarding-rules delete fr-ilb \
        --region=us-west1
    
  2. 10.1.2.99 建立靜態 (預留) 內部 IP 位址,並將其 --purpose 標記設為 SHARED_LOADBALANCER_VIP。必須使用 --purpose 標記,才能讓兩個內部轉送規則使用相同的內部 IP 位址。

    gcloud compute addresses create internal-10-1-2-99 \
        --region=us-west1 \
        --subnet=lb-subnet \
        --addresses=10.1.2.99 \
        --purpose=SHARED_LOADBALANCER_VIP
    
    1. 使用下列參數建立兩個替換轉送規則:
    gcloud compute forwarding-rules create fr-ilb-http \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    
    gcloud compute forwarding-rules create fr-ilb-https \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=443,8443 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

forwardingRules.delete 方法發出 DELETE 要求,即可刪除轉送規則。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb

10.1.2.99 建立靜態 (已保留) 內部 IP 位址,並透過對 addresses.insert 方法發出 POST 要求,將其用途設為 SHARED_LOADBALANCER_VIP

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/addresses

{
"name": "internal-10-1-2-99",
"address": "10.1.2.99",
"prefixLength": 32,
"addressType": INTERNAL,
"purpose": SHARED_LOADBALANCER_VIP,
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet"
}

forwardingRules.insert 方法發出兩個 POST 要求,藉此建立兩個轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb-http",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"ports": [
  "80", "8008", "8080",  "8088"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}
{
"name": "fr-ilb-https",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"ports": [
  "443", "8443"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

測試多個通訊埠設定的流量

連線至用戶端 VM 執行個體並測試 HTTP 和 HTTPS 連線。

  • 連線至用戶端 VM:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  • 測試所有四個通訊埠的 HTTP 連線:

    curl http://10.1.2.99
    curl http://10.1.2.99:8008
    curl http://10.1.2.99:8080
    curl http://10.1.2.99:8088
    
  • 測試 4438443 通訊埠的 HTTPS 連線。由於範例設定中的每個 Apache 伺服器都使用自行簽署的憑證,因此必須使用 --insecure 旗標。

    curl https://10.1.2.99 --insecure
    curl https://10.1.2.99:8443 --insecure
    
  • 觀察 HTTP 要求 (在所有四個連接埠上) 和 HTTPS 要求 (在兩個連接埠上) 是否都分散在所有後端 VM 中。

使用工作階段相依性

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

本程序示範如何更新範例內部直通式網路負載平衡器的後端服務,以便根據用戶端 IP 位址和負載平衡器內部轉送規則的 IP 位址建立雜湊,並使用工作階段相依性。

如要瞭解支援的工作階段相依性類型,請參閱「工作階段相依性選項」。

主控台

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

    前往「負載平衡」

  2. 按一下「be-ilb」 (您為本範例建立的後端服務名稱),然後按一下「Edit」

  3. 在「Edit internal passthrough Network Load Balancer」(編輯內部直通式網路負載平衡器) 頁面上,按一下「Backend configuration」(後端設定)

  4. 在「Session affinity」清單中,選取「Client IP」

  5. 按一下「更新」

gcloud

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

gcloud compute backend-services update be-ilb \
    --region=us-west1 \
    --session-affinity CLIENT_IP

API

regionBackendServices/patch 方法提出 PATCH 要求。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb

{
"sessionAffinity": "CLIENT_IP"
}

設定連線追蹤政策

本節說明如何更新後端服務,以變更負載平衡器的預設連線追蹤政策。

連線追蹤政策包含下列設定:

gcloud

使用下列 gcloud compute backend-services 指令更新後端服務的連線追蹤政策:

gcloud compute backend-services update BACKEND_SERVICE \
    --region=REGION \
    --tracking-mode=TRACKING_MODE \
    --connection-persistence-on-unhealthy-backends=CONNECTION_PERSISTENCE_BEHAVIOR \
    --idle-timeout-sec=IDLE_TIMEOUT_VALUE

將預留位置替換為有效值:

  • BACKEND_SERVICE:您要更新的後端服務
  • REGION:要更新的後端服務所在的區域
  • TRACKING_MODE:用於處理傳入封包的連線追蹤模式;如需支援的值清單,請參閱「追蹤模式
  • CONNECTION_PERSISTENCE_BEHAVIOR:後端不健康時的連線持續性行為;如需支援的值清單,請參閱「持續連線至健康狀態不良的後端
  • IDLE_TIMEOUT_VALUE:負載平衡器處理最後一個與項目相符的封包後,連線追蹤表項目必須維持的秒數

    只有在連線追蹤小於 5 元組時,才能修改這個屬性 (也就是當工作階段相依性設為 CLIENT_IPCLIENT_IP_PROTO,且追蹤模式為 PER_SESSION 時)。

    預設值為 600 秒 (10 分鐘)。可設定的閒置逾時時間上限為 57,600 秒 (16 小時)。

在其他子網路中建立轉送規則

本程序會在不同的子網路中建立第二個 IP 位址和轉送規則,以示範您可以為一個內部直通式網路負載平衡器建立多個轉送規則。轉送規則的地區必須與後端服務的地區相符。

根據防火牆規則,地區的任何子網路中的用戶端都可以與內部直通式網路負載平衡器 IP 位址聯絡。

主控台

新增第二個子網路

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

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

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

  3. 按一下「lb-network」。

  4. 在「Subnets」(子網路) 區段中,執行下列操作:

    1. 按一下 [新增子網路]
    2. 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
      • Name (名稱):second-subnet
      • Region (區域):us-west1
      • IP address range (IP 位址範圍):10.5.6.0/24
    3. 按一下「新增」。

新增第二個轉送規則

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

    前往「負載平衡」

  2. 按一下 be-ilb 負載平衡器,然後點選「Edit」

  3. 按一下「前端設定」

  4. 按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)

  5. 在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,設定下列欄位,然後按一下「Done」

    • Name (名稱):fr-ilb-2
    • 「IP version」(IP 版本)IPv4
    • 子網路second-subnet
    • 內部 IPip-ilb
    • 通訊埠80443
  6. 繼續操作之前,請先驗證「Frontend configuration」(前端設定) 旁是否有藍色勾號。

  7. 按一下「檢查並完成」,查看負載平衡器的配置設定。

  8. 按一下 [建立]。

gcloud

  1. us-west1 地區的 lb-network 網路中建立第二個子網路:

    gcloud compute networks subnets create second-subnet \
       --network=lb-network \
       --range=10.5.6.0/24 \
       --region=us-west1
    
  2. 為通訊埠 80 和 443 建立第二個轉送規則。這項規則的其他參數 (包括 IP 位址和後端服務) 都與主要轉送規則 fr-ilb 相同。

    gcloud compute forwarding-rules create fr-ilb-2 \
       --region=us-west1 \
       --load-balancing-scheme=internal \
       --network=lb-network \
       --subnet=second-subnet \
       --address=10.5.6.99 \
       --ip-protocol=TCP \
       --ports=80,443 \
       --backend-service=be-ilb \
       --backend-service-region=us-west1
    

API

subnetworks.insert 方法提出 POST 要求。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks

{
 "name": "second-subnet",
 "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
 "ipCidrRange": "10.5.6.0/24",
 "privateIpGoogleAccess": false
}

forwardingRules.insert 方法發出 POST 要求,建立轉送規則。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules

{
"name": "fr-ilb-2",
"IPAddress": "10.5.6.99",
"IPProtocol": "TCP",
"ports": [
  "80", "443"
],
"loadBalancingScheme": "INTERNAL",
"subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet",
"network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
"backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb",
"networkTier": "PREMIUM"
}

測試新的轉送規則

連線至用戶端 VM 執行個體,並測試連至 IP 位址的 HTTP 和 HTTPS 連線。

  1. 連線至用戶端 VM:

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 測試連至 IP 位址的 HTTP 連線:

    curl http://10.1.2.99
    curl http://10.5.6.99
    
  3. 測試 HTTPS 連線。由於範例設定中的 Apache 伺服器設定使用自行簽署的憑證,因此必須使用 --insecure

    curl https://10.1.2.99 --insecure
    curl https://10.5.6.99 --insecure
    
  4. 觀察是否無論使用的通訊協定 (HTTP 或 HTTPS) 或 IP 位址為何,要求都是由所有後端 VM 處理的。

使用後端子集

範例設定會建立沒有子集的後端服務。

本程序會說明如何為範例內部直通式網路負載平衡器的後端服務啟用子集功能,以便部署作業可擴充至更多後端執行個體。

只有在單一負載平衡器上需要支援超過 250 個後端 VM 時,才應啟用子集。

如要進一步瞭解這項用途,請參閱「後端子集」。

gcloud

使用下列 gcloud 指令更新 be-ilb 後端服務,並指定子集政策:

gcloud compute backend-services update be-ilb \
    --subsetting-policy=CONSISTENT_HASH_SUBSETTING

API

regionBackendServices/patch 方法提出 PATCH 要求。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb

{
"subsetting":
  {
    "policy": CONSISTENT_HASH_SUBSETTING
  }
}

建立負載平衡器以便進行封包鏡像

封包鏡像功能可讓您複製及收集 VPC 中特定執行個體的封包資料。收集到的資料可協助您偵測安全威脅,並監控應用程式效能。

封包鏡像功能需要內部直通式網路負載平衡器,才能平衡收集器目的地執行個體群組的流量。如要建立內部直通式網路負載平衡器,以便進行封包鏡像,請按照下列步驟操作。

主控台

開始設定

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

    前往「負載平衡」

  2. 點選「建立負載平衡器」
  3. 在「負載平衡器類型」部分,選取「網路負載平衡器 (TCP/UDP/SSL)」,然後點選「下一步」
  4. 在「直通或使用 Proxy」部分,選取「直通式負載平衡器」,然後點選「下一步」
  5. 在「公開或內部」部分,選取「內部」,然後點選「下一步」
  6. 按一下 [設定]

基本設定

  1. 在「負載平衡器名稱」中輸入名稱。
  2. 在「Region」中,選取要鏡像封包的 VM 執行個體所在的區域。
  3. 在「Network」(網路) 中,選取要鏡像封包的網路。
  4. 按一下「後端設定」
  5. 在「New Backend」(新增後端) 專區的「Instance group」(執行個體群組) 中,選取要轉送封包的執行個體群組。
  6. 在「Health check」(健康狀態檢查) 清單中,選取「Create a health check」(建立健康狀態檢查),輸入下列資訊,然後按一下「Save」(儲存)
    1. 在「Name」 中輸入健康狀態檢查的名稱。
    2. 在「Protocol」中選取 HTTP
    3. 在「Port」(通訊埠) 欄中,輸入 80
  7. 按一下「前端設定」
  8. 在「New Frontend IP and port」部分中,執行下列操作:
    1. 在「Name」 中輸入名稱。
    2. 在「子網路」中,選取與要鏡像的執行個體相同區域的子網路。
    3. 在「通訊埠」部分,選取「全部」
    4. 按一下「進階設定」,然後選取「為這個負載平衡器啟用封包鏡像」核取方塊。
    5. 按一下 [完成]
  9. 按一下 [建立]。

gcloud

  1. 建立新的區域 HTTP 健康狀態檢查,以測試通訊埠 80 上連至執行個體群組的 HTTP 連線:

    gcloud compute health-checks create http HEALTH_CHECK_NAME \
        --region=REGION \
        --port=80
    

    更改下列內容:

    • HEALTH_CHECK_NAME:健康狀態檢查的名稱。
    • REGION:您要為其鏡像封包的 VM 執行個體區域。
  2. 針對 HTTP 流量建立後端服務:

    gcloud compute backend-services create COLLECTOR_BACKEND_SERVICE \
        --region=REGION \
        --health-checks-region=REGION \
        --health-checks=HEALTH_CHECK_NAME \
        --load-balancing-scheme=internal \
        --protocol=tcp
    

    更改下列內容:

    • COLLECTOR_BACKEND_SERVICE:後端服務名稱。
    • REGION:您要鏡像封包的 VM 執行個體區域。
    • HEALTH_CHECK_NAME:健康狀態檢查的名稱。
  3. 將執行個體群組新增至後端服務:

    gcloud compute backend-services add-backend COLLECTOR_BACKEND_SERVICE \
        --region=REGION \
        --instance-group=INSTANCE_GROUP \
        --instance-group-zone=ZONE
    

    更改下列內容:

    • COLLECTOR_BACKEND_SERVICE:後端服務名稱。
    • REGION:執行個體群組的所在地區。
    • INSTANCE_GROUP:執行個體群組的名稱。
    • ZONE:執行個體群組的區域。
  4. 為後端服務建立轉送規則:

    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
        --region=REGION \
        --network=NETWORK \
        --subnet=SUBNET \
        --backend-service=COLLECTOR_BACKEND_SERVICE \
        --load-balancing-scheme=internal \
        --ip-protocol=TCP \
        --ports=all \
        --is-mirroring-collector
    

    更改下列內容:

    • FORWARDING_RULE_NAME:轉送規則的名稱。
    • REGION:轉送規則的區域。
    • NETWORK:轉送規則的網路。
    • SUBNET:您要鏡像封包的 VM 所在區域中的子網路。
    • COLLECTOR_BACKEND_SERVICE:此負載平衡器的後端服務。

後續步驟

附錄:IPv6 Bash 指令碼入門

本節將簡要說明與 Bash 啟動指令碼相關的各種網路指令,這些指令可用於在後端 VM 上安裝 IPv6 TCP 伺服器。您不需要再次執行這些步驟。這裡僅列出這些資訊,提供背景資訊並協助您瞭解相關內容。

  1. 顯示所有 IPv6 路由。

    ip -6 route show table all
    

    輸出看起來像這樣:

    fd20:307:120c:2000::/64 via fe80::57:2ff:fe36:ffbe dev ens4 proto ra metric 100 expires 62sec pref medium
    fe80::/64 dev ens4 proto kernel metric 256 pref medium
    default via fe80::57:2ff:fe36:ffbe dev ens4 proto ra metric 100 expires 62sec mtu 1460 pref medium
    local ::1 dev lo table local proto kernel metric 0 pref medium
    local fd20:307:120c:2000:0:b:: dev ens4 table local proto kernel metric 0 pref medium
    local fe80::56:24ff:feb1:59b3 dev ens4 table local proto kernel metric 0 pref medium
    multicast ff00::/8 dev ens4 table local proto kernel metric 256 pref medium
    

    根據上一個步驟的輸出內容,找出下列項目:

    • 連結本機 IPv6 位址 (開頭為 fe80::/10):在範例輸出內容中,連結本機位址為 fe80::57:2ff:fe36:ffbe。這個連結本機位址會用於路由表 1 中定義的預設路徑。這個預設路徑是在步驟 2 中建立。
    • /64 子網路:這個子網路在步驟 3 的依來源政策路由規則中參照
  2. 在路徑表 1 中新增自訂預設路徑。

    下列指令會使用名為 ens4 的網路介面,將封包傳送至閘道。

    sudo ip route add default via GATEWAY_ADDRESS dev ens4 table 1
    

    執行這項指令後,系統會在自訂路由表格 (表 1) 中新增預設路由,並透過 ens4 介面指向閘道 fe80::57:2ff:fe36:ffbe

    如果您再次執行 ip -6 route show table all 指令,輸出內容如下:

    default via fe80::57:2ff:fe36:ffbe dev ens4 table 1 metric 1024 pref medium
    fd20:307:120c:2000::/64 via fe80::57:2ff:fe36:ffbe dev ens4 proto ra metric 100 expires 89sec pref medium
    fe80::/64 dev ens4 proto kernel metric 256 pref medium
    default via fe80::57:2ff:fe36:ffbe dev ens4 proto ra metric 100 expires 89sec mtu 1460 pref medium
    local ::1 dev lo table local proto kernel metric 0 pref medium
    local fd20:307:120c:2000:0:1::/96 dev ens4 table local proto 66 metric 1024 pref medium
    local fd20:307:120c:2000:0:b:: dev ens4 table local proto kernel metric 0 pref medium
    local fe80::56:24ff:feb1:59b3 dev ens4 table local proto kernel metric 0 pref medium
    multicast ff00::/8 dev ens4 table local proto kernel metric 256 pref medium
    
  3. 新增以來源為準的政策轉送規則。

    下列指令會新增規則,將所有來自指定子網路的傳出封包路由。如果來源位址符合子網路,系統會使用表格 1 中定義的預設路徑轉送流量。

    sudo ip -6 rule add from SUBNET_RANGE table 1
    
  4. 如要查看政策路由規則清單,請執行下列指令。

    ip -6 rule show
    

    輸出看起來像這樣:

    0:      from all lookup local
    32765:  from fd20:307:120c:2000::/64 lookup 1
    32766:  from all lookup main
    

    含有 from fd20:... lookup 1 的行是您新增的規則,可指示核心使用路由表 1 處理來自該子網路的流量。

  5. 允許伺服器繫結至非本機 IPv6 位址,也就是負載平衡器的 VIP。

    sudo sysctl -w net.ipv6.ip_nonlocal_bind=1