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

区域级内部代理网络负载均衡器是一种基于代理的区域第 4 层负载均衡器,可让您在只能由同一 VPC 网络中的客户端或连接到您的 VPC 网络的客户端访问的内部 IP 地址后面运行和扩缩 TCP 服务流量。

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

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

概览

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

在此示例中,您可以配置以下部署:

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

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

权限

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

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

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

配置网络和子网

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

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

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

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

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

为了演示全球访问权限,此示例还会在其他区域 (REGION_B) 和主要 IP 地址范围为 10.3.4.0/24 的子网中再创建一个测试客户端虚拟机。

创建网络和子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

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

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

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

  7. 点击添加子网

  8. 创建一个子网来展示全球访问权限。在新子网部分中,输入以下信息:

    • 名称test-global-access-subnet
    • 区域REGION_B
    • IP 地址范围10.3.4.0/24
  9. 点击完成

  10. 点击创建

gcloud

  1. 使用 gcloud compute networks create 命令创建自定义 VPC 网络:

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

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

    REGION_A 替换为目标 Google Cloud 区域的名称。

  3. 使用 gcloud compute networks subnets create 命令REGION_B 区域的 lb-network 网络中创建子网:

    gcloud compute networks subnets create test-global-access-subnet \
       --network=lb-network \
       --range=10.3.4.0/24 \
       --region=REGION_B
    

    REGION_B 替换为您要在其中创建第二个子网以测试全球访问权限的 Google Cloud 区域的名称。

创建代理专用子网

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

此代理专用子网用于 lb-network VPC 网络的 REGION_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 地址,请参阅预留新的静态内部 IPv4 或 IPv6 地址

创建代管式实例组

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

控制台

  1. 创建实例模板。在 Google Cloud 控制台中,转到实例模板页面。

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 int-tcp-proxy-backend-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (stretch)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 点击高级选项
    5. 点击网络并配置以下字段:
      1. 网络标记字段中,输入 allow-sshallow-health-checkallow-proxy-only-subnet
      2. 对于网络接口,请选择以下内容:
        • 网络lb-network
        • 子网backend-subnet
    6. 点击管理。将以下脚本输入启动脚本字段。

      #! /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
      
    7. 点击创建

  2. 创建代管式实例组。在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,输入 mig-a
    4. 位置下方,选择单个可用区
    5. 对于区域,选择 REGION_A
    6. 对于可用区,选择 ZONE_A1
    7. 实例模板下,选择 int-tcp-proxy-backend-template
    8. 指定要在组中创建的实例数。

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

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

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

  3. 重复第 2 步,使用以下设置创建第二个代管式实例组:

    1. 名称mig-c
    2. 可用区ZONE_A2 让所有其他设置保持不变。

gcloud

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

  1. 使用 gcloud compute instance-templates create 命令创建含有 HTTP 服务器的虚拟机实例模板。

    gcloud compute instance-templates create int-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-10 \
       --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_A1 可用区中创建一个代管式实例组。

    gcloud compute instance-groups managed create mig-a \
       --zone=ZONE_A1 \
       --size=2 \
       --template=int-tcp-proxy-backend-template
    

    ZONE_A1 替换为目标 Google Cloud 区域中的可用区的名称。

  3. ZONE_A2 可用区中创建一个代管式实例组。

    gcloud compute instance-groups managed create mig-c \
       --zone=ZONE_A2 \
       --size=2 \
       --template=int-tcp-proxy-backend-template
    

    ZONE_A2 替换为目标 Google Cloud 区域中的另一个可用区的名称。

配置负载平衡器

控制台

开始配置

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

    转到“负载均衡”

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

基本配置

  1. 对于名称,输入 my-int-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-c
    3. 端口号部分,输入 80
    4. 保留其余的默认值,然后点击完成
  7. 配置健康检查:
    1. 健康检查中,选择创建健康检查
    2. 将健康检查的名称设置为 tcp-health-check
    3. 对于 Protocol(协议),选择 TCP
    4. 端口设置为 80
  8. 保留其余的默认值,然后点击保存
  9. 在 Google Cloud 控制台中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。

