为内部直通式网络负载均衡器配置故障切换

本指南通过示例,教您如何为 Google Cloud 内部直通式负载均衡器配置故障转移。在按照本指南进行操作之前,请先熟悉以下内容:

权限

要按照本指南进行操作,您需要在项目中创建实例并修改网络。您应该具有项目的 Owner 或 Editor 角色,或者应该具有以下 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Network Admin
添加和移除防火墙规则 Security Admin
创建实例 Compute Instance Admin

如需了解详情,请参阅以下指南:

设置

本指南介绍如何配置和测试使用故障切换的内部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:

  1. 带有自定义子网的示例 VPC 网络
  2. 允许后端虚拟机的传入连接的防火墙规则
  3. 后端虚拟机:
    • 区域 us-west1-a 中非代管实例组中的一个主后端
    • 区域 us-west1-c 中的非代管实例组中的一个故障转移后端
  4. 一个用于测试连接并观察故障切换行为的客户端虚拟机
  5. 以下内部直通网络负载均衡器组件:
    • 后端服务健康检查
    • us-west1 区域内的后端服务,用于管理后端虚拟机之间的连接分配
    • 负载平衡器前端的内部转发规则和内部 IP 地址

此示例的架构如下所示:

内部直通式网络负载均衡器的简单故障切换示例。
内部直通式网络负载均衡器的简单故障切换示例(点击可放大)。

在本示例中,主要后端和故障切换后端均使用了非代管式实例组。如需了解详情,请参阅支持的实例组

配置网络、区域和子网

本示例使用以下 VPC 网络、区域和子网:

  • 网络:网络为自定义模式 VPC 网络,名为 lb-network

  • 区域:区域为 us-west1

  • 子网:子网为 lb-subnet,使用 10.1.2.0/24 IP 地址范围。

如需创建示例网络和子网,请按照以下步骤操作。

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 输入 lb-network 作为名称

  4. 子网部分中执行以下操作:

    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称lb-subnet
      • 区域us-west1
      • IP 地址范围10.1.2.0/24
      • 点击完成
  5. 点击创建

gcloud

  1. 创建自定义 VPC 网络:

    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://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks

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

subnetworks.insert 方法发出 POST 请求。将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

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
}

配置防火墙规则

此示例使用以下防火墙规则:

  • fw-allow-lb-subnet:适用于 VPC 网络中所有目标的入站规则,允许来自 10.1.2.0/24 范围内来源的流量。此规则允许从 lb-subnet 内的任何来源向负载平衡实例(虚拟机)传入流量。

  • fw-allow-ssh:适用于负载平衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更强的来源 IP 地址范围;例如,您可以指定计划从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh 来标识防火墙规则应该应用到的虚拟机。

  • fw-allow-health-check:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识应该应用该规则的实例。

如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 点击创建防火墙规则并输入以下信息,以创建允许子网流量的规则:

    • 名称fw-allow-lb-subnet
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.1.2.0/24
    • 协议和端口:允许全部
  3. 点击创建

  4. 再次点击创建防火墙规则,以创建允许传入 SSH 连接的规则:

    • 名称fw-allow-ssh
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口:选择指定的协议和端口,然后输入 tcp:22
  5. 点击创建

  6. 第三次点击创建防火墙规则,以创建允许 Google Cloud 健康检查的规则:

    • 名称fw-allow-health-check
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围130.211.0.0/2235.191.0.0/16
    • 协议和端口:允许全部
  7. 点击创建

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 防火墙规则,允许通过 SSH 连接到网络标记为 allow-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-subnet 防火墙规则。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

POST https://compute.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 防火墙规则。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

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 防火墙规则。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

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
}

创建后端虚拟机和实例组

在此步骤中,您要创建后端虚拟机和非代管式实例组:

  • us-west1-a 中的实例组 ig-a 是包含两个虚拟机的主后端:
    • vm-a1
    • vm-a2
  • us-west1-c 中的实例组 ig-c 是包含两个虚拟机的故障切换后端:
    • vm-c1
    • vm-c2

为便于说明以及展示一个可用区发生故障时处理故障切换的方式,主后端和故障切换后端位于不同的可用区中。

