设置具有虚拟机实例组后端的区域级外部代理网络负载均衡器

区域级外部代理网络负载均衡器是一种基于代理的区域第 4 层负载均衡器,可让您在外部区域 IP 地址后面的单个区域中运行和扩缩 TCP 服务流量。这些负载均衡器将来自互联网的外部 TCP 流量分配到同一区域中的后端。

本指南介绍了如何设置具有托管式实例组 (MIG) 后端的区域级外部代理网络负载均衡器。

在开始之前,请先阅读外部代理网络负载均衡器概览

在此示例中,我们将使用负载均衡器在区域 A 的两个可用区托管式实例组中的后端虚拟机之间分配 TCP 流量。在本示例中,服务是一组配置为在端口 110 做出响应的 Apache 服务器。许多浏览器都不允许使用端口 110,因此我们在测试部分使用 curl

在此示例中,您将配置下图中显示的部署。

具有实例组后端的外部代理网络负载均衡器示例配置。
具有实例组后端的外部代理网络负载均衡器示例配置

区域级外部代理网络负载均衡器是区域级负载均衡器。所有负载均衡器组件(后端实例组、后端服务、目标代理和转发规则)必须位于同一区域。

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。您必须是项目的 Owner 或 Editor,或者必须具有以下所有 Compute Engine IAM 角色

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

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

配置网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。此负载均衡器是区域性的。对于 VPC 网络中的流量,如果其来源所在的子网与负载均衡器位于同一区域,那么该流量会被路由到负载均衡器。

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

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

  • 后端子网:区域 A 中名为 backend-subnet 的子网,其主要 IP 地址范围使用 10.1.2.0/24

  • 代理子网:区域 B 中名为 proxy-only-subnet 的子网,其主要 IP 地址范围使用 10.129.0.0/23

创建网络和子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 子网部分中,将子网创建模式设置为自定义

  5. 为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:

    • 名称backend-subnet
    • 区域REGION_A
    • IP 地址范围10.1.2.0/24
  6. 点击完成

  7. 点击创建

gcloud

  1. 如需创建自定义 VPC 网络,请使用 gcloud compute networks create 命令

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 如需在 REGION_A 区域的 lb-network 网络中创建子网,请使用 gcloud compute networks subnets create 命令

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

创建代理专用子网

代理专用子网提供了一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网供 lb-network VPC 网络的区域 A 中所有基于 Envoy 的负载均衡器使用。

控制台

如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

如需立即创建代理专用子网,请按以下步骤操作:

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

    进入 VPC 网络页面

  2. 点击 VPC 网络的名称:lb-network

  3. 点击添加子网

  4. 对于名称,输入 proxy-only-subnet

  5. 对于区域,请选择 REGION_A

  6. 用途设置为区域级代管式代理

  7. 对于 IP 地址范围,输入 10.129.0.0/23

  8. 点击添加

gcloud

如需创建代理专用子网,请使用 gcloud compute networks subnets create 命令

gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=REGION_A \
    --network=lb-network \
    --range=10.129.0.0/23

创建防火墙规则

在此示例中,您将创建以下防火墙规则:

  • 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)的所有 TCP 流量。此示例使用目标标记 allow-health-check

  • fw-allow-proxy-only-subnet。一种入站流量规则,允许来自代理专用子网的连接到达后端。

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

目标标记定义了后端实例。没有目标标记,防火墙规则将应用于 VPC 网络中的所有后端实例。创建后端虚拟机时,请务必包括指定的目标标记,如创建代管实例组中所示。

控制台

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

    转到“防火墙政策”

  2. 点击创建防火墙规则,以创建允许传入 SSH 连接的规则。填写以下字段:

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

  4. 再次点击创建防火墙规则,创建允许 Google Cloud 健康检查的规则:

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

      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80 作为端口号。

      最佳做法是将此规则限制为仅使用与健康检查所使用的协议和端口匹配的协议和端口。如果您使用 tcp:80 协议和端口,则 Google Cloud 可以使用 HTTP 通过端口 80 联系您的虚拟机,但无法使用 HTTPS 通过端口 443 联系这些虚拟机。

  5. 点击创建

  6. 第三次点击创建防火墙规则,以创建允许负载均衡器的代理服务器连接到后端的规则:

    • 名称fw-allow-proxy-only-subnet
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-proxy-only-subnet
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.129.0.0/23
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 80 作为端口号。
  7. 点击创建

gcloud

  1. 创建 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
    
  2. 创建 fw-allow-health-check 规则以允许 Google Cloud 健康检查。本示例允许来自健康检查探测工具的所有 TCP 流量;但是,您可以根据自己的需求配置较小范围的端口集。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=allow-health-check \
        --rules=tcp:80
    
  3. 创建 fw-allow-proxy-only-subnet 规则以允许该区域的 Envoy 代理连接到您的后端。将 --source-ranges 设置为该代理专用子网的分配范围,在此示例中为 10.129.0.0/23

    gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.129.0.0/23 \
        --target-tags=allow-proxy-only-subnet \
        --rules=tcp:80
    

