为第三方设备设置内部 TCP/UDP 负载平衡

本指南使用一个示例来教您如何将 Google Cloud 内部 TCP/UDP 负载平衡器配置为下一个跃点。在按照本指南进行操作之前,请先熟悉以下内容:

权限

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

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

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

负载平衡到单个后端 NIC

本指南将向您介绍如何使用内部 TCP/UDP 负载平衡器作为自定义静态路由的下一个跃点,以集成横向扩容的虚拟设备。

本指南中讨论的解决方案集成了虚拟设备,因此您无需明确重新配置客户端以向每个虚拟设备发送流量。本设置指南中的示例通过一组负载平衡的防火墙虚拟设备发送所有流量。

本部分中的步骤介绍了如何配置以下资源:

  • 示例 VPC 网络和自定义子网
  • 允许目标为后端虚拟机的传入连接的 Google Cloud 防火墙规则
  • 自定义静态路由
  • 一个用于测试连接的客户端虚拟机
  • 以下内部 TCP/UDP 负载平衡器组件:
    • 托管实例组中的后端虚拟机
    • 后端虚拟机设备的运行状况检查
    • us-west1 区域内的后端服务,用于管理后端虚拟机之间的连接分配
    • 负载平衡器前端的内部转发规则和内部 IP 地址

拓扑如下所示:

内部 TCP/UDP 负载平衡的下一个跃点单一 NIC 示例(点击可放大)
内部 TCP/UDP 负载平衡的下一个跃点单一 NIC 示例(点击可放大)

该图显示了该示例创建的一些资源:

  • 内部 TCP/UDP 负载平衡器(在此示例中为 fr-ilb1)后面的应用实例(本例中为运行防火墙设备软件的虚拟机)。应用实例仅具有内部 IP 地址。
  • 每个应用实例都启用了其 can-ip-forward 标志。如果没有此标志,则 Compute Engine 虚拟机只能在数据包的来源 IP 地址与虚拟机的某个 IP 地址匹配时传输数据包。can-ip-forward 标志会更改此行为,以便虚拟机能够传输任何来源 IP 地址的数据包。
  • 目标为 10.50.1.0/24 且下一个跃点设置为负载平衡器的转发规则 fr-ilb1自定义静态路由

该图还显示了流量:

  • testing VPC 网络流量的自定义静态路由指向 10.50.1.0/24 子网。此路由会将流量定向到负载平衡器。
  • 负载平衡器根据配置的会话粘性将流量转发到某个应用实例。(会话粘性仅影响 TCP 流量。)
  • 应用实例执行来源网络地址转换 (SNAT),以将数据包递送给 production VPC 网络中的实例组。对于返回流量,它会执行目标网络地址转换 (DNAT),以将数据包递送给 testing VPC 网络中的客户端实例。

如需获取其他用例,请参阅内部 TCP/UDP 负载平衡器作为下一个跃点

配置网络、区域和子网

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

  • 网络:此示例需要两个网络,并且每个网络至少具有一个子网。每个后端第三方设备虚拟机必须具有至少两个网络接口,这些接口的分布情况为每个 VPC 网络中一个。此示例中的网络是名为 testingproduction自定义模式 VPC 网络。此示例中的 testing 网络包含客户端和负载平衡器。production 网络包含目标目标虚拟机。

  • 区域:子网位于 us-west1 区域。由于虚拟机实例是地区资源,因此子网必须位于同一区域。

  • 子网:子网 testing-subnetproduction-subnet 分别使用 10.30.1.0/2410.50.1.0/24 主要 IP 地址范围。

要创建示例网络和子网,请按以下步骤进行操作。

控制台

创建 testing 网络和 testing-subnet

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 testing 作为名称
  4. 子网部分中执行以下操作:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称testing-subnet
      • 地区us-west1
      • IP 地址范围10.30.1.0/24
      • 点击完成
  5. 点击创建

创建 production 网络和 production-subnet

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 输入 production 作为名称
  4. 子网部分中执行以下操作:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称production-subnet
      • 地区us-west1
      • IP 地址范围10.50.1.0/24
      • 点击完成
  5. 点击创建