各主虚拟机和备用虚拟机均配置为在 TCP 端口 80 和 443 上运行 Apache Web 服务器。我们为各虚拟机分配了 lb-subnet 内的一个内部 IP 地址,供客户端访问时使用;此外还分配了一个临时外部(公共)IP 地址,供 SSH 访问时使用。 如需了解移除外部 IP 地址的信息,请参阅从后端虚拟机移除外部 IP 地址

默认情况下,Apache 配置为绑定到任何 IP 地址。内部直通式网络负载均衡器通过保留目标 IP 地址来传送数据包。

确保在主虚拟机和备用虚拟机上运行的服务器软件在监听负载平衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 IP 地址。由内部直通式网络负载均衡器传送到后端虚拟机的数据包的目标 IP 地址是转发规则的内部 IP 地址。

为便于说明,所有主虚拟机和备用虚拟机均运行 Debian GNU/Linux 10。

控制台

创建后端虚拟机

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 使用以下名称和可用区组合重复执行以下步骤,以创建四个虚拟机。

    • 名称:vm-a1,可用区:us-west1-a
    • 名称:vm-a2,可用区:us-west1-a
    • 名称:vm-c1,可用区:us-west1-c
    • 名称:vm-c2,可用区:us-west1-c
  3. 点击创建实例

  4. 按照第 2 步中的说明设置名称

  5. 对于区域,选择 us-west1,然后按照第 2 步中的说明选择一个可用区

  6. 启动磁盘部分,确保所选映像为 Debian GNU/Linux 9 10 (buster)。如有必要,请点击选择更改映像。

  7. 点击高级选项

  8. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-health-checkallow-ssh
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网lb-subnet
  9. 点击管理。将以下脚本输入启动脚本字段。 所有四个虚拟机的脚本内容均相同:

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2
    
  10. 点击创建

创建实例组

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 使用以下组合重复执行下述步骤,以创建两个非代管式实例组,每个组包含两个虚拟机。

    • 实例组:ig-a,可用区:us-west1-a,虚拟机:vm-a1vm-a2
    • 实例组:ig-c,可用区:us-west1-c,虚拟机:vm-c1vm-c2
  3. 点击创建实例组

  4. 点击新建非代管式实例组

  5. 按照第 2 步中的说明设置名称

  6. 位置部分,为区域选择 us-west1,然后按照第 2 步中的说明选择一个可用区

  7. 对于网络,请输入 lb-network

  8. 对于子网,请输入 lb-subnet

  9. 虚拟机实例部分中,添加第 2 步中说明的虚拟机。

  10. 点击创建

gcloud

  1. 使用 VM_NAMEZONE 的下列四种组合运行以下命令四次,创建四个虚拟机。全部四个虚拟机的脚本内容均相同。

    • 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
          apt-get update
          apt-get install apache2 -y
          a2ensite default-ssl
          a2enmod ssl
          vm_hostname="$(curl -H "Metadata-Flavor:Google" \
          http://metadata.google.internal/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    
  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. 将虚拟机添加到相应的实例组中:

    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

instances.insert 方法发出四个 POST 请求,以创建四个后端虚拟机。

对于四个虚拟机,请使用以下虚拟机名称和地区:

  • VM_NAMEvm-a1ZONEus-west1-a
  • VM_NAMEvm-a2ZONEus-west1-a
  • VM_NAMEvm-c1ZONEus-west1-c
  • VM_NAMEvm-c2ZONEus-west1-c

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:实例的可用区
  • DEBIAN_IMAGE_NAME:实例的 Debian 映像的名称。您可以通过运行以下 gcloud 命令来获取当前的 DEBIAN_IMAGE_NAME

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

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\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\nsystemctl restart apache2"
     }
   ]
 },
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

instanceGroups.insert 方法发出一个 POST 请求,以创建两个实例组。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

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 请求,为每个实例组添加实例。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

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"
   }
 ]
}

创建客户端虚拟机

此示例在与负载平衡器相同的区域内创建一个客户端虚拟机 (vm-client)。该客户端用于演示故障切换的工作原理。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-client

  4. 可用区设置为 us-west1-a

  5. 点击高级选项

  6. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网lb-subnet
  7. 点击创建

gcloud

客户端虚拟机可以位于负载平衡器所在的同一区域的任何可用区中,并且可以使用该区域中的任何子网。在此示例中,客户端位于 us-west1-a 可用区,该客户端使用的子网与主虚拟机和备用虚拟机使用的子网相同。

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 请求。

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • DEBIAN_IMAGE_NAME:实例的 Debian 映像的名称。您可以通过运行以下 gcloud 命令来获取当前的 DEBIAN_IMAGE_NAME

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

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
}

