为内部 TCP/UDP 负载平衡配置故障转移

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

权限

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

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

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

设置

本指南介绍如何配置和测试使用故障转移的内部 TCP/UDP 负载平衡器。此部分中的步骤介绍了如何配置以下内容:

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

此示例的架构如下所示:

内部 TCP/UDP 负载平衡的简单故障转移示例(点击可放大)
内部 TCP/UDP 负载平衡的简单故障转移示例(点击放大)

配置网络、地区和子网

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

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

  • 地区:地区为 us-west1

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

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

控制台

  1. 转到 Google Cloud Console 中的“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
    

配置防火墙规则

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

  • 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 Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则并输入以下信息,以创建允许子网流量的规则:
    • 名称fw-allow-lb-subnet
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围10.1.2.0/24
    • 协议和端口:允许全部
  3. 点击创建
  4. 再次点击创建防火墙规则,以创建允许传入 SSH 连接的规则:
    • 名称fw-allow-ssh
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围0.0.0.0/0
    • 协议和端口:选择指定的协议和端口,然后输入 tcp:22
  5. 点击创建
  6. 第三次点击创建防火墙规则,以创建允许 Google Cloud 运行状况检查的规则:
    • 名称fw-allow-health-check
    • 网络lb-network
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:指定的目标标记
    • 目标标记allow-health-check
    • 来源过滤条件IP ranges
    • 来源 IP 地址范围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
    

创建后端虚拟机和实例组

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

  • 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 地址。内部 TCP/UDP 负载平衡器通过保留目的地 IP 地址来传送数据包。

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

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

控制台

创建后端虚拟机

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  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 Stretch。如有必要,请点击选择更改映像。
  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://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  8. 点击创建