gcloud

  1. 创建自定义 VPC 网络:

    gcloud compute networks create testing --subnet-mode=custom
    
    gcloud compute networks create production --subnet-mode=custom
    
  2. us-west1 区域的 testingproduction 网络中创建子网:

    gcloud compute networks subnets create testing-subnet \
        --network=testing \
        --range=10.30.1.0/24 \
        --region=us-west1
    
    gcloud compute networks subnets create production-subnet \
        --network=production \
        --range=10.50.1.0/24 \
        --region=us-west1
    

配置防火墙规则

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

  • fw-allow-testing-subnet:一种适用于 testing 网络中所有目标的入站流量规则,允许来自 10.30.1.0/24 范围内的来源的流量。此规则允许 testing-subnet 中的虚拟机实例和第三方虚拟机设备进行通信。

  • fw-allow-production-subnet:一种适用于 production 网络中所有目标的入站流量规则,允许来自 10.50.1.0/24 范围内的来源的流量。此规则允许 production-subnet 中的虚拟机实例和第三方虚拟机设备进行通信。

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

  • fw-allow-production-ssh:一种应用于 production VPC 网络中虚拟机实例的入站流量规则,允许从任意地址连接到 TCP 端口 22 的传入 SSH 连接。与 fw-allow-testing-ssh 规则类似,您可以为此规则选择限制性更高的来源 IP 地址范围。

  • fw-allow-health-check:一种适用于负载平衡的第三方虚拟机设备的入站流量规则,允许来自 Google Cloud 运行状况检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识该规则应应用于的实例。

如果没有这些防火墙规则,则默认的拒绝入站规则会阻止到后端实例的传入流量。您必须创建防火墙规则,以允许从 Google Cloud 探测系统的 IP 地址范围进行运行状况检查。如需了解详情,请参阅探测 IP 地址范围

控制台

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

gcloud

  1. 创建 fw-allow-testing-subnet 防火墙规则以允许与子网通信:

    gcloud compute firewall-rules create fw-allow-testing-subnet \
        --network=testing \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.30.1.0/24 \
        --rules=tcp,udp,icmp
    
  2. 创建 fw-allow-production-subnet 防火墙规则以允许与子网通信:

    gcloud compute firewall-rules create fw-allow-production-subnet \
        --network=production \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.50.1.0/24 \
        --rules=tcp,udp,icmp
    
  3. 创建 fw-allow-testing-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源

    gcloud compute firewall-rules create fw-allow-testing-ssh \
        --network=testing \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  4. 创建 fw-allow-production-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。

    gcloud compute firewall-rules create fw-allow-production-ssh \
        --network=production \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  5. 创建 fw-allow-health-check 规则,允许 Google Cloud 对 testing 网络中的第三方设备虚拟机进行运行状况检查。

    gcloud compute firewall-rules create fw-allow-testing-health-check \
        --network=testing \
        --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
    

创建第三方虚拟设备

以下步骤演示了如何使用 iptables 软件作为第三方虚拟设备来创建实例模板和托管式区域实例组。

控制台

您必须使用 gcloud 执行此步骤,因为您需要创建具有多个网络接口的实例模板。Cloud Console 目前不支持创建具有多个网络接口的实例模板。