配置负载均衡器组件

以下步骤会配置所有内部直通式网络负载均衡器组件,先配置健康检查和后端服务,然后配置前端组件:

  • 健康检查:本示例使用仅检查 HTTP 200 (OK) 响应的 HTTP 健康检查。如需了解详情,请参阅内部直通式网络负载均衡器概览的健康检查部分

  • 后端服务:由于本示例通过负载平衡器传递 HTTP 流量,因此配置中指定 TCP,而非 UDP。为演示故障切换,此后端服务的故障切换率为 0.75

  • 转发规则:本示例创建了一条内部转发规则。

  • 内部 IP 地址:在本示例中,我们在创建转发规则时指定了内部 IP 地址 10.1.2.99

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择直通式负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择内部,然后点击下一步
  6. 点击配置

基本配置

  1. 名称设置为 be-ilb
  2. 区域设置为 us-west1
  3. 网络设置为 lb-network
  4. 点击后端配置 并进行以下更改:
    1. 对于后端中的新建内容部分,选择 ig-a 实例组。确保未选中将此实例组作为备份的故障转移组。点击完成
    2. 点击添加后端。在显示的新建内容部分中,选择 ig-c 实例组。选中将此实例组作为备份的故障转移组。点击完成
    3. 对于健康检查,选择另创建一项健康检查,输入以下信息,然后点击保存并继续
      • 名称hc-http-80
      • 协议HTTP
      • 端口80
      • 代理协议NONE
      • 请求路径/ 请注意,当您使用 Google Cloud 控制台创建负载均衡器时,健康检查是全球性的。如果要创建地区性健康检查,请使用 gcloud 或 API。
    4. 点击高级配置。在故障切换政策部分中,配置以下各项:
      • 故障转移比率0.75
      • 选中在进行故障切换时启用连接排空
    5. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  5. 点击前端配置。在新建前端 IP 和端口部分,进行以下更改:
    1. 名称fr-ilb
    2. 子网ilb-subnet
    3. 内部 IP 中,选择保留静态内部 IP 地址,输入以下信息,然后点击保留
      • 名称ip-ilb
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.1.2.99
    4. 端口:选择单个,然后输入 80 作为端口号
    5. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  6. 点击检查并最终确定。仔细检查您的设置。
  7. 点击创建

gcloud

  1. 创建一个新的 HTTP 健康检查,以测试端口 80 上的虚拟机的 TCP 连接。

    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 \
        --failover-ratio 0.75
    
  3. 向后端服务添加主后端:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-a \
        --instance-group-zone=us-west1-a
    
  4. 将故障转移后端添加到后端服务:

    gcloud compute backend-services add-backend be-ilb \
        --region=us-west1 \
        --instance-group=ig-c \
        --instance-group-zone=us-west1-c \
        --failover
    
  5. 为后端服务创建转发规则。创建转发规则时,请指定 10.1.2.99 作为子网中的内部 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 \
        --backend-service=be-ilb \
        --backend-service-region=us-west1
    

API

regionHealthChecks.insert 方法发出 POST 请求,以创建健康检查。请将 PROJECT_ID 替换为您的项目 ID。

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 请求,以创建地区后端服务。 请将 PROJECT_ID 替换为您的项目 ID。

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"
    "failover": true
  }
],
"failoverPolicy": {
  "failoverRatio": 0.75
},
"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 请求,以创建转发规则。 请将 PROJECT_ID 替换为您的项目 ID。

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"
}

测试

这部分中的测试展示了如何验证负载平衡器配置并了解其预期行为。

客户端测试过程

此过程会从客户端虚拟机联系负载平衡器。您将利用此过程完成其他测试。

  1. 连接到客户端虚拟机实例。

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. 使用 curl 连接负载平衡器的 IP 地址,通过这种方式向负载平衡器发送 Web 请求。

    curl http://10.1.2.99
    
  3. 请注意 curl 命令返回的结果。该结果文本中显示了生成响应的后端虚拟机的名称,例如:Page served from: vm-a1

测试初始状态

在配置示例负载平衡器之后,全部四个后端虚拟机都应该保持良好的运行状况:

  • 两个主虚拟机:vm-a1vm-a2
  • 两个备用虚拟机:vm-c1vm-c2

