使用目標集區設定外部直通式網路負載平衡器

本指南提供操作說明,說明如何使用目標集區後端建立外部直通式網路負載平衡器設定。這個範例假設您在要平衡流量的 Compute Engine 執行個體之間有多個網路伺服器。這個情境設定第 4 層負載平衡設定,以便將 HTTP 流量分散至各個運作狀態良好的執行個體中。基本 HTTP 健康狀態檢查已設定好,確保僅將流量傳送至健康狀態良好的執行個體。

這個範例會對 HTTP 流量進行負載平衡,但您可以使用以目標集區為基礎的外部轉送網路負載平衡器,對 TCP、UDP 和 SSL 流量進行負載平衡。在開始之前,建議您先參閱外部直通式網路負載平衡器總覽,瞭解外部直通式網路負載平衡器的相關概念資訊。

事前準備

安裝 Google Cloud CLI。如需工具的完整總覽,請參閱 gcloud 工具指南。您可以在 gcloud compute 指令群組中找到與負載平衡相關的指令。

您也可以使用 --help 標記,取得任何 gcloud 指令的詳細說明:

gcloud compute http-health-checks create --help

如果您之前沒有執行過 Google Cloud CLI,請先執行 gcloud init 進行驗證。

此外,您必須建立負載平衡器的靜態外部 IP 位址。如果您是使用 Compute Engine 提供的映像檔,則會將虛擬機器 (VM) 執行個體自動設定為處理這個 IP 位址。如果您是使用任何其他映像檔,則必須將這個位址設定為 eth0 上的別名或每個執行個體上的回送。

本指南假設您已熟悉 bash

設定 Compute Engine VM 執行個體

針對這個負載平衡情境,您將建立三個 Compute Engine VM 執行個體,並將 Apache 安裝在這些執行個體上。您將新增可允許 HTTP 流量連上執行個體的防火牆規則。

做為外部直通式網路負載平衡器的後端 VM 的執行個體,必須執行適當的 Linux 訪客環境Windows 訪客環境或其他提供等效功能的處理程序。

設定後端執行個體

主控台

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

    前往 VM 執行個體

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

  3. 將「Name」(名稱) 設定為 www1

  4. 將「Region」(地區) 設為 us-central1

  5. 將「Zone」(區域) 設為 us-central1-b

  6. 在「Boot disk」(開機磁碟) 下,確認已選取 Debian GNU/Linux 12 (bookworm) 的預設 OS 映像檔。

  7. 點選「進階選項」

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

    1. 在「網路標記」中輸入 network-lb-tag
  9. 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中輸入下列指令碼。

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. 按一下 [建立]。
  10. 以相同的設定值建立名為 www2 的執行個體,不過請將以下指令碼插入至「Automation」、「Startup script」 欄位。

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

  11. 以相同的設定值建立名為 www3 的執行個體,不過請將以下指令碼插入至「Automation」、「Startup script」欄位。

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

以下指令全都會在本機系統上執行,並且假設使用 bash 命令提示字元。

如要查看 OS 映像檔名稱、屬性和狀態,請使用 gcloud compute images list 指令。

  1. 在指定區域中建立三個新的虛擬機器,並為其全部加上相同的標記。這個範例將區域設為 us-central1-b。設定 tags 欄位可讓您一次參照所有這些執行個體,例如使用防火牆規則。這些指令也會將 Apache 安裝在所有執行個體中,並為每個執行個體建立專屬首頁。

    gcloud compute instances create www1 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

API

使用 instances.insert 方法,在可用區 us-central1-b 中建立執行個體 www1

POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-12-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

以相同的設定值建立名為 www2www3 的執行個體,不過請替換 deviceNamevaluename 欄位中的 www1

建立防火牆規則,允許外部流量傳送至這些 VM 執行個體

主控台

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

    前往「防火牆政策」

  2. 點按「建立防火牆規則」

  3. 輸入 www-firewall-network-lb 的「Name」

  4. 選取要套用防火牆規則的網路 (預設)。

  5. 在「Targets」(目標) 下方,選取 [Specified target tags] (指定的目標標記)

  6. 在「Target tags」(目標標記) 欄位中輸入 network-lb-tag

  7. 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)

  8. 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為 0.0.0.0/0,允許來自任何來源的流量。

  9. 在「Specified protocols and ports」(指定的通訊協定和通訊埠) 下方,勾選「TCP」核取方塊,然後輸入 80

  10. 按一下「建立」,新的防火牆規則可能需要一些時間才會顯示在主控台中,或者您可能需要按一下「Refresh」(重新整理) 才能看到規則。

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

API

firewalls.insert ** 方法** 建立允許子網路內所有流量的防火牆規則

POST https://compute.s3nsapis.fr/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

取得執行個體的外部 IP 位址並驗證是否運作正常

主控台

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

    前往 VM 執行個體

  2. 在「External IP」(外部 IP) 欄中查看您的執行個體位址。

  3. 尋找執行個體名稱的左邊是否有綠色綠色勾號,以驗證執行個體是否運作正常。如果您沒有看到綠色勾號,請參閱執行個體的一般疑難排解頁面