前端配置

  1. 点击前端配置
  2. 对于名称,输入 int-tcp-forwarding-rule
  3. 对于子网,选择 backend-subnet
  4. 对于 IP 地址,选择之前预留的 IP 地址:LB_IP_ADDRESS
  5. 对于端口号,输入 110。转发规则仅转发具有匹配目标端口的数据包。
  6. 在此示例中,请勿启用代理协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅代理协议
  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 internal-tcp-proxy-bs \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --protocol=TCP \
       --region=REGION_A \
       --health-checks=tcp-health-check \
       --health-checks-region=REGION_A
    
  3. 将实例组添加到后端服务。

    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --region=REGION_A \
       --instance-group=mig-a \
       --instance-group-zone=ZONE_A1 \
       --balancing-mode=UTILIZATION \
       --max-utilization=0.8
    
    gcloud compute backend-services add-backend internal-tcp-proxy-bs \
       --region=REGION_A \
       --instance-group=mig-c \
       --instance-group-zone=ZONE_A2 \
       --balancing-mode=UTILIZATION \
       --max-utilization=0.8
    
  4. 创建内部目标 TCP 代理。

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

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

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

    gcloud compute forwarding-rules create int-tcp-forwarding-rule \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --region=REGION_A \
       --target-tcp-proxy=int-tcp-target-proxy \
       --target-tcp-proxy-region=REGION_A \
       --address=int-tcp-ip-address \
       --ports=110
    

测试负载均衡器

如需测试负载均衡器,请在负载均衡器所在的区域中创建客户端虚拟机。然后,将流量从客户端发送到负载均衡器。

创建客户端虚拟机

在负载均衡器所在的区域中创建客户端虚拟机 (client-vm)。

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 client-vm

  4. 地区设置为 ZONE_A1

  5. 点击高级选项

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

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

gcloud

客户端虚拟机必须与负载均衡器位于同一 VPC 网络和区域中。它无需位于同一子网或可用区中。客户端使用与后端虚拟机相同的子网。

gcloud compute instances create client-vm \
    --zone=ZONE_A1 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=backend-subnet

将流量发送到负载均衡器

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

  1. 使用 SSH 连接到客户端实例。

    gcloud compute ssh client-vm \
       --zone=ZONE_A1
    
  2. 验证负载均衡器是否按预期处理后端主机名。

    1. 使用 compute addresses describe 命令查看负载均衡器的 IP 地址:

      gcloud compute addresses describe int-tcp-ip-address \
       --region=REGION_A
      

      记下 IP 地址。

    2. 将流量发送到负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。

      curl IP_ADDRESS:110
      

其他配置选项

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

启用全球访问权限

您可以为负载均衡器启用全球访问权限,以使其可供所有区域的客户端访问。示例负载均衡器的后端仍必须位于一个区域 (REGION_A) 中。

具有全球访问权限的区域级内部代理网络负载均衡器
具有全球访问权限的区域级内部代理网络负载均衡器(点击可放大)

您不能修改现有区域转发规则来启用全球访问权限。为此,您必须创建一个新的转发规则。此外,启用全球访问权限的转发规则创建后,便无法修改。如需停用全球访问权限,您必须创建新的区域访问权限转发规则,并删除以前的全球访问权限转发规则。

如需配置全球访问权限,请更改以下配置。

控制台

为负载均衡器创建新的转发规则:

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

    进入“负载均衡”

  2. 名称列中,点击您的负载均衡器。

  3. 点击前端配置

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

  5. 输入新转发规则的名称和子网详细信息。

  6. 对于子网,选择 backend-subnet

  7. IP 地址部分,您可以选择与现有转发规则相同的 IP 地址、预留新的 IP 地址,或使用临时 IP 地址。只有在创建 IP 地址时将 IP 地址 --purpose 标志设置为 SHARED_LOADBALANCER_VIP 后,才能在多个转发规则之间共享相同的 IP 地址。

  8. 端口号部分,输入 110

  9. 全球访问权限部分,选择启用

  10. 点击完成

  11. 点击更新

gcloud

  1. 使用 --allow-global-access 标志为负载均衡器创建新的转发规则。

    gcloud compute forwarding-rules create int-tcp-forwarding-rule-global-access \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --region=REGION_A \
       --target-tcp-proxy=int-tcp-target-proxy \
       --target-tcp-proxy-region=REGION_A \
       --address=int-tcp-ip-address \
       --ports=110 \
       --allow-global-access
    
  2. 您可以使用 gcloud compute forwarding-rules describe 命令来确定转发规则是否启用了全球访问权限。例如:

    gcloud compute forwarding-rules describe int-tcp-forwarding-rule-global-access \
       --region=REGION_A \
       --format="get(name,region,allowGlobalAccess)"
    

    启用全球访问权限后,在输出中转发规则的名称和区域之后会出现 True 一词。

创建客户端虚拟机以测试全球访问权限

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 test-global-access-vm

  4. 地区设置为 ZONE_B1

  5. 点击高级选项

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

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

gcloud

ZONE_B1 可用区中创建客户端虚拟机。