遵循客户端测试过程执行操作。重复执行第 2 步多次。预期行为是:两个主虚拟机(vm-a1vm-a2)都传送流量,因为两者均运行状况良好。您应该看到两个主虚拟机各在大约一半的时间里提供响应,因为我们尚未为此平衡器配置会话粘性

测试故障转移

此测试模拟了 vm-a1 故障的情形,因此您可以观察故障转移行为。

  1. 连接到 vm-a1 虚拟机。

    gcloud compute ssh vm-a1 --zone=us-west1-a
    
  2. 停止 Apache Web 服务器。经过 10 秒之后,Google Cloud 会将此虚拟机视为运行状况不良。(您在设置过程中创建的 hc-http-80 健康检查使用 5 秒的默认检查间隔时间,以及连续两次探测失败的健康状况不良阈值。)

    sudo apachectl stop
    
  3. 遵循客户端测试过程执行操作。重复执行第 2 步多次。预期行为是:两个备用虚拟机(vm-c1vm-c2)都传送流量。因为只有 vm-a2 这一个主虚拟机运行状况良好,运行状况良好的主虚拟机与主虚拟机总数的比率为 0.5。 这个数字低于故障切换阈值(即 0.75),因此 Google Cloud 会重新配置负载均衡器的活跃池,使其使用备用虚拟机。只要我们尚未为此负载平衡器配置会话亲和性,您就应该看到两个备用虚拟机各在大约一半的时间里提供响应。

测试故障恢复

此测试通过重启位于 vm-a1 的 Apache 服务器模拟故障恢复。

  1. 连接到 vm-a1 虚拟机。

    gcloud compute ssh vm-a1 --zone=us-west1-a
    
  2. 启动 Apache Web 服务器并等待 10 秒钟。

    sudo apachectl start
    
  3. 遵循客户端测试过程执行操作。重复执行第 2 步多次。预期行为是:两个主虚拟机(vm-a1vm-a2)都传送流量。两个主虚拟机均健康状况良好,并且健康状况良好的主虚拟机与主虚拟机总数的比率为 1.0,高于故障切换阈值(即 0.75),因此 Google Cloud 将活跃池配置为再次使用主虚拟机。

添加更多后端虚拟机

本部分在前面的示例配置基础上进行了延伸,向负载平衡器添加了更多主虚拟机和备用虚拟机。为此,我们在本示例中额外创建了两个后端实例组,以演示您可以将主虚拟机和备用虚拟机分布设置在同一地区的多个不同区域中:

  • 第三个实例组(即 us-west1-c 中的 ig-d)用作具有如下两个虚拟机的主后端:
    • vm-d1
    • vm-d2
  • 第三个实例组(即 us-west1-a 中的 ig-b)用作具有如下两个虚拟机的故障切换后端:
    • vm-b1
    • vm-b2

经过修改后,此示例的修改架构如下所示:

多可用区内部直通式网络负载均衡器故障切换。
多可用区内部直通式网络负载均衡器故障切换(点击可放大)

创建额外的虚拟机和实例组

按照以下步骤创建额外的主虚拟机和备用虚拟机,以及与其对应的非代管式实例组。

控制台

创建后端虚拟机

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 使用以下名称和可用区组合重复执行以下步骤,以创建四个虚拟机。

    • 名称:vm-b1,可用区:us-west1-a
    • 名称:vm-b2,可用区:us-west1-a
    • 名称:vm-d1,可用区:us-west1-c
    • 名称:vm-d2,可用区:us-west1-c
  3. 点击创建实例

  4. 按照第 2 步中的说明设置名称

  5. 对于区域,选择 us-west1,然后按照第 2 步中的说明选择一个可用区

  6. 启动磁盘部分,确保所选映像为 Debian GNU/Linux 9 10 (buster)。如有必要,请点击选择更改映像。

  7. 点击高级选项并进行以下更改:

    • 点击网络并添加以下网络标记allow-sshallow-health-check
    • 点击网络接口下的修改按钮并进行以下更改,然后点击完成
      • 网络lb-network
      • 子网lb-subnet
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
    • 点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。所有四个虚拟机的脚本内容均相同:

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  8. 点击创建