预留负载均衡器的 IP 地址

为负载均衡器预留静态 IP 地址。

控制台

  1. 在 Google Cloud 控制台中,进入预留静态地址页面。

    进入“预留静态地址”

  2. 为新地址选择一个名称。

  3. 对于网络服务层级,请选择标准

  4. IP 版本部分,选择 IPv4。系统不支持 IPv6 地址。

  5. 对于类型,请选择区域

  6. 对于区域,请选择 REGION_A

  7. 附加目标选项设置为。创建负载均衡器后,此 IP 地址会关联到负载均衡器的转发规则。

  8. 点击预留以预留该 IP 地址。

gcloud

  1. 如需预留静态外部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME  \
        --region=REGION_A \
        --network-tier=STANDARD
    

    ADDRESS_NAME 替换为您要为此地址指定的名称。

  2. 如需查看结果,请使用 gcloud compute addresses describe 命令

    gcloud compute addresses describe ADDRESS_NAME
    

创建代管式实例组

本部分介绍如何在区域 A 中为负载均衡器创建两个托管式实例组 (MIG) 后端。在此示例中,MIG 提供了运行后端 Apache 服务器的虚拟机实例。通常,区域级外部代理网络负载均衡器不用于 HTTP 流量,但 Apache 软件通常用于测试。

控制台

创建实例模板

  1. 在 Google Cloud Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

  3. 对于名称,输入 ext-reg-tcp-proxy-backend-template

  4. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (stretch)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get

  5. 点击高级选项

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

    1. 网络标记字段中,输入 allow-sshallow-health-checkallow-proxy-only-subnet
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网backend-subnet
  7. 点击管理。将以下脚本输入到启动脚本字段中:

     #! /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 Console 中,转到实例组页面。

    进入“实例组”

  2. 点击创建实例组

  3. 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅创建具有有状态磁盘的 MIG

  4. 对于名称,输入 mig-a

  5. 对于位置,选择单个可用区

  6. 对于区域,请选择 REGION_A

  7. 对于可用区,请选择 ZONE_A

  8. 对于实例模板,请选择 ext-reg-tcp-proxy-backend-template

  9. 指定要在组中创建的实例数。

    对于此示例,在自动扩缩部分指定以下选项:

    • 对于自动扩缩模式,请选择 Off:do not autoscale
    • 对于实例数上限,请输入 2
  10. 端口映射部分,点击添加端口

    • 端口名称部分,输入 tcp80
    • 端口号部分,输入 80
  11. 点击创建

  12. 如需创建第二个托管式实例组,请重复创建托管式实例组步骤并使用以下设置:

    • 名称mig-b
    • 可用区ZONE_B

    其他所有设置保持不变。

gcloud

本指南中的 Google Cloud CLI 说明假定您使用的是 Cloud Shell 或安装了 bash 的其他环境。

  1. 如需创建一个具有 HTTP 服务器的虚拟机实例模板,请使用 gcloud compute instance-templates create 命令

    gcloud compute instance-templates create ext-reg-tcp-proxy-backend-template \
        --region=REGION_A \
        --network=lb-network \
        --subnet=backend-subnet \
        --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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. ZONE_A 可用区中创建一个托管式实例组:

    gcloud compute instance-groups managed create mig-a \
        --zone=ZONE_A \
        --size=2 \
        --template=ext-reg-tcp-proxy-backend-template
    
  3. ZONE_B 可用区中创建一个托管式实例组:

    gcloud compute instance-groups managed create mig-b \
        --zone=ZONE_B \
        --size=2 \
        --template=ext-reg-tcp-proxy-backend-template
    

配置负载平衡器

控制台

开始配置

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

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步
  4. 对于代理或直通,选择代理负载均衡器,然后点击下一步
  5. 公共或内部字段中,选择公共(外部),然后点击下一步
  6. 对于全球或单区域部署,选择最适合区域级工作负载,然后点击下一步
  7. 点击配置

基本配置

  1. 对于名称,输入 my-ext-tcp-lb
  2. 对于区域,请选择 REGION_A
  3. 对于网络,请选择 lb-network

预留代理专用子网

  1. 点击预留子网
  2. 对于名称,输入 proxy-only-subnet
  3. 对于 IP 地址范围,输入 10.129.0.0/23
  4. 点击添加