gcloud

  1. 为您的第三方虚拟设备创建实例模板。该实例模板必须包含 --can-ip-forward 标志,以便从该模板创建的虚拟机实例能够转发来自 testingproduction 网络中其他实例的数据包。

    gcloud compute instance-templates create third-party-template \
        --region=us-west1 \
        --network-interface subnet=testing-subnet,address="" \
        --network-interface subnet=production-subnet \
        --tags=allow-ssh,allow-health-check \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --can-ip-forward \
        --metadata=startup-script='#! /bin/bash
        # Enable IP forwarding:
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-iptables.conf
        # Read VM network configuration:
        md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
        md_net="$md_vm/network-interfaces"
        nic0_gw="$(curl -H "Metadata-Flavor:Google" $md_net/0/gateway)"
        nic0_mask="$(curl -H "Metadata-Flavor:Google" $md_net/0/subnetmask)"
        nic1_gw="$(curl -H "Metadata-Flavor:Google" $md_net/1/gateway)"
        nic1_mask="$(curl -H "Metadata-Flavor:Google" $md_net/1/subnetmask)"
        nic1_addr="$(curl -H "Metadata-Flavor:Google" $md_net/1/ip)"
        # Start iptables:
        /sbin/iptables -t nat -F
        /sbin/iptables -t nat -A POSTROUTING \
        -s "$nic0_gw/$nic0_mask" \
        -d "$nic1_gw/$nic1_mask" \
        -o eth1 \
        -j SNAT \
        --to-source "$nic1_addr"
        /sbin/iptables-save
        # Use a web server to pass the health check for this example.
        # You should use a more complete test in production.
        apt-get update
        apt-get install apache2 -y
        a2ensite default-ssl
        a2enmod ssl
        echo "Example web page to pass health check" | \
        tee /var/www/html/index.html
        systemctl restart apache2'
    
  2. 为您的第三方虚拟设备创建托管实例组。 此命令会在 us-west1 中创建一个稍后可对其进行自动扩缩的区域托管实例组。

    gcloud compute instance-groups managed create third-party-instance-group \
        --region=us-west1 \
        --template=third-party-template \
        --size=3
    

创建负载平衡资源

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

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

  • 后端服务:虽然此示例的后端服务指定了 TCP 协议,但当负载平衡器是路由的下一个跃点时,TCP 和 UDP 流量都会发送到负载平衡器的后端。

  • 转发规则:虽然此示例转发规则指定了 TCP 端口 80,但当负载平衡器是路由的下一个跃点时,任何 TCP 或 UDP 端口上的流量都会发送到负载平衡器的后端。

  • 内部 IP 地址:此示例为转发规则指定了内部 IP 地址 10.30.1.99

控制台

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

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. 点击创建负载平衡器
  3. TCP 负载平衡下,点击开始配置
  4. 面向互联网或仅限内部下选择仅在我的虚拟机之间
  5. 点击继续
  6. 名称设置为 ilb1
  7. 点击后端配置 并进行以下更改:
    1. 地区us-west1
    2. 网络testing
    3. 后端下的新建内容部分,选择 third-party-instance-group 实例组,然后点击完成
    4. 运行状况检查中,选择另创建一项运行状况检查,输入以下信息,然后点击保存并继续
      • 名称hc-http-80
      • 协议HTTP
      • 端口80
      • 代理协议NONE
      • 请求路径/ 请注意,当您使用 Cloud Console 创建负载平衡器时,运行状况检查是全球性的。如果要创建地区性运行状况检查,请使用 gcloud 或 API。
    5. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  8. 点击前端配置。在新建前端 IP 和端口部分,进行以下更改:
    1. 名称fr-ilb1
    2. 子网testing-subnet
    3. 内部 IP 中,选择保留静态内部 IP 地址,输入以下信息,然后点击保留
      • 名称ip-ilb
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.30.1.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. us-west1 区域中创建内部后端服务。

    gcloud compute backend-services create ilb1 \
        --health-checks-region=us-west1 \
        --load-balancing-scheme=internal \
        --region=us-west1 \
        --health-checks=hc-http-80
    
  3. 将包含第三方虚拟设备的实例组添加为后端服务的后端。

    gcloud compute backend-services add-backend ilb1 \
        --instance-group=third-party-instance-group \
        --instance-group-region=us-west1 \
        --region=us-west1
    
  4. 创建内部转发规则并将其连接到后端服务,以完成负载平衡器配置。请记住,当负载均衡器被用作路由的下一跃点时,负载均衡器的协议 (TCP) 和端口 (80) 不会限制转发到后端实例(第三方虚拟设备)的端口和协议。

    gcloud compute forwarding-rules create fr-ilb1 \
        --load-balancing-scheme=internal \
        --ports=80 \
        --network=testing \
        --subnet=testing-subnet \
        --region=us-west1 \
        --backend-service=ilb1 \
        --address=10.30.1.99
    