创建实例组

  1. 转到 Google Cloud Console 中的“实例组”页面。
    转到“实例组”页面
  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-NAME][ZONE] 的下列四种组合运行以下命令四次,创建四个虚拟机。全部四个虚拟机的脚本内容均相同。

    • [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. 将虚拟机添加到相应的实例组中:

    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
    

创建客户端虚拟机

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

控制台

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 名称设置为 vm-client
  4. 区域设置为 us-west1-a
  5. 点击管理、安全、磁盘、网络、单独租用并进行以下更改:
    • 点击网络并将 allow-ssh 添加到网络标记
    • 点击网络接口下的修改按钮并进行以下更改,然后点击完成
      • 网络lb-network
      • 子网lb-subnet
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
  6. 点击创建

gcloud

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

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

配置负载平衡器组件

以下步骤会配置所有内部 TCP/UDP 负载平衡器组件,从运行状况检查和后端服务到前端组件:

  • 运行状况检查:本示例使用仅检查 HTTP 200 (OK) 响应的 HTTP 运行状况检查。如需了解详情,请参阅内部 TCP/UDP 负载平衡概览中的“运行状况检查”部分

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

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

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

控制台

创建负载平衡器并配置后端服务

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

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
    

测试

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

客户端测试过程

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

  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

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

多区域内部 TCP/UDP 负载平衡故障转移(点击放大)
多区域内部 TCP/UDP 负载平衡故障转移(点击放大)

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

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

控制台

创建后端虚拟机

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  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 Stretch。如有必要,请点击选择更改映像。
  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://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  8. 点击创建

创建实例组

  1. 转到 Google Cloud Console 中的“实例组”页面。
    转到“实例组”页面
  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-NAME][ZONE] 的下列四种组合运行以下命令四次,创建四个虚拟机。全部四个虚拟机的脚本内容均相同。

    • [VM-NAME]vm-b1[ZONE]us-west1-a
    • [VM-NAME]vm-b2[ZONE]us-west1-a
    • [VM-NAME]vm-d1[ZONE]us-west1-c
    • [VM-NAME]vm-d2[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-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
    

添加主后端

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

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 负载平衡器标签页中,点击现有内部 TCP 或内部 UDP 负载平衡器的名称(在此示例中是 be-ilb)。
  3. 点击修改
  4. 后端配置中,点击添加后端并选择一个非代管式实例组(在此示例中是 ig-d)。
  5. 确保未选中将此实例组作为备份的故障转移组
  6. 点击完成,然后再点击更新

gcloud

使用以下 gcloud 命令将主后端添加到现有内部 TCP/UDP 负载平衡器的后端服务。

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://www.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_ZONE] 是定义了该实例组的区域。 对于此示例,请使用 us-west1-c
  • [INSTANCE_GROUP_NAME] 是要作为主后端添加的实例组的名称。对于此示例,请使用 ig-d

添加故障转移后端

您可以将此过程用作模板,了解如何将非代管实例组作为故障转移后端,添加到现有内部 TCP/UDP 负载平衡器的后端服务。此过程利用示例配置,向您展示如何将实例组 ig-b 作为故障转移主后端添加到 be-ilb 负载平衡器。

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 负载平衡器标签页中,点击现有内部 TCP 或内部 UDP 负载平衡器的名称(在此示例中是 be-ilb)。
  3. 点击修改
  4. 后端配置中,点击添加后端并选择一个非代管式实例组(在此示例中是 ig-b)。
  5. 选中将此实例组作为备份的故障转移组
  6. 点击完成,然后再点击更新

gcloud

使用以下 gcloud 命令将故障转移后端添加到现有内部 TCP/UDP 负载平衡器的后端服务。

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://www.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。
  • [REGION] 是负载平衡器所在的地区。对于此示例,请使用 us-west1
  • [BACKEND_SERVICE_NAME] 是负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • [INSTANCE_GROUP_ZONE] 是定义了该实例组的区域。 对于此示例,请使用 us-west1-a
  • [INSTANCE_GROUP_NAME] 是要作为故障转移后端添加的实例组的名称。对于此示例,请使用 ig-b

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

您可以将主后端转换为故障转移后端,反之亦然,而且不需要从内部 TCP/UDP 负载平衡器的后端服务中移除实例组。

控制台

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  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://www.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://www.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。
  • [REGION] 是负载平衡器所在的地区。
  • [BACKEND_SERVICE_NAME] 是负载平衡器的后端服务的名称。
  • [INSTANCE_GROUP_ZONE] 是定义了该实例组的区域。
  • [INSTANCE_GROUP_NAME] 是实例组的名称。

配置故障转移政策

这部分介绍了如何为内部 TCP/UDP 负载平衡器的后端服务管理故障转移政策。故障转移政策包含以下内容:

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

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

定义故障转移政策

以下说明介绍了如何为现有内部 TCP/UDP 负载平衡器定义故障转移政策。

控制台

如需使用 Cloud Console 定义故障转移政策,您必须至少具有一个故障转移后端。

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 负载平衡器标签页中,选择 TCP(内部)UDP(内部)负载平衡器。
  3. 点击修改
  4. 确保您至少有一个故障转移后端。至少必须有一个负载平衡器的后端已选中将此实例组作为备份的故障转移组
  5. 点击高级配置
    • 故障转移政策下,将故障转移比率设置为介于 0.01.0 之间的值。
    • 如果要在所有活跃虚拟机和所有备用虚拟机运行状况不佳时舍弃流量,请选中启用舍弃流量旁边的复选框。
    • 如果您希望在故障转移过程中快速终止现有连接,请选中在进行故障转移时启用连接排空旁边的复选框。
  6. 点击检查并最终确定,然后点击更新

gcloud

如需使用 gcloud 命令行工具定义故障转移政策,请更新负载平衡器的后端服务如下:

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://www.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 即可在进行故障转移时启用连接排空。

查看故障转移政策

以下说明介绍了如何查看内部 TCP/UDP 负载平衡器的现有故障转移政策。

控制台

当您修改内部 TCP/UDP 负载平衡器时,Cloud Console 会显示现有故障转移政策的设置。如需查看相关说明,请参阅定义故障转移政策

gcloud

如需使用 gcloud 命令行工具列出故障转移政策的设置,请使用以下命令。故障转移政策中的未定义设置会使用默认的故障转移政策值

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

其中:

  • [BACKEND_SERVICE_NAME] 是负载平衡器的后端服务的名称。对于此示例,请使用 be-ilb
  • [REGION] 是负载平衡器所在的地区。对于此示例,请使用 us-west1

api

使用 regionBackendServices.get 方法查看故障转移政策。

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

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

后续步骤