gcloud compute instances create test-global-access-vm \
    --zone=ZONE_B1 \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=test-global-access-subnet

ZONE_B1 替换为 REGION_B 区域中的可用区的名称。

连接到客户端虚拟机并测试连接

  1. 使用 ssh 连接到客户端实例:

    gcloud compute ssh test-global-access-vm \
        --zone=ZONE_B1
    
  2. 使用 gcloud compute addresses describe 命令获取负载均衡器的 IP 地址:

    gcloud compute addresses describe int-tcp-ip-address \
        --region=REGION_A
    

    记下 IP 地址。

  3. 将流量发送到负载均衡器;将 IP_ADDRESS 替换为负载均衡器的 IP 地址:

    curl IP_ADDRESS:110
    

用于保留客户端连接信息的 PROXY 协议

代理网络负载均衡器会终结来自客户端的 TCP 连接,并创建与实例的新连接。默认情况下,系统不会保留原始客户端 IP 地址和端口信息。

如需保留原始连接信息并将其发送到实例,请启用 PROXY 协议版本 1。此协议将包含来源 IP 地址、目标 IP 地址和端口号的附加标头作为请求的一部分发送给实例。

请确保代理网络负载均衡器的后端实例运行的是支持 PROXY 协议标头的服务器。如果服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。

如果您为用户流量设置了 PROXY 协议,则还可以为健康检查设置此协议。如果您检查健康状况并在同一端口上传送内容,请将健康检查的 --proxy-header 设置为与您的负载均衡器设置相匹配。

PROXY 协议标头通常是一行用户可读的文本,格式如下:

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

以下示例显示了 PROXY 协议:

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

在上面的示例中,客户端 IP 为 192.0.2.1,负载均衡 IP 为 198.51.100.1,客户端端口为 15221,目标端口为 110

如果客户端 IP 未知,则负载均衡器会生成如下格式的 PROXY 协议标头:

PROXY UNKNOWN\r\n

更新目标代理的 PROXY 协议标头

您无法更新现有目标代理中的 PROXY 协议标头。您必须使用 PROXY 协议标头的所需设置创建新的目标代理。请按照以下步骤使用所需设置创建新的前端:

控制台

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

    进入“负载均衡”

  2. 点击要修改的负载均衡器的名称。
  3. 点击负载均衡器对应的 修改
  4. 点击前端配置
  5. 删除旧的前端 IP 和端口。
  6. 点击添加前端 IP 和端口
    1. 对于名称,输入 int-tcp-forwarding-rule
    2. 对于子网,选择 backend-subnet
    3. IP 地址部分,选择之前预留的 IP 地址:LB_IP_ADDRESS
    4. 对于端口号,输入 110。转发规则仅转发具有匹配目标端口的数据包。
    5. 代理协议字段的值更改为开启
    6. 点击完成
  7. 点击更新以保存更改。

gcloud

  1. 在以下命令中,修改 --proxy-header 字段并将其设置为 NONEPROXY_V1,具体取决于您的要求。

       gcloud compute target-tcp-proxies create TARGET_PROXY_NAME \
           --backend-service=BACKEND_SERVICE \
           --proxy-header=[NONE | PROXY_V1] \
           --region=REGION
       
  2. 删除现有的转发规则。

       gcloud compute forwarding-rules delete int-tcp-forwarding-rule \
           --region=REGION
       
  3. 创建新的转发规则并将其与目标代理关联。

       gcloud compute forwarding-rules create int-tcp-forwarding-rule \
           --load-balancing-scheme=INTERNAL_MANAGED \
           --network=lb-network \
           --subnet=backend-subnet \
           --region=REGION \
           --target-tcp-proxy=TARGET_PROXY_NAME \
           --target-tcp-proxy-region=REGION \
           --address=LB_IP_ADDRESS \
           --ports=110
       

启用会话亲和性

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

以下流程介绍了如何为示例区域级内部代理网络负载均衡器更新后端服务,以便后端服务使用客户端 IP 亲和性或生成的 Cookie 亲和性。

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

控制台

如需启用客户端 IP 地址会话亲和性,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入负载均衡页面。
    进入“负载均衡”
  2. 点击后端
  3. 点击 internal-tcp-proxy-bs(您为此示例创建的后端服务的名称),然后点击修改
  4. 后端服务详情页面上,点击高级配置
  5. 会话亲和性下,从菜单中选择客户端 IP
  6. 点击更新

gcloud

使用以下 gcloud 命令更新 internal-tcp-proxy-bs 后端服务,并指定客户端 IP 会话亲和性:

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

启用连接排空

您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩程序移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。

后续步骤