创建实例组

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 使用这些组合重复执行以下步骤,以创建两个非代管式实例组,每个组包含两个虚拟机。

    • 实例组:ig-b,区域:us-west1-a,虚拟机:vm-b1vm-b2
    • 实例组:ig-d,可用区:us-west1-c,虚拟机:vm-d1vm-d2
  3. 点击创建实例组

  4. 点击新建非代管式实例组

  5. 按照第 2 步中的说明设置名称

  6. 位置部分,为区域选择 us-west1,然后按照第 2 步中的说明选择一个可用区

  7. 对于网络,请输入 lb-network

  8. 对于子网,请输入 lb-subnet

  9. 虚拟机实例部分中,添加第 2 步中说明的虚拟机。

  10. 点击创建

gcloud

  1. 使用 VM_NAMEZONE 的下列四种组合运行以下命令四次,创建四个虚拟机。全部四个虚拟机的脚本内容均相同。

    • VM_NAMEvm-b1ZONEus-west1-a
    • VM_NAMEvm-b2ZONEus-west1-a
    • VM_NAMEvm-d1ZONEus-west1-c
    • VM_NAMEvm-d2ZONEus-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
          apt-get update
          apt-get install apache2 -y
          a2ensite default-ssl
          a2enmod ssl
          vm_hostname="$(curl -H "Metadata-Flavor:Google" \
          http://metadata.google.internal/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
    
  2. 在每个可用区中创建两个非代管实例组:

    gcloud compute instance-groups unmanaged create ig-b \
        --zone=us-west1-a
    gcloud compute instance-groups unmanaged create ig-d \
        --zone=us-west1-c
    
  3. 将虚拟机添加到相应的实例组中:

    gcloud compute instance-groups unmanaged add-instances ig-b \
        --zone=us-west1-a \
        --instances=vm-b1,vm-b2
    gcloud compute instance-groups unmanaged add-instances ig-d \
        --zone=us-west1-c \
        --instances=vm-d1,vm-d2
    

API

instances.insert 方法发出四个 POST 请求,以创建四个后端虚拟机。

对于四个虚拟机,请使用以下虚拟机名称和地区:

  • VM_NAMEvm-b1ZONEus-west1-a
  • VM_NAMEvm-b2ZONEus-west1-a
  • VM_NAMEvm-d1ZONEus-west1-c
  • VM_NAMEvm-d2ZONEus-west1-c

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • DEBIAN_IMAGE_NAME:实例的 Debian 映像的名称。您可以通过运行以下 gcloud 命令来获取当前的 DEBIAN_IMAGE_NAME

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

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\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\nsystemctl restart apache2"
     }
   ]
 },
 "scheduling": {
   "preemptible": false
 },
 "deletionProtection": false
}

instanceGroups.insert 方法发出一个 POST 请求,以创建两个实例组。 请将 PROJECT_ID 替换为您的项目 ID。

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