gcloud

  1. 列出執行個體以從 EXTERNAL_IP 欄取得其 IP 位址。

    gcloud compute instances list
    
  2. 驗證每個執行個體是否運作正常。

    在指令列中,使用每個執行個體的外部 IP 位址執行 curl,確認所有執行個體皆可回應。

    curl http://[IP_ADDRESS]
    

API

使用 instances.get 方法取得執行個體 www1 的資訊

確認 status 欄位顯示 RUNNING,並尋找 natIP 欄位中的外部 IP 位址。

GET https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-12-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.s3ns-system.iam.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

請對 www2www3 重複這個 API 呼叫。

設定負載平衡服務

接下來,請設定負載平衡服務。

設定負載平衡服務時,虛擬機器執行個體會接收預定送至您設定之靜態 IP 位址的封包。如果您是使用 Compute Engine 提供的映像檔,則會將執行個體自動設定為處理這個 IP 位址。如果您是使用任何其他映像檔,則必須將這個位址設定為 eth0 上的別名或每個執行個體上的回送。

主控台

您無法使用 Trusted Cloud 控制台建立以目標集區為基礎的外部直通式網路負載平衡器。請改用 gcloud 或 REST API。

gcloud

  1. 建立負載平衡器的靜態外部 IP 位址

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. 新增舊版 HTTP 健康狀態檢查資源

    這個範例會使用健康狀態檢查機制的預設設定,但您也可以自行自訂健康狀態檢查。

    gcloud compute http-health-checks create basic-check
    
  3. 新增目標集區

    在與虛擬機器執行個體相同的地區中新增目標集區。將您在上述步驟中建立的健康狀態檢查用於這個目標集區。目標集區需要有健康狀態檢查服務才能運作。

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. 新增執行個體至目標集區

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    目標集區內的執行個體必須屬於同一個地區,但可以分散到同一個地區中的不同區域上。舉例來說,您可以在一個目標集區中擁有位於 us-central1-f 區域內的執行個體以及位於 us-central1-b 區域內的執行個體,因為這些執行個體都位於相同的 us-central1 區域中。

  5. 新增轉送規則

    新增代表外部 IP 位址處理的轉送規則,以及指向您的目標集區的通訊埠範圍。針對 --address 欄位,請使用數值 IP 位址或其完整合格名稱。

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

API

  1. 建立負載平衡器的靜態外部 IP 位址

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. 新增舊版 HTTP 健康狀態檢查

    針對健康狀態檢查機制,這個範例會使用預設設定,但您也可以自行加以自訂。

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. 新增目標集區

    在與虛擬機器執行個體相同的地區中新增目標集區。將您在上述步驟中建立的健康狀態檢查用於這個目標集區。目標集區需要有健康狀態檢查服務才能運作。

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. 新增執行個體至目標集區

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    請對 www2www3 執行個體重複這個 API 呼叫。

    目標集區內的執行個體必須屬於同一個地區,但可以分散到同一個地區中的不同區域上。例如,您可以在一個目標集區中擁有位於 us-central1-f 區域內的執行個體以及位於 us-central1-b 區域內的執行個體,因為這些執行個體都位於相同的 us-central1 地區中。

  5. 新增轉送規則

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

將流量傳送至執行個體

您已設定負載平衡服務,可以開始向轉送規則傳送流量,並觀察流量是否分散到不同的執行個體。

查詢轉送規則的外部 IP 位址

主控台

  1. 前往 Trusted Cloud 控制台的「Advanced load balancing」(進階負載平衡) 頁面的「Forwarding rules」(轉送規則) 分頁標籤。
    前往「Forwarding Rules」(轉送規則) 分頁
  2. 找出負載平衡器所使用的轉送規則 www-rule
  3. www-rule 的「IP Address」(IP 位址) 欄中,請注意列出的外部 IP 位址。

gcloud

輸入下列指令,查看負載平衡器所用 www-rule 轉送規則的外部 IP 位址。

gcloud compute forwarding-rules describe www-rule --region us-central1

API

使用 forwardingRules.get 方法查看 www-rule 轉送規則的外部 IP 位址

在輸出內容中,找出 IPAddress 欄位。

GET https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

後端執行個體不支援 ICMP

外部直通式網路負載平衡器不會將 ICMP 封包傳送至後端執行個體。如果您傳送 ICMP 封包 (例如使用 pingtraceroute),回覆不會來自負載平衡器的後端執行個體。

Trusted Cloud 即使您已設下防火牆規則,禁止負載平衡器的後端執行個體上的 ICMP 流量,基礎架構仍可能會傳送 ICMP 回應。這項行為無法變更。

使用 curl 指令存取外部 IP 位址

curl 指令的回應會在這三個執行個體之間隨機輪流出現。如果一開始的回應失敗,在您重試之前,可能需要等候大約 30 秒,設定才會完整載入且執行個體才會標示為健康狀態良好:

$ while true; do curl -m1 IP_ADDRESS; done

後續步驟