配置后端

  1. 点击后端配置
  2. 对于后端类型,选择实例组
  3. 对于 Protocol(协议),选择 TCP
  4. 对于已命名端口,输入 tcp80
  5. 配置第一个后端:
    1. 新后端字段中,选择实例组 mig-a
    2. 端口号部分,输入 80
    3. 保留其余的默认值,然后点击完成
  6. 配置第二个后端:
    1. 点击添加后端
    2. 新后端字段中,选择实例组 mig-b
    3. 端口号部分,输入 80
    4. 保留其余的默认值,然后点击完成
  7. 配置健康检查:
    1. 健康检查字段中,选择创建健康检查
    2. 将健康检查名称设置为 tcp-health-check
    3. 对于 Protocol(协议),选择 TCP
    4. 端口设置为 80
  8. 保留其余的默认值,然后点击保存
  9. 在 Google Cloud 控制台中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。

配置前端

  1. 点击前端配置
  2. 对于名称,输入 ext-reg-tcp-forwarding-rule
  3. 对于网络服务层级,请选择标准
  4. 对于 IP 地址,选择之前预留的 IP 地址:LB_IP_ADDRESS
  5. 对于端口号,输入 110。转发规则仅转发具有匹配目标端口的数据包。
  6. 代理协议字段中,选择关闭,因为 PROXY 协议不适用于 Apache HTTP Server 软件。如需了解详情,请参阅 PROXY 协议
  7. 点击完成
  8. 在 Google Cloud 控制台中,验证前端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成上述所有步骤。

检查并最终确定

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建

gcloud

  1. 创建区域级健康检查:

    gcloud compute health-checks create tcp tcp-health-check \
        --region=REGION_A \
        --use-serving-port
    
  2. 创建后端服务:

    gcloud compute backend-services create ext-reg-tcp-proxy-bs \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --protocol=TCP \
        --port-name=tcp80 \
        --region=REGION_A \
        --health-checks=tcp-health-check \
        --health-checks-region=REGION_A
    
  3. 将实例组添加到后端服务:

    gcloud compute backend-services add-backend ext-reg-tcp-proxy-bs \
        --region=REGION_A \
        --instance-group=mig-a \
        --instance-group-zone=ZONE_A \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8
     
    gcloud compute backend-services add-backend ext-reg-tcp-proxy-bs \
        --region=REGION_A \
        --instance-group=mig-b \
        --instance-group-zone=ZONE_B \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.8
    
  4. 创建目标 TCP 代理:

    gcloud compute target-tcp-proxies create ext-reg-tcp-target-proxy \
        --backend-service=ext-reg-tcp-proxy-bs \
        --proxy-header=NONE \
        --region=REGION_A
    

    如果您要开启代理标头,请将其设置为 PROXY_V1,而不是 NONE。 在此示例中,请勿启用 PROXY 协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅 PROXY 协议

  5. 创建转发规则。 对于 --ports,请指定 1-65535 范围内的单个端口号。此示例使用端口 110。转发规则仅转发具有匹配目标端口的数据包。

    gcloud compute forwarding-rules create ext-reg-tcp-forwarding-rule \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --network-tier=STANDARD \
        --network=lb-network \
        --region=REGION_A \
        --target-tcp-proxy=ext-reg-tcp-target-proxy \
        --target-tcp-proxy-region=REGION_A \
        --address=LB_IP_ADDRESS \
        --ports=110
    

测试负载均衡器

现在您已经配置了负载均衡器,接下来可以测试向负载均衡器的 IP 地址发送流量。

  1. 获取负载均衡器的 IP 地址。

    要获取 IPv4 地址,请运行以下命令:

    gcloud compute addresses describe ADDRESS_NAME
    
  2. 通过运行以下命令将流量发送到负载均衡器。将 LB_IP_ADDRESS 替换为负载均衡器的 IPv4 地址。

    curl -m1 LB_IP_ADDRESS:9090
    

其他配置选项

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

启用会话亲和性

示例配置创建的后端服务没有会话亲和性。

以下流程介绍了如何为示例负载均衡器更新后端服务,以便后端服务使用客户端 IP 地址亲和性或生成的 Cookie 亲和性。

启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(内部转发规则的内部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。

如需启用客户端 IP 地址会话亲和性,请完成以下步骤。

控制台

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

    进入“负载均衡”

  2. 点击后端

  3. 点击 ext-reg-tcp-proxy-bs(您为此示例创建的后端服务的名称),然后点击修改

  4. 后端服务详情页面上,点击高级配置

  5. 对于会话亲和性,选择客户端 IP

  6. 点击更新

gcloud

如需更新 ext-reg-tcp-proxy-bs 后端服务并指定客户端 IP 会话亲和性,请使用 gcloud compute backend-services update ext-reg-tcp-proxy-bs 命令:

gcloud compute backend-services update ext-reg-tcp-proxy-bs \
    --region=REGION_A \
    --session-affinity=CLIENT_IP

后续步骤