設定內部 TCP/UDP 負載平衡

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

權限

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

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

設定

本指南說明如何設定和測試內部 TCP/UDP 負載平衡器。本節中的步驟說明如何設定以下項目:

  1. 包含自訂子網路的範例虛擬私人雲端網路
  2. 讓後端 VM 允許連入連線的防火牆規則
  3. 四個後端 VM:
    • us-west1-a 區域中非代管執行個體群組中的兩個 VM
    • us-west1-c 區域中非代管執行個體群組中的兩個 VM
  4. 一個用於測試連線的用戶端 VM
  5. 以下內部 TCP/UDP 負載平衡器元件:
    • 一個用於後端服務的健康狀態檢查
    • us-west1 地區中的一個內部後端服務,用於管理兩個區域性執行個體群組之間的連線分配
    • 一個用於負載平衡器前端的內部轉送規則和內部 IP 位址

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

內部 TCP/UDP 負載平衡範例設定 (按一下可放大)
內部 TCP/UDP 負載平衡範例設定 (按一下可放大)

設定網路、地區和子網路

您需要一個具有至少一個子網路的虛擬私人雲端網路要。內部 TCP/UDP 負載平衡器為地區性。如果虛擬私人雲端網路內的流量來源是來自於與負載平衡器位於同一個地區的子網路,系統便會將其轉送至負載平衡器。

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

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

Console

  1. 前往 Google Cloud Platform Console 的「VPC networks」(VPC 網路) 頁面。
    前往「VPC networks」(VPC 網路) 頁面
  2. 按一下 [Create VPC network] (建立 VPC 網路)
  3. 在「Name」(名稱) 欄位中輸入 lb-network
  4. 在「Subnets」(子網路) 區段中:
    • 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)
    • 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
      • 「Name」(名稱)lb-subnet
      • 「Region」(地區)us-west1
      • 「IP address range」(IP 位址範圍)10.1.2.0/24
      • 按一下 [Done] (完成)
  5. 按一下 [Create] (建立)

gcloud

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

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

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

API

networks.insert 方法發出 POST 要求。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks
{
  "routingConfig": {
    "routingMode": "REGIONAL"
  },
  "name": "lb-network",
  "autoCreateSubnetworks": false
}

subnetworks.insert 方法發出 POST 要求。

POST https://www.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
}

設定防火牆規則

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

  • fw-allow-lb-subnet:輸入規則,適用於虛擬私人雲端網路中的所有目標,允許來自 10.1.2.0/24 範圍內來源的流量。這項規則可讓要進行負載平衡的執行個體 (VM) 允許來自 lb-subnet 內任何來源的傳入流量。

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

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

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

Console

  1. 前往 Google Cloud Platform 主控台的「Firewall rules」(防火牆規則) 頁面。
    前往「Firewall rules」(防火牆規則) 頁面
  2. 按一下 [Create firewall rule] (建立防火牆規則),然後輸入以下資訊,以建立允許子網路流量的規則:
    • 「Name」(名稱)fw-allow-lb-subnet
    • 「Network」(網路)lb-network
    • 「Priority」(優先順序)1000
    • 「Direction of traffic」(流量方向):[ingress] (輸入)
    • 「Action on match」(相符時執行的動作):[allow] (允許)
    • 「Targets」(目標):[All instances in the network] (網路中的所有執行個體)
    • 「Source filter」(來源篩選器)IP ranges
    • 「Source IP ranges」(來源 IP 範圍)10.1.2.0/24
    • 「Protocols and ports」(通訊協定和通訊埠):[Allow all] (全部允許)
  3. 按一下 [Create] (建立)
  4. 再次按一下 [Create firewall rule] (建立防火牆規則),以建立允許連入 SSH 連線的規則:
    • 「Name」(名稱)fw-allow-ssh
    • 「Network」(網路)lb-network
    • 「Priority」(優先順序)1000
    • 「Direction of traffic」(流量方向):[ingress] (輸入)
    • 「Action on match」(相符時執行的動作):[allow] (允許)
    • 「Target」目標:[Specified target tags] (指定的目標標記)
    • 「Target tags」(目標標記):allow-ssh
    • 「Source filter」(來源篩選器)IP ranges
    • 「Source IP ranges」(來源 IP 範圍)0.0.0.0/0
    • 「Protocols and ports」(通訊協定和通訊埠):選擇 [Specified protocols and ports] (指定的通訊協定和通訊埠),然後輸入:tcp:22
  5. 按一下 [Create] (建立)
  6. 按一下 [Create firewall rule] (建立防火牆規則) 第三次,以建立允許 GCP 健康狀態檢查的規則:
    • 「Name」(名稱)fw-allow-health-check
    • 「Network」(網路)lb-network
    • 「Priority」(優先順序)1000
    • 「Direction of traffic」(流量方向):[ingress] (輸入)
    • 「Action on match」(相符時執行的動作):[allow] (允許)
    • 「Target」目標:[Specified target tags] (指定的目標標記)
    • 「Target tags」(目標標記)allow-health-check
    • 「Source filter」(來源篩選器)IP ranges
    • 「Source IP ranges」(來源 IP 範圍)130.211.0.0/2235.191.0.0/16
    • 「Protocols and ports」(通訊協定和通訊埠):[Allow all] (全部允許)
  7. 按一下 [Create] (建立)