创建将负载平衡器定义为下一个跃点的静态路由

创建静态路由时,不能使用 next-hop-address 指向负载平衡器的转发规则的 IP 地址。这是因为在使用 next-hop-address 时,Google Cloud 会将流量传递给分配给该 IP 地址的虚拟机实例,而负载平衡器并不是虚拟机实例。如果您想将负载平衡器指定为下一个跃点,则必须改为使用 next-hop-ilb 标志,如此示例中所示。

控制台

  1. 转到 Google Cloud Console 中的“路由”页面。
    转到“路由”页面
  2. 点击创建路由
  3. 对于路由名称,输入`ilb-nhop-dest-10-50-1。
  4. 选择 testing 网络。
  5. 对于目标 IP 地址范围,输入 10.50.1.0/24
  6. 请确保未指定标记,因为此功能目前不支持标记。
  7. 对于路由的下一个跃点,选择 Specify a forwarding rule internal TCP/UDP load balancer(指定转发规则内部 TCP/UDP 负载平衡器)。
  8. 对于下一个跃点区域,选择 us-west1
  9. 对于转发规则名称,选择 fr-ilb1
  10. 点击创建

gcloud

创建一个下一个跃点设置为负载平衡器的转发规则且目标范围设置为路由 10.50.1.0/24 的高级路由。

gcloud compute routes create ilb-nhop-dest-10-50-1 \
    --network=testing \
    --destination-range=10.50.1.0/24 \
    --next-hop-ilb=fr-ilb1 \
    --next-hop-ilb-region=us-west1

创建 testing 虚拟机实例

此示例会在 testing VPC 网络的 testing-subnet (10.30.1.0/24) 中创建一个 IP 地址为 10.30.1.100 的虚拟机实例。

gcloud

  1. 通过运行以下命令来创建 testing-vm

    gcloud compute instances create testing-vm \
        --zone=us-west1-a \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --tags=allow-ssh \
        --subnet=testing-subnet \
        --private-network-ip 10.30.1.100 \
        --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'
    

创建 production 虚拟机实例

此示例会在 production VPC 网络的 production-subnet (10.50.1.0/24) 中创建一个 IP 地址为 10.50.1.100 的虚拟机实例。

gcloud

production-vm 可以位于负载平衡器所在区域的任何地区中,并且可以使用该区域中的任何子网。在此示例中,production-vm 位于 us-west1-a 地区。

  1. 通过运行以下命令来创建 production-vm

    gcloud compute instances create production-vm \
        --zone=us-west1-a \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --tags=allow-ssh \
        --subnet=production-subnet \
        --private-network-ip 10.50.1.100 \
        --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'
    

测试单一 NIC 部署的负载平衡

此测试从 testing VPC 网络中的客户端虚拟机联系 production VPC 网络中的示例目标虚拟机。负载平衡器用作下一个跃点,因为它通过负载平衡器路由目标为 10.50.1.100 的数据包,而不是将其发送到负载平衡器的 IP 地址。

在此示例中,负载平衡器的运行状况良好的后端设备虚拟机上的 iptables 软件会处理数据包的 NAT。

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

    gcloud compute ssh testing-vm --zone=us-west1-a
    
  2. 使用 curl 向目标实例的 Web 服务器软件发出 Web 请求。预期输出是目标实例上索引页面的内容 (Page served from: destination-instance)。

    curl http://10.50.1.100
    

针对常见后端将内部 TCP/UDP 负载平衡器设置为下一个跃点

您可以通过对多个后端 NIC 执行负载平衡来扩展示例,如负载平衡到多个 NIC 中所述。

内部 TCP/UDP 负载平衡的下一个跃点多 NIC 详细示例(点击可放大)
内部 TCP/UDP 负载平衡的下一个跃点多 NIC 详细示例(点击可放大)
  1. 创建 fw-allow-production-health-check 防火墙规则,允许 Google Cloud 对 production 网络中的第三方设备虚拟机进行运行状况检查。

    gcloud compute firewall-rules create fw-allow-production-health-check \
        --network=production \
        --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
    
  2. 创建新的实例模板。

    为使此设置能与运行状况检查无缝搭配使用,您必须配置基于政策的路由,以确保出站流量运行状况检查响应数据包通过正确的接口传出。运行状况检查使用外部 IP 地址作为运行状况检查探针的来源。客机操作系统根据目标 IP 地址选择传出的 NIC。如果目标 IP 地址不在子网范围内,则传出的 NIC 默认为 nic0。在这些情况下,您必须使用基于政策的路由为各网络接口配置单独的路由表。

    请注意,基于来源的政策路由不适用于 Windows 或 Mac 操作系统。

    在后端虚拟机模板中,添加以下政策路由,其中 10.50.1.0/24 是负载平衡器的子网和多 NIC 虚拟机的 eth1。默认网关为 10.50.1.1

    gcloud compute instance-templates create third-party-template-multinic \
        --region=us-west1 \
        --network-interface subnet=testing-subnet,address="" \
        --network-interface subnet=production-subnet \
        --tags=allow-ssh,allow-health-check \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --can-ip-forward \
        --metadata=startup-script='#! /bin/bash
        # Enable IP forwarding:
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-iptables.conf
        # Read VM network configuration:
        md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
        md_net="$md_vm/network-interfaces"
        nic0_gw="$(curl $md_net/0/gateway -H "Metadata-Flavor:Google" )"
        nic0_mask="$(curl $md_net/0/subnetmask -H "Metadata-Flavor:Google")"
        nic0_addr="$(curl $md_net/0/ip -H "Metadata-Flavor:Google")"
        nic1_gw="$(curl $md_net/1/gateway -H "Metadata-Flavor:Google")"
        nic1_mask="$(curl $md_net/1/subnetmask -H "Metadata-Flavor:Google")"
        nic1_addr="$(curl $md_net/1/ip -H "Metadata-Flavor:Google")"
        # Source based policy routing for nic1
        echo "100 rt-nic1" >> /etc/iproute2/rt_tables
        ip rule add pri 32000 from $nic1_gw/$nic1_mask table rt-nic1
        sleep 1
        ip route add 35.191.0.0/16 via $nic1_gw dev eth1 table rt-nic1
        ip route add 130.211.0.0/22 via $nic1_gw dev eth1 table rt-nic1
        # Start iptables:
        iptables -t nat -F
        iptables -t nat -A POSTROUTING \
        -s $nic0_gw/$nic0_mask \
        -d $nic1_gw/$nic1_mask \
        -o eth1 \
        -j SNAT \
        --to-source $nic1_addr
        iptables -t nat -A POSTROUTING \
        -s $nic1_gw/$nic1_mask \
        -d $nic0_gw/$nic0_mask \
        -o eth0 \
        -j SNAT \
        --to-source $nic0_addr
        iptables-save
        # Use a web server to pass the health check for this example.
        # You should use a more complete test in production.
        apt-get update
        apt-get install apache2 -y
        a2ensite default-ssl
        a2enmod ssl
        echo "Example web page to pass health check" | \
        tee /var/www/html/index.html
        systemctl restart apache2'
    
  3. 更新实例组。

    gcloud compute instance-groups managed set-instance-template \
        third-party-instance-group \
        --region us-west1 \
        --template=third-party-template-multinic
    
  4. 使用新的 third-party-template-multinic 模板重新创建托管实例组。

    gcloud compute instance-groups managed rolling-action replace \
        third-party-instance-group \
        --region us-west1
    

    等待几分钟,让实例准备就绪。您可以使用 list-instances 命令验证进度。

    gcloud compute instance-groups managed list-instances \
        third-party-instance-group \
        --region us-west1
    

    输出应如下所示:

    NAME                             ZONE        STATUS   ACTION  INSTANCE_TEMPLATE              VERSION_NAME                        LAST_ERROR
    third-party-instance-group-5768  us-west1-a  RUNNING  NONE    third-party-template-multinic  0/2019-10-24 18:48:48.018273+00:00
    third-party-instance-group-4zf4  us-west1-b  RUNNING  NONE    third-party-template-multinic  0/2019-10-24 18:48:48.018273+00:00
    third-party-instance-group-f6lm  us-west1-c  RUNNING  NONE    third-party-template-multinic  0/2019-10-24 18:48:48.018273+00:00
    
  5. 配置 production VPC 网络中的负载平衡器资源。

    gcloud compute backend-services create ilb2 \
        --load-balancing-scheme=internal \
        --health-checks-region=us-west1 \
        --health-checks=hc-http-80 \
        --region=us-west1 \
        --network=production
    
    gcloud compute backend-services add-backend ilb2 \
        --instance-group=third-party-instance-group \
        --instance-group-region=us-west1 \
        --region=us-west1
    
    gcloud compute forwarding-rules create fr-ilb2 \
        --load-balancing-scheme=internal \
        --ports=80 \
        --network=production \
        --subnet=production-subnet \
        --region=us-west1 \
        --backend-service=ilb2 \
        --address=10.50.1.99
    
    gcloud compute routes create ilb-nhop-dest-10-30-1 \
        --network=production \
        --destination-range=10.30.1.0/24 \
        --next-hop-ilb=fr-ilb2 \
        --next-hop-ilb-region=us-west1
    

测试多 NIC 部署的负载平衡

  1. 验证负载平衡器后端的运行状况。

    gcloud compute backend-services get-health ilb1 --region us-west1
    
    gcloud compute backend-services get-health ilb2 --region us-west1
    
  2. 测试来自 testing 虚拟机的连接。

    gcloud compute ssh testing-vm --zone=us-west1-a
    
    curl http://10.50.1.100
    
    exit
    
  3. 测试来自 production 虚拟机的连接。

    gcloud compute ssh production-vm --zone=us-west1-a
    
    curl http://10.30.1.100
    

清理

  1. 在负载平衡器配置中,从后端服务中移除后端。

    gcloud compute backend-services remove-backend ilb1 \
        --instance-group=third-party-instance-group \
        --instance-group-region=us-west1 \
        --region=us-west1
    
    gcloud compute backend-services remove-backend ilb2 \
        --instance-group=third-party-instance-group \
        --instance-group-region=us-west1 \
        --region=us-west1
    
  2. 删除路由。

    gcloud compute routes delete ilb-nhop-dest-10-50-1
    
    gcloud compute routes delete ilb-nhop-dest-10-30-1
    
  3. 在负载平衡器配置中,删除转发规则。

    gcloud compute forwarding-rules delete fr-ilb1 \
        --region=us-west1
    
    gcloud compute forwarding-rules delete fr-ilb2 \
        --region=us-west1
    
  4. 在负载平衡器配置中,删除后端服务。

    gcloud compute backend-services delete ilb1 \
        --region=us-west1
    
    gcloud compute backend-services delete ilb2 \
        --region=us-west1
    
  5. 在负载平衡器配置中,删除运行状况检查。

    gcloud compute health-checks delete hc-http-80 \
        --region=us-west1
    

    如果您使用 Cloud Console,则运行状况检查是全球性的。因此,命令如下所示:

    gcloud compute health-checks delete hc-http-80 \
         --global
    
  6. 删除托管实例组。

    gcloud compute instance-groups managed delete third-party-instance-group \
        --region=us-west1
    
  7. 删除实例模板。

    gcloud compute instance-templates delete third-party-template
    
    gcloud compute instance-templates delete third-party-template-multinic
    
  8. 删除测试实例和生产实例。

    gcloud compute instances delete testing-vm \
        --zone=us-west1-a
    
    gcloud compute instances delete production-vm \
        --zone=us-west1-a
    

后续步骤