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

在 Google Cloud 中,您可以采用高度可用、横向扩容的方式集成第三方设备。为此,您需要配置自定义静态路由并将其下一个跃点设置为 Google Cloud 内部 TCP/UDP 负载平衡器。这样,负载平衡器可以将目标前缀的流量负载平衡到经过运行状况检查的第三方虚拟机设备池。

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

权限

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

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

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

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

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

本指南中讨论的解决方案会创建运行 Debian Linux 和 iptables 的设备虚拟机。示例虚拟机不执行任何数据包过滤,但您可以通过修改此示例的 iptables 配置,或者使用不同的数据包过滤或路由软件来添加该功能。

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

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

此示例展示了对多个后端 NIC 执行的负载平衡,如将负载平衡到多个 NIC中所述。

拓扑如下所示:

适用于内部 TCP/UDP 负载平衡的下一个跃点多 NIC 详情示例
内部 TCP/UDP 负载平衡的下一个跃点多 NIC 详细示例(点击可放大)

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

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

该图还显示了流量:

  • testing VPC 网络流量的自定义静态路由指向 10.50.1.0/24 子网。此路由会将流量定向到负载平衡器。
  • 负载平衡器根据配置的会话粘性将流量转发到某个应用实例。(会话亲和性仅影响 TCP 流量。)

如需获取其他用例,请参阅内部 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-from-both:一种适用于 testing 网络中所有目标的入站规则。此规则允许 10.30.1.0/2410.50.1.0/24 IP 地址范围中来源的流量。这两个范围涵盖这两个网络中虚拟机的主要内部 IP 地址。

  • fw-allow-production-from-both:一种适用于 production 网络中所有目标的入站规则。此规则允许 10.30.1.0/2410.50.1.0/24 IP 地址范围中来源的流量。这两个范围涵盖这两个网络中虚拟机的主要内部 IP 地址。

  • 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 来标识该规则应该应用到的实例。

  • fw-allow-production-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-from-both
    • 网络testing
    • 优先级1000
    • 流量方向:入站
    • 对匹配项执行的操作:允许
    • 目标:网络中的所有实例
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.30.1.0/2410.50.1.0/24
    • 协议和端口:允许全部
  3. 点击创建

  4. 点击创建防火墙规则并输入以下信息,以创建允许生产虚拟机接收来自测试子网和生产子网的数据包的规则:

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

  6. 点击创建防火墙规则,以创建在测试环境中允许传入 SSH 连接的规则:

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

  8. 点击创建防火墙规则,以创建在生产环境中允许传入 SSH 连接的规则:

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

  10. 点击创建防火墙规则,以创建在测试环境中允许执行 Google Cloud 运行状况检查的规则:

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

  12. 点击创建防火墙规则,以创建在生产环境中允许执行 Google Cloud 运行状况检查的规则:

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

gcloud

  1. 创建 fw-allow-testing-subnet 防火墙规则,允许测试虚拟机接收来自 testingproduction 子网的数据包:

    gcloud compute firewall-rules create fw-allow-testing-from-both \
        --network=testing \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.30.1.0/24,10.50.1.0/24 \
        --rules=all
    
  2. 创建 fw-allow-production-subnet 防火墙规则,允许生产虚拟机接收来自 testingproduction 子网的数据包:

    gcloud compute firewall-rules create fw-allow-production-from-both \
        --network=production \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.30.1.0/24,10.50.1.0/24 \
        --rules=all
    
  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
    
  6. 创建 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
    

创建第三方虚拟设备

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

控制台

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

gcloud

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

    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-10 \
        --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")"
        nic0_id="$(ip addr show | grep $nic0_addr | awk '{print $NF}')"
        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")"
        nic1_id="$(ip addr show | grep $nic1_addr | awk '{print $NF}')"
        # 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 $nic1_id table rt-nic1
        ip route add 130.211.0.0/22 via $nic1_gw dev $nic1_id table rt-nic1
        # 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-multinic \
        --size=3
    

创建负载平衡资源

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

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

  • 后端服务:虽然此示例的后端服务指定了 TCP 协议,但当负载平衡器是路由的下一个跃点时,Google Cloud 会转发所有协议(TCP、UDP 和 ICMP)的流量。

  • 转发规则:虽然此示例转发规则指定了 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. 会话亲和性下,选择客户端 IP
    6. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  8. 点击前端配置。在新建前端 IP 和端口部分,进行以下更改:

    1. 名称fr-ilb1
    2. 子网testing-subnet
    3. 内部 IP 中,选择保留静态内部 IP 地址,输入以下信息,然后点击保留
      • 名称ip-ilb
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.30.1.99
    4. 端口:选择单个,然后输入 80 作为端口号。 请记住,为负载平衡器选择协议和端口并不会限制在负载平衡器是路由的下一个跃点时使用的协议和端口。
    5. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  9. 点击检查并最终确认。仔细检查您的设置。

  10. 点击创建