gcloud

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

    gcloud compute firewall-rules create fw-allow-lb-subnet \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  2. 建立 fw-allow-ssh 防火牆規則以允許與具有 allow-ssh 網路標記的 VM 建立 SSH 連線。若省略 source-ranges,GCP 會將規則解讀為任何來源

    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 規則以允許 GCP 健康狀態檢查。

    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-subnet 防火牆規則。

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

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

POST https://www.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://www.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。為了示範內部 TCP/UDP 負載平衡的地區性特質,這兩個執行個體群組是放在不同的區域 (us-west1-aus-west1-c) 中。

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

傳輸至以上四個後端 VM 的流量都已達到負載平衡。這四個 VM 會各自在 TCP 通訊埠 80 和 443 上執行 Apache 網路伺服器,而且每個 VM 都會獲指派 lb-subnet 中的內部 IP 位址以及臨時外部 (公開) IP 位址。您可以在稍後移除外部 IP 位址

雖然後端 VM 的外部 IP 位址並非必須,但是它們對於本範例很實用,因為它們允許後端 VM 從網際網路下載 Apache,並且使得透過 SSH 進行連線變得很容易。

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

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

Console

建立後端 VM

  1. 前往 Google Cloud Platform Console 的「VM instances」(VM 執行個體) 頁面。
    前往「VM instances」(VM 執行個體) 頁面
  2. 重複以下步驟,並使用以下的名稱和區域組合來建立四個 VM。
    • 名稱:vm-a1,區域:us-west1-a
    • 名稱:vm-a2,區域:us-west1-a
    • 名稱:vm-c1,區域:us-west1-c
    • 名稱:vm-c2,區域:us-west1-c
  3. 按一下 [Create instance] (建立執行個體)
  4. 按照步驟 2 指定的名稱設定「Name」(名稱)
  5. 針對「Region」(地區) 選擇 us-west1,然後選擇步驟 2 指定的區域
  6. 在「Boot disk」(開機磁碟) 區段中,確認所選映像檔為「Debian GNU/Linux 9 Stretch」。如有需要,請按一下 [Choose] (選擇) 來變更映像檔。
  7. 按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用),然後進行以下變更:

    • 按一下 [Networking] (網路),然後新增以下「Network tags」(網路標記)allow-sshallow-health-check
    • 按一下「Network interfaces」(網路介面) 之下的 [Edit] (編輯) 按鈕,進行以下變更,然後按一下 [Done] (完成)
      • 「Network」(網路)lb-network
      • 「Subnet」(子網路)lb-subnet
      • 「Primary internal IP」(主要內部 IP):[Ephemeral (automatic)] (臨時 (自動))
      • 「External IP」(外部 IP):[Ephemeral] (臨時)
    • 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中,複製並貼上以下指令碼內容。四個 VM 的指令碼內容完全相同。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  8. 按一下 [Create] (建立)

建立執行個體群組

  1. 前往 Google Cloud Platform Console 的「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. 按一下 [Create instance group] (建立執行個體群組)
  4. 按照步驟 2 指定的名稱設定「Name」(名稱)
  5. 在「Location」(位置) 區段中,選取 [Single-zone] (單一區域),針對「Region」(地區) 選擇 us-west1,然後選擇步驟 2 指定的區域
  6. 在「Group type」(群組類型) 區段中,選取 [Unmanaged instance group] (非代管執行個體群組)
  7. 針對「Network」(網路) 輸入 lb-network
  8. 針對「Subnetwork」(子網路) 輸入 lb-subnet
  9. 在「VM instances」(VM 執行個體) 區段中,新增步驟 2 指定的 VM。
  10. 按一下 [Create] (建立)