{
 "name": "ig-b",
 "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-d",
 "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 请求,为每个实例组添加实例。 请将 PROJECT_ID 替换为您的项目 ID。

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

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

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

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

添加主后端

您可以将此过程用作模板,了解如何将非代管实例组作为主后端,添加到现有内部直通式网络负载均衡器的后端服务。此过程利用示例配置,向您展示如何将实例组 ig-d 作为主后端添加到 be-ilb 负载平衡器。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 负载平衡器标签页中,点击现有内部 TCP 或内部 UDP 负载平衡器的名称(在此示例中是 be-ilb)。

  3. 点击修改

  4. 后端配置中,点击添加后端并选择一个非代管式实例组(在此示例中是 ig-d)。

  5. 确保未选中将此实例组作为备份的故障转移组

  6. 点击完成,然后再点击更新

gcloud

使用以下 gcloud 命令将主后端添加到现有内部直通式网络负载均衡器的后端服务。

gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
   --instance-group INSTANCE_GROUP_NAME \
   --instance-group-zone INSTANCE_GROUP_ZONE \
   --region REGION

请替换以下内容:

  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称。对于此示例,请使用 ig-d
  • INSTANCE_GROUP_ZONE 是定义了该实例组的可用区。对于此示例,请使用 us-west1-c
  • REGION 是负载平衡器所在的区域。对于此示例,请使用 us-west1

API

使用 regionBackendServices.patch 方法将主后端添加到现有后端服务。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

{
  "backends":
  [
    {
      "balancingMode": "connection",
      "failover": false,
      "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/INSTANCE_GROUP_ZONE/instanceGroups/INSTANCE_GROUP_NAME"
    }
  ]
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION 是负载平衡器所在的区域。对于此示例,请使用 us-west1
  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称。对于此示例,请使用 ig-d
  • INSTANCE_GROUP_ZONE:定义了该实例组的区域。对于此示例,请使用 us-west1-c

添加故障切换后端

您可以将此过程用作模板,了解如何将非代管实例组作为故障切换后端,添加到现有内部直通式网络负载均衡器的后端服务。此过程利用示例配置,向您展示如何将实例组 ig-b 作为故障切换主后端添加到 be-ilb 负载均衡器。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 负载均衡器标签页中,点击 TCP/UDP(内部)类型的现有负载均衡器的名称(在此示例中为 be-ilb)。

  3. 点击修改

  4. 后端配置中,点击添加后端并选择一个非代管式实例组(在此示例中是 ig-b)。

  5. 选中将此实例组作为备份的故障转移组

  6. 点击完成,然后再点击更新

gcloud

使用以下 gcloud 命令将故障切换后端添加到现有内部直通式网络负载均衡器的后端服务。

gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
   --instance-group INSTANCE_GROUP_NAME \
   --instance-group-zone INSTANCE_GROUP_ZONE \
   --region REGION \
   --failover

请替换以下内容:

  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称。对于此示例,请使用 ig-b
  • INSTANCE_GROUP_ZONE 是定义了该实例组的可用区。对于此示例,请使用 us-west1-a
  • REGION 是负载平衡器所在的地区。 对于此示例,请使用 us-west1

API

使用 regionBackendServices.patch 方法将故障切换后端添加到现有后端服务。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

{
  "backends":
  [
    {
      "balancingMode": "connection",
      "failover": true,
      "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/INSTANCE_GROUP_ZONE/instanceGroups/INSTANCE_GROUP_NAME"
    }
  ]
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称。对于此示例,请使用 ig-b
  • INSTANCE_GROUP_ZONE 是定义了该实例组的可用区。对于此示例,请使用 us-west1-a
  • REGION 是负载平衡器所在的区域。对于此示例,请使用 us-west1

转换主后端或故障切换后端

您可以将主后端转换为故障切换后端,反之亦然,而且不需要从内部直通式网络负载均衡器的后端服务中移除实例组。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 负载均衡器标签页中,点击类型为 TCP/UDP (内部)的现有负载均衡器的名称。

  3. 点击修改

  4. 后端配置中,点击一个后端实例组的名称。然后:

    • 如需将此实例组设为故障转移后端,请选中将此实例组作为备份的故障转移组
    • 如需将此实例组设为主后端,请取消选中将此实例组作为备份的故障切换组
  5. 点击完成,然后再点击更新

gcloud

使用以下 gcloud 命令将现有主后端转换为故障转移后端:

gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
   --instance-group INSTANCE_GROUP_NAME \
   --instance-group-zone INSTANCE_GROUP_ZONE \
   --region REGION \
   --failover

使用以下 gcloud 命令将现有故障切换后端转换为主后端:

gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
   --instance-group INSTANCE_GROUP_NAME \
   --instance-group-zone INSTANCE_GROUP_ZONE \
   --region REGION \
   --no-failover

请替换以下内容:

  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称
  • INSTANCE_GROUP_ZONE:定义了该实例组的可用区
  • REGION:负载平衡器所在的地区

API

使用 regionBackendServices.patch 方法将主后端转换为故障切换后端,反之亦然。

将主后端转换为故障切换后端的方法如下:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

{
  "backends":
  [
    {
      "failover": true,
      "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/INSTANCE_GROUP_ZONE/instanceGroups/INSTANCE_GROUP_NAME"
    }
  ]
}

将故障切换后端转换为主后端的方法如下:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

{
  "backends":
  [
    {
      "failover": false,
      "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/INSTANCE_GROUP_ZONE/instanceGroups/INSTANCE_GROUP_NAME"
    }
  ],
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称
  • INSTANCE_GROUP_NAME:要作为主后端添加的实例组的名称
  • INSTANCE_GROUP_ZONE:定义了该实例组的可用区
  • REGION:负载平衡器所在的地区

配置故障转移政策

这部分介绍了如何为内部直通式网络负载均衡器的后端服务管理故障切换政策。故障切换政策包含以下内容:

  • 故障切换比率
  • 当所有后端虚拟机运行状况都不佳时舍弃流量
  • 在进行故障切换时排空连接

如需详细了解故障切换政策的参数,请参阅:

定义故障切换政策

以下说明介绍如何为现有的内部直通式网络负载均衡器定义故障切换政策。

控制台

如需使用 Google Cloud 控制台定义故障切换政策,您必须至少具有一个故障切换后端。

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 负载均衡器标签页中,点击类型为 TCP/UDP(内部)的现有负载均衡器的名称。

  3. 点击修改

  4. 确保您至少有一个故障切换后端。至少必须有一个负载均衡器的后端已选中将此实例组作为备份的故障切换组

  5. 点击高级配置

    • 对于故障切换政策,将故障切换比率设置为介于 0.01.0 之间的值。
    • 如果要在所有活跃虚拟机和所有备用虚拟机运行状况不佳时舍弃流量,请选中启用舍弃流量旁边的复选框。
    • 如果您希望在故障切换过程中快速终止现有连接,请选中在进行故障切换时启用连接排空旁边的复选框。
  6. 点击检查并最终确定,然后点击更新

gcloud

如需使用 gcloud CLI 定义故障切换政策,请更新负载均衡器的后端服务:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
   --region REGION \
   --failover-ratio FAILOVER_RATIO \
   --drop-traffic-if-unhealthy \
   --no-connection-drain-on-failover

替换以下内容:

  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • REGION 是负载平衡器所在的区域。对于此示例,请使用 us-west1
  • FAILOVER_RATIO:故障切换比率。可能的值介于 0.01.0 之间。对于此示例,请使用 0.75
  • 如果所有主虚拟机和所有备用虚拟机均运行状况不佳时,--drop-traffic-if-unhealthy 会指示负载平衡器舍弃流量。如果要在所有后端虚拟机运行状况不佳时,将流量分配到所有主虚拟机之间,请将此值更改为 --no-drop-traffic-if-unhealthy
  • --no-connection-drain-on-failover 指示负载均衡器在故障切换期间快速终止现有的 TCP 连接。使用 --connection-drain-on-failover 在进行故障切换时启用连接排空。

API

使用 regionBackendServices.patch 方法定义故障切换政策。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

{
  "failoverPolicy":
  {
    "failoverRatio": FAILOVER_RATIO,
    "dropTrafficIfUnhealthy": [true|false],
    "disableConnectionDrainOnFailover": [true|false]
  }
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION:负载平衡器所在的地区
  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称
  • FAILOVER_RATIO:故障切换比率。可能的值介于 0.01.0 之间。
  • dropTrafficIfUnhealthy 设置为 true 会指示负载平衡器在所有主虚拟机和所有备用虚拟机运行状况不佳时舍弃流量。如果要在所有后端虚拟机运行状况不佳时,将流量分配到所有主虚拟机之间,请将此值设置为 false
  • disableConnectionDrainOnFailover 设置为 true 会指示负载均衡器在执行故障切换时快速终止现有的 TCP 连接。将此值设置为 false 即可在进行故障切换时启用连接排空。

查看故障切换政策

以下说明介绍如何查看内部直通式网络负载均衡器的现有故障切换政策。

控制台

在您修改内部直通式网络负载均衡器时,Google Cloud 控制台会显示现有故障切换政策的设置。如需查看相关说明,请参阅定义故障转移政策

gcloud

如需使用 gcloud CLI 列出故障切换政策设置,请使用以下命令。故障切换政策中的未定义设置会使用默认的故障切换政策值

gcloud compute backend-services describe BACKEND_SERVICE_NAME \
   --region REGION \
   --format="get(failoverPolicy)"

请替换以下内容:

  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称
  • REGION:负载平衡器所在的地区

API

使用 regionBackendServices.get 方法查看故障切换政策。

对此 API 请求的响应中会显示故障转移政策。下面显示了一个示例。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/backendServices/BACKEND_SERVICE_NAME

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION:负载平衡器所在的地区
  • BACKEND_SERVICE_NAME:负载平衡器的后端服务的名称
{
...
"failoverPolicy": {
  "disableConnectionDrainOnFailover": false,
  "dropTrafficIfUnhealthy": false,
  "failoverRatio": 0.75
...
}

后续步骤