创建第二个负载平衡器

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”

  2. 点击创建负载平衡器

  3. TCP 负载平衡下,点击开始配置

  4. 面向互联网或仅限内部下选择仅在我的虚拟机之间

  5. 点击继续

  6. 名称设置为 ilb2

  7. 点击后端配置 并进行以下更改:

    1. 区域us-west1
    2. 网络production
    3. 后端下的新建内容部分,选择 third-party-instance-group 实例组,然后点击完成
    4. 运行状况检查下,选择 hc-http-80
    5. 会话亲和性下,选择客户端 IP
    6. 请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  8. 点击前端配置。在新建前端 IP 和端口部分,进行以下更改:

    1. 名称fr-ilb2
    2. 子网testing-subnet
    3. 内部 IP 中,选择保留静态内部 IP 地址,输入以下信息,然后点击保留
      • 名称ip-ilb2
      • 静态 IP 地址:让我选择
      • 自定义 IP 地址10.50.1.99
    4. 端口:选择单个,然后输入 80 作为端口号。 请记住,为负载平衡器选择协议和端口并不会限制在负载平衡器是路由的下一个跃点时使用的协议和端口。
    5. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  9. 点击检查并最终确认。仔细检查您的设置。

  10. 点击创建

  11. 配置 production VPC 网络中的负载平衡器资源。

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 \
        --load-balancing-scheme=internal \
        --health-checks-region=us-west1 \
        --health-checks=hc-http-80 \
        --region=us-west1 \
        --network=testing \
        --session-affinity=CLIENT_IP
    
    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 \
        --session-affinity=CLIENT_IP
    
  3. 添加包含第三方虚拟设备的实例组作为后端服务的后端。

    gcloud compute backend-services add-backend ilb1 \
        --instance-group=third-party-instance-group \
        --instance-group-region=us-west1 \
        --region=us-west1
    
    gcloud compute backend-services add-backend ilb2 \
        --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
    
    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
    

创建将负载平衡器定义为后续跃点的静态路由

创建显示为 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. 对于路由的下一个跃点,选择指定内部 TCP/UDP 负载均衡器的转发规则

    如需将负载平衡器的 IP 地址指定为下一个跃点,请使用 gcloud 工具或 API。

  7. 指定转发规则名称。对于转发规则名称,选择 fr-ilb1

  8. 点击创建

创建第二个路由

  1. 点击创建路由
  2. 对于路由名称,输入 ilb-nhop-dest-10-30-1
  3. 选择 testing 网络。
  4. 对于目标 IP 地址范围,输入 10.30.1.0/24
  5. 对于路由的下一个跃点,选择指定内部 TCP/UDP 负载均衡器的转发规则

    如需将负载平衡器的 IP 地址指定为下一个跃点,请使用 gcloud 工具或 API。

  6. 对于转发规则名称,选择 fr-ilb2

  7. 点击创建

gcloud

创建高级路由,将下一个跃点设置为每个负载平衡器的转发规则,并相应地设置每个目标范围。

对于 --next-hop-ilb 标志,您可以指定转发规则名称或 IP 地址。如果指定 IP 地址,则此 IP 地址可以在所有对等体中获知,而无需导出自定义路由。在此示例中,第一个路由使用 IP 地址 10.30.1.99,而第二个路由使用转发规则名称 fr-ilb12

您可以选择指定路由上的一个或多个实例标记。如果您在路由上指定了网络标记,则路由可以应用于特定虚拟机。如果您未指定任何网络标记,则该路由将应用于 VPC 网络中的所有虚拟机。在此示例中,路由将 my-network-tag 用作路由的网络标记。

gcloud compute routes create ilb-nhop-dest-10-50-1 \
    --network=testing \
    --destination-range=10.50.1.0/24 \
    --next-hop-ilb=10.30.1.99 \
    --tags=my-network-tag
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

创建 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-10 \
        --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-10 \
        --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 部署的负载平衡

  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
    

启用对称哈希

在计算映射到后端实例的哈希值时,Google Cloud 会忽略 IP 地址和端口的方向。无论数据包源自哪个方向,计算的 TCP/UDP 数据包的一致性哈希值都相同。这称为对称哈希。

如需在现有内部 TCP/UDP 负载平衡器上启用此哈希行为,您必须重新创建转发规则和下一个跃点路由。

如需了解详情,请参阅对称哈希

删除再重新创建转发规则

控制台

删除转发规则并创建新的转发规则

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”

  2. 点击 be-ilb 负载平衡器,然后点击修改

  3. 点击前端配置

  4. 将鼠标指针悬停在您的转发规则上,然后点击删除将其移除。

  5. 点击添加前端 IP 和端口

  6. 新建前端 IP 和端口部分,进行以下更改:

    1. 名称FORWARDING_RULE_NAME
    2. 子网SUBNET_NAME
    3. 内部 IP 中,选择 IP_ADDRESS
    4. 端口PORT_NUMBERALL
    5. 点击完成
    6. 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。如果没有,请检查此步骤。
  7. 点击检查并最终确认。仔细检查您的设置。

  8. 点击创建

gcloud

  1. 删除现有转发规则。

    gcloud compute forwarding-rules delete FORWARDING_RULE_NAME \
        --region=REGION
    
  2. 创建具有相同名称的替换转发规则。

    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
        --load-balancing-scheme=internal \
        --ports=PORT_NUMBER or `ALL` \
        --network=NETWORK_NAME \
        --subnet=SUBNET_NAME \
        --region=REGION \
        --backend-service=BACKEND_SERVICE_NAME \
        --address=IP_ADDRESS
    

不需要 SNAT 的情况

如上例所示,当满足以下所有条件时,不需要源网络地址转换 (SNAT):

  • 内部 TCP/UDP 负载平衡器的转发规则是在 2021 年 6 月 22 日或之后创建的。
  • 引用转发规则的自定义静态路由是在 2021 年 6 月 22 日或之后创建的。
  • 内部 TCP/UDP 负载平衡器的后端服务不使用 NONE 会话亲和性设置。

您可以按照以下步骤将现有下一个跃点内部 TCP/UDP 负载平衡器路由转换为使用对称哈希:

  • 确保内部 TCP/UDP 负载平衡器的后端服务不使用 NONE 会话亲和性设置

  • 创建引用同一后端服务的替换转发规则。替换转发规则使用其他 IP 地址。

  • 创建引用新的转发规则的替换自定义静态路由。确保此替换路由的优先级高于现有路由。

  • 删除优先级较低的现有路由(引用之前的转发规则),然后删除以前的转发规则。

清理

  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
    

后续步骤