gcloud

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

    • [VM-NAME]vm-a1[ZONE]us-west1-a
    • [VM-NAME]vm-a2[ZONE]us-west1-a
    • [VM-NAME]vm-c1[ZONE]us-west1-c
    • [VM-NAME]vm-c2[ZONE]us-west1-c
    gcloud compute instances create [VM-NAME] \
        --zone=[ZONE] \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'
    
  2. 在每個區域中建立兩個非代管執行個體群組:

    gcloud compute instance-groups 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-NAME]vm-a1[ZONE]us-west1-a
  • [VM-NAME]vm-a2[ZONE]us-west1-a
  • [VM-NAME]vm-c1[ZONE]us-west1-c
  • [VM-NAME]vm-c2[ZONE]us-west1-c

透過向 instances.insert 方法發出四個 POST 要求來建立四個後端 VM:

POST https://www.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/n1-standard-1",
  "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-9-stretch-v20190618",
        "diskType": "projects/[PROJECT_ID]/zones/us-west1-a/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\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\nsystemctl restart apache2"
      }
    ]
  },
  "scheduling": {
    "preemptible": false
  },
  "deletionProtection": false
}

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

POST https://www.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://www.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://www.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://www.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"
    }
  ]
}

建立用戶端 VM

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

Console

  1. 前往 Google Cloud Platform Console 的「VM instances」(VM 執行個體) 頁面。
    前往「VM instances」(VM 執行個體) 頁面
  2. 按一下 [Create instance] (建立執行個體)
  3. 將「Name」(名稱) 設為 vm-client
  4. 將「Zone」(區域) 設為 us-west1-a
  5. 按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用),然後進行以下變更:
    • 按一下 [Networking] (網路),然後將 allow-ssh 新增至「Network tags」(網路標記)
    • 按一下「Network interfaces」(網路介面) 之下的 [Edit] (編輯) 按鈕,進行以下變更,然後按一下 [Done] (完成)
      • 「Network」(網路)lb-network
      • 「Subnet」(子網路)lb-subnet
      • 「Primary internal IP」(主要內部 IP):[Ephemeral (automatic)] (臨時 (自動))
      • 「External IP」(外部 IP):[Ephemeral] (臨時)
  6. 按一下 [Create] (建立)

gcloud

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

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

API

instances.insert 方法發出 POST 要求。

POST https://www.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/n1-standard-1",
  "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-9-stretch-v20190618",
        "diskType": "projects/[PROJECT_ID]/zones/us-west1-a/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ]
  "scheduling": {
    "preemptible": false
  },
  "deletionProtection": false
}

設定負載平衡器元件

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

  • 健康狀態檢查:在本範例中,我們使用只檢查 HTTP 200 (OK) 回應的 HTTP 健康狀態檢查。詳情請參閱內部 TCP/UDP 負載平衡總覽的健康狀態檢查一節

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

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

  • 內部 IP 位址:在本範例中,我們會在建立轉送規則時指定內部 IP 位址 10.1.2.99

Console

建立負載平衡器並設定後端服務

  1. 前往 Google Cloud Platform Console 的「Load balancing」(負載平衡) 頁面。
    前往「Load balancing」(負載平衡) 頁面
  2. 按一下 [Create load balancer] (建立負載平衡器)
  3. 在「TCP load balancing」(TCP 負載平衡) 之下,按一下 [Start configuration] (啟動設定)
  4. 在「Internet facing or internal only」(連結網際網路或僅限內部) 之下,選取 [Only between my VMs] (僅在我的 VM 之間)
  5. 按一下 [Continue] (繼續)
  6. 將「Name」(名稱) 設為 be-ilb
  7. 按一下 [Backend configuration] (後端設定),然後進行以下變更:
    1. 「Region」(地區)us-west1
    2. 「Network」(網路)lb-network
    3. 在「Backends」(後端) 之下的「New item」(新增項目) 區段中,選取 ig-a 執行個體群組,然後按一下 [Done] (完成)
    4. 按一下 [Add backend] (新增後端)。在隨後顯示的「New item」(新增項目) 區段中,選取 ig-c 執行個體群組,然後再次按一下 [Done] (完成)
    5. 在「Health check」(健康狀態檢查) 之下,選擇 [Create another health check] (建立另一個健康狀態檢查),輸入以下資訊,然後按一下 [Save and continue] (儲存並繼續)
      • 「Name」(名稱)hc-http-80
      • 「Protocol」(通訊協定)HTTP
      • 「Port」(通訊埠)80
      • 「Proxy protocol」(Proxy 通訊協定)NONE
      • 「Request path」(要求路徑)/
    6. 繼續操作之前,請先驗證「Backend configuration」(後端設定) 旁是否有一個藍色勾號。如果沒有,請檢查此步驟。
  8. 按一下 [Frontend configuration] (前端設定)。在「New Frontend IP and port」(新增的前端 IP 和通訊埠) 區段中,進行以下變更:
    1. 「Name」(名稱)fr-ilb
    2. 「Subnetwork」(子網路)ilb-subnet
    3. 在「Internal IP」(內部 IP) 中,選擇 [Reserve a static internal IP address] (保留靜態內部 IP 位址),輸入以下資訊,然後按一下 [Reserve] (保留)
      • 「Name」(名稱)ip-ilb
      • 「Static IP address」(靜態 IP 位址):[Let me choose] (自行選擇)
      • 「Custom IP address」(自訂 IP 位址)10.1.2.99
    4. 「Ports」(通訊埠):選擇 [Single] (單個),然後輸入 80 做為「Port number」(通訊埠編號)
    5. 繼續操作之前,請先驗證「Frontend configuration」(前端設定) 旁是否有一個藍色勾號。如果沒有,請檢查此步驟。
  9. 按一下 [Review and finalize] (檢查並完成)。請再次檢查您的設定。
  10. 按一下 [Create] (建立)

gcloud

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

    gcloud compute health-checks create http hc-http-80 \
        --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
    
  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 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

透過向 healthChecks.insert 方法發出 POST 要求來建立健康狀態檢查。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks
{
  "name": "hc-http-80",
  "type": "HTTP",
  "httpHealthCheck": {
    "port": 80
  }
}

透過向 regionBackendServices.insert 方法發出 POST 要求來建立地區性後端服務。

POST https://www.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]/global/healthChecks/hc-http-80"
  ],
  "loadBalancingScheme": "INTERNAL",
  "connectionDraining": {
    "drainingTimeoutSec": 0
  }
}

透過向 forwardingRules.insert 方法發出 POST 要求來建立轉送規則。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-west1/forwardingRules
{
  "name": "fr-ilb",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "ports": [
    "80"
  ],
  "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 之間分配流量,因為尚未設定工作階段相依性

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

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

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

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

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

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

  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 (要進行負載平衡的伺服器 VM) 對負載平衡器發出的要求,一律會由發出要求的同一個 VM 回應。

內部 TCP/UDP 負載平衡是使用虛擬網路程式設計和客體 OS 中的 VM 設定實作的。在 Linux VM 上,Linux 訪客環境會在客體 OS 轉送表中安裝路徑以執行本機設定。由於這個本機路徑,傳送至負載平衡器 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 相符的目的地。這個路徑是內部 TCP/UDP 負載平衡的必要部分,但它也說明了為什麼來自負載平衡器後方 VM 的要求一律會由同一個 VM 回應。

    ip route show table local | grep 10.1.2.99
    

其他設定選項

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

設定代管執行個體群組

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

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

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

本程序會說明如何修改範例內部 TCP/UDP 負載平衡器的後端服務,以使其使用地區性代管執行個體群組。

Console

執行個體範本

  1. 前往 Google Cloud Platform Console 的「VM instance templates」(VM 執行個體範本) 頁面。
    前往「VM instance templates」(VM 執行個體範本) 頁面
  2. 按一下 [Create instance template] (建立執行個體範本)
  3. 將「Name」(名稱) 設為 template-vm-ilb
  4. 選擇機器類型
  5. 針對「Boot disk」(開機磁碟) 按一下 [Change] (變更),選擇 [Debian GNU/Linux 9 Stretch],然後按一下 [Select] (選取)
  6. 按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用)
    • 按一下 [Networking] (網路),然後進行以下變更:
      • 「Network」(網路)lb-network
      • 「Subnet」(子網路)lb-subnet
      • 「Network tags」(網路標記)allow-sshallow-health-check
    • 按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中,複製並貼上以下指令碼內容:
      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" 
      http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" |
      tee /var/www/html/index.html systemctl restart apache2
  7. 按一下 [Create] (建立)

代管的執行個體群組

  1. 前往 Google Cloud Platform Console 的「VM instances」(VM 執行個體) 頁面。
    前往「VM instances groups」(VM 執行個體群組) 頁面
  2. 按一下 [Create instance group] (建立執行個體群組)
  3. 將「Name」(名稱) 設為 ig-ilb
  4. 針對「Location」(位置) 選擇 [Multi-zone] (多區域),然後將「Region」(地區) 設為 us-west1
  5. 將「Instance template」(執行個體範本) 設為 template-vm-ilb
  6. (選用) 設定自動調度資源功能。您無法根據 HTTP 負載平衡使用情形自動調度執行個體群組的資源,因為執行個體群組是內部 TCP/UDP 負載平衡的後端。
  7. 將「Minimum number of instances」(執行個體數量下限) 設為 1,並將「Maximum number of instances」(執行個體數量上限) 設為 6
  8. (選用) 設定自動修復功能。如果您設定自動修復功能,請對內部 TCP/UDP 負載平衡器使用與後端服務相同的健康狀態檢查。在本範例中,請使用 hc-http-80
  9. 按一下 [Create] (建立)

gcloud

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

    gcloud compute instance-templates create template-vm-ilb \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --region=us-west1 \
        --network=lb-network \
        --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'
    
  2. 使用範本建立一個地區性代管執行個體群組:

    gcloud compute instance-groups managed create 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 直接存取網際網路。

Console

  1. 前往 Google Cloud Platform Console 的「VM instances」(VM 執行個體) 頁面。
    前往「VM instances」(VM 執行個體) 頁面
  2. 針對每個後端 VM 重複執行以下步驟。
  3. 按一下後端 VM 的名稱 (例如 vm-a1) 以查看「VM instance details」(VM 執行個體詳細資料) 頁面。
  4. 按一下 [Edit] (編輯)
  5. 在「Network interfaces」(網路介面) 區段中,按一下 [Edit] (編輯) 按鈕。
  6. 在「External IP」(外部 IP) 彈出式視窗中,選擇 [None] (無),然後按一下 [Done] (完成)
  7. 按一下 [Save] (儲存)

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://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-west1-a/instances/v1-a1/deleteAccessConfig?accessConfig=external-nat&networkInterface=None

在多個通訊埠上接收流量

用於控制傳入流量之通訊埠的元件是內部轉送規則。本程序示範如何以在通訊埠 80 和 443 上接收流量的轉送規取代通訊埠 80 的轉送規則。建立後端 VM 時,安裝和設定 Apache 的開機指令碼也會將其設定為在通訊埠 443 上處理 HTTPS 流量。您必須替換轉送規則,因為 GCP 不支援更新轉送規則。

gcloud

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

    gcloud compute forwarding-rules delete fr-ilb \
        --region=us-west1
    
  2. 針對通訊埠 80 和 443 使用相同名稱建立替換轉送規則。這項規則的其他參數 (包括 IP 位址和後端服務) 都相同。

    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,443 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    
  3. 連線至用戶端 VM 執行個體並測試 HTTP 和 HTTPS 連線。

    • 連線至用戶端 VM:

      gcloud compute ssh vm-client --zone=us-west1-a
      
    • 測試 HTTP 連線:

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

      curl https://10.1.2.99 --insecure
      
    • 觀察 HTTP 要求 (在通訊埠 80 上) 和 HTTPS 要求 (在通訊埠 443 上) 是否都是由所有後端 VM 處理的。

使用工作階段相依性

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

本程序示範如何更新範例內部 TCP/UDP 負載平衡器的後端服務,以使其根據用戶端 IP 位址使用工作階段相依性。

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

Console

  1. 前往 Google Cloud Platform Console 的「Load balancing」(負載平衡) 頁面。
    前往「Load balancing」(負載平衡) 頁面
  2. 按一下 [be-ilb] (您為本範例建立的後端服務的名稱),然後按一下 [Edit] (編輯)
  3. 在「Edit Internal load balancer」(編輯內部負載平衡器) 頁面上,按一下 [Backend configuration] (後端設定)
  4. 從「Session affinity」(工作階段相依性) 彈出式選單中選取 [Client IP] (用戶端 IP)
  5. 按一下 [Update] (更新)

gcloud

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

gcloud compute backend-services update be-ilb \
    --session-affinity CLIENT_IP

API

regionBackendServices/patch 方法發出 PATCH 要求。

PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-west1/backendServices/be-ilb
{
  "sessionAffinity": "CLIENT_IP"
}

如要進一步瞭解如何使用工作階段相依性來影響流量分配情形,並取得每個選項的說明,請參閱流量分配一節。

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

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

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

  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
    
  3. 連線至用戶端 VM 執行個體,並測試連至 IP 位址的 HTTP 和 HTTPS 連線。

    • 連線至用戶端 VM:
    gcloud compute ssh vm-client --zone=us-west1-a
    
    • 測試連至 IP 位址的 HTTP 連線:
    curl http://10.1.2.99
    curl http://10.5.6.99
    
    • 測試 HTTPS 連線。由於範例設定中的 Apache 伺服器設定使用自行簽署的憑證,因此必須使用 --insecure
    curl https://10.1.2.99 --insecure
    curl https://10.5.6.99 --insecure
    
    • 觀察是否無論使用的通訊協定 (HTTP 或 HTTPS) 或 IP 位址為何,要求都是由所有後端 VM 處理的。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Load Balancing