设置具有虚拟机实例组后端的传统代理网络负载均衡器(TCP 代理)

Google Cloud 传统代理网络负载均衡器可让您为世界各地的所有用户使用同一个 IP 地址。传统代理网络负载均衡器会自动将流量路由到离用户最近的后端实例。

本页面介绍了如何设置具有目标 TCP 代理和虚拟机实例组后端的传统代理网络负载均衡器。在开始之前,请参阅外部代理网络负载均衡器概览,详细了解这些负载均衡器的工作原理。

设置概览

此示例演示了如何为存在于两个区域(区域 A 和区域 B)中的服务设置外部代理网络负载均衡器。在本示例中,服务是一组配置为在端口 110 做出响应的 Apache 服务器。许多浏览器都不允许使用端口 110,因此我们在测试部分使用 curl

在此示例中,您可以配置以下内容:

  1. 分布在两个区域的四个实例
  2. 包含实例的实例组
  3. 用于验证实例健康状况的健康检查
  4. 后端服务,用于监控实例并防止实例超出配置的使用量
  5. 目标 TCP 代理
  6. 外部静态 IPv4 地址和用于将用户流量发送到代理的转发规则
  7. 外部静态 IPv6 地址和用于将用户流量发送到代理的转发规则
  8. 允许流量从负载均衡器和健康检查器访问实例的防火墙规则

配置负载均衡器后,请测试该配置。

权限

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

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

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

配置实例组后端

本部分说明如何创建基本的实例组、如何将实例添加到实例组,以及如何将这些实例添加到具有健康检查功能的后端服务。生产系统通常会使用基于实例模板代管实例组,但此配置对初始测试更为快捷。

配置实例

如需进行测试,请在四个实例(分别位于两个实例组中,每个实例组中有两个实例)上安装 Apache。通常,外部代理网络负载均衡器不用于处理 HTTP 流量,但 Apache 软件通常用于测试。

在此示例中,创建的实例具有 tcp-lb 标记。防火墙规则稍后会使用此标记。

控制台

创建实例

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 vm-a1

  4. 区域设置为 REGION_A

  5. 可用区设置为 ZONE_A

  6. 点击高级选项

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

    • 网络标记字段中,输入 tcp-lballow-health-check-ipv6
  • 点击管理。将以下脚本输入启动脚本字段。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
  • 点击创建

  • 使用相同的设置创建 vm-a2,但需在启动脚本字段中添加以下脚本:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html

  • 使用相同设置创建 vm-b1,但需将区域设置为 REGION_B,并将可用区设置为 ZONE_B。在启动脚本字段中输入以下脚本:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html

  • 使用相同设置创建 vm-b2,但需将区域设置为 REGION_B,并将可用区设置为 ZONE_B。在启动脚本字段中输入以下脚本:

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html

  • gcloud

    1. ZONE_A 可用区中创建 vm-a1

      gcloud compute instances create vm-a1 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    2. ZONE_A 可用区中创建 vm-a2

      gcloud compute instances create vm-a2 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_A \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    3. ZONE_B 可用区中创建 vm-b1

      gcloud compute instances create vm-b1 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      
    4. ZONE_B 可用区中创建 vm-b2

      gcloud compute instances create vm-b2 \
         --image-family debian-12 \
         --image-project debian-cloud \
         --tags tcp-lb \
         --zone ZONE_B \
         --metadata startup-script="#! /bin/bash
           sudo apt-get update
           sudo apt-get install apache2 -y
           sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
           sudo service apache2 restart
           echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
      

    创建实例组

    在本部分中,您将在每个可用区中创建一个实例组并添加实例。

    控制台

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

      进入“实例组”

    2. 点击创建实例组

    3. 点击新建非代管式实例组

    4. 名称设置为 instance-group-a

    5. 可用区设置为 ZONE_A

    6. 端口映射下,点击添加端口。负载均衡器通过一个指定的端口将流量发送到实例组。创建一个已命名端口来将传入流量映射到特定的端口号。

      1. 端口名称设置为 tcp110
      2. 端口号设置为 110
    7. 虚拟机实例下,选择 vm-a1vm-a2

    8. 其他设置保持不变。

    9. 点击创建

    10. 重复执行上述步骤,但设置以下值:

      • 名称instance-group-b
      • 区域REGION_B
      • 可用区ZONE_B
      • 端口名称tcp110
      • 端口号110
      • 实例vm-b1vm-b2

    gcloud

    1. 创建 instance-group-a 实例组。

      gcloud compute instance-groups unmanaged create instance-group-a \
         --zone ZONE_A
      
    2. 为实例组创建已命名的端口。

      gcloud compute instance-groups set-named-ports instance-group-a \
         --named-ports tcp110:110 \
         --zone ZONE_A
      
    3. vm-a1vm-a2 添加到 instance-group-a

      gcloud compute instance-groups unmanaged add-instances instance-group-a \
         --instances vm-a1,vm-a2 \
         --zone ZONE_A
      
    4. 创建 us-ig2 实例组。

      gcloud compute instance-groups unmanaged create instance-group-b \
         --zone ZONE_B
      
    5. 为实例组创建已命名的端口。

      gcloud compute instance-groups set-named-ports instance-group-b \
         --named-ports tcp110:110 \
         --zone ZONE_B
      
    6. vm-b1vm-b2 添加到 instance-group-b

      gcloud compute instance-groups unmanaged add-instances instance-group-b \
         --instances vm-b1,vm-b2 \
         --zone ZONE_B
      

    现在,每个区域都有一个实例组。每个实例组都有两个虚拟机实例。

    为外部代理网络负载均衡器创建防火墙规则

    将防火墙配置为允许流量从负载均衡器和健康状况检查程序发送到实例。在这种情况下,我们将打开 TCP 端口 110。健康检查将使用同一端口。由于负载均衡器与实例之间的流量使用 IPv4,因此只需要打开 IPv4 范围。

    控制台

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

      转到“防火墙政策”

    2. 点击创建防火墙规则

    3. 名称字段中,输入 allow-tcp-lb-and-health

    4. 请选择一个网络。

    5. 目标下,选择指定的目标标记

    6. 目标标记设置为 tcp-lb

    7. 来源过滤条件设置为 IPv4 范围

    8. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16

    9. 协议和端口下,将指定的协议和端口设置为 tcp:110

    10. 点击创建

    gcloud

    gcloud compute firewall-rules create allow-tcp-lb-and-health \
       --source-ranges 130.211.0.0/22,35.191.0.0/16 \
       --target-tags tcp-lb \
       --allow tcp:110
    

    配置负载平衡器

    控制台

    开始配置

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

      转到“负载均衡”

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

    基本配置

    名称设置为 my-tcp-lb

    后端配置

    1. 点击后端配置
    2. 后端类型下,选择实例组
    3. 协议下,选择 TCP
    4. 配置第一个后端:
      1. 新后端下,选择实例组 instance-group-a
      2. 保留其余的默认值。
    5. 配置第二个后端:
      1. 点击添加后端
      2. 选择实例组 instance-group-b
      3. 端口号下,删除 80 并添加 110
    6. 配置健康检查:
      1. 健康检查中,选择创建健康检查
      2. 将健康检查的名称设置为 my-tcp-health-check
      3. 协议下,选择 TCP
      4. 端口设置为 110
      5. 保留其余的默认值。
      6. 点击保存并继续
    7. 在 Google Cloud 控制台中,验证后端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了所有步骤。

    前端配置

    1. 点击前端配置
    2. 添加第一条转发规则:
      1. 输入 my-tcp-lb-forwarding-rule 作为名称
      2. 协议下,选择 TCP
      3. IP 地址下,选择创建 IP 地址
        1. 输入 tcp-lb-static-ip 作为名称
        2. 点击保留
      4. 端口设置为 110
      5. 在此示例中,请勿启用代理协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅代理协议
      6. 点击完成
    3. 添加第二条转发规则:
      1. 点击添加前端 IP 和端口
      2. 输入 my-tcp-lb-ipv6-forwarding-rule 作为名称
      3. 协议下,选择 TCP
      4. IP 版本设置为 IPv6
      5. IP 地址下,点击创建 IP 地址
        1. 输入 tcp-lb-ipv6-static-ip 作为名称。
        2. 点击保留
      6. 端口设置为 110
      7. 在此示例中,请勿启用代理协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅代理协议
      8. 点击完成
    4. 在 Google Cloud 控制台中,验证前端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了上述所有步骤。

    检查并最终确定

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

    gcloud

    1. 创建健康检查。
          gcloud compute health-checks create tcp my-tcp-health-check --port 110
          
    2. 创建后端服务。
          gcloud compute backend-services create my-tcp-lb \
              --load-balancing-scheme EXTERNAL \
              --global-health-checks \
              --global \
              --protocol TCP \
              --health-checks my-tcp-health-check \
              --timeout 5m \
              --port-name tcp110
          
    3. 将实例组添加到后端服务。
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-a \
              --instance-group-zone ZONE_A \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
          gcloud compute backend-services add-backend my-tcp-lb \
              --global \
              --instance-group instance-group-b \
              --instance-group-zone ZONE_B \
              --balancing-mode UTILIZATION \
              --max-utilization 0.8
          
    4. 配置目标 TCP 代理。如果您要开启代理标头,请将其设置为 PROXY_V1,而不是 NONE
          gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy \
              --backend-service my-tcp-lb \
              --proxy-header NONE
          
    5. 预留全局静态 IPv4 和 IPv6 地址。

      您的客户可以使用这些 IP 地址来访问已进行负载平衡的服务。

          gcloud compute addresses create tcp-lb-static-ipv4 \
              --ip-version=IPV4 \
              --global
          
          gcloud compute addresses create tcp-lb-static-ipv6 \
              --ip-version=IPV6 \
              --global
          
    6. 为两个地址配置全局转发规则。
          gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv4 \
              --ports 110
          
          gcloud compute forwarding-rules create my-tcp-lb-ipv6-forwarding-rule \
              --load-balancing-scheme EXTERNAL \
              --global \
              --target-tcp-proxy my-tcp-lb-target-proxy \
              --address tcp-lb-static-ipv6 \
              --ports 110
          

    测试负载均衡器

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

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

      gcloud compute addresses describe tcp-lb-static-ipv4
      

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

      gcloud compute addresses describe tcp-lb-static-ipv6
      
    2. 通过运行以下命令将流量发送到负载均衡器。将 LB_IP_ADDRESS 替换为您的负载均衡器的 IPv4 或 IPv6 地址。

      curl -m1 LB_IP_ADDRESS:110
      

      比方说,如果分配的 IPv6 地址为 [2001:db8:1:1:1:1:1:1/96]:110,则该命令应如下所示:

      curl -m1 http://[2001:db8:1:1:1:1:1:1]: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. 点击更新以保存更改。

    gcloud

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

    gcloud compute target-tcp-proxies update TARGET_PROXY_NAME \
        --proxy-header=[NONE | PROXY_V1]
    

    配置会话亲和性

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

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

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

    控制台

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

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

      进入“负载均衡”

    2. 点击后端

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

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

    5. 会话亲和性下,从菜单中选择客户端 IP

    6. 点击更新

    gcloud

    使用以下 Google Cloud CLI 命令更新 my-tcp-lb 后端服务,并指定客户端 IP 会话亲和性:

    gcloud compute backend-services update my-tcp-lb \
        --global \
        --session-affinity=CLIENT_IP
    

    API

    如需设置客户端 IP 会话亲和性,请向 backendServices/patch 方法发出 PATCH 请求。

    PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-tcp-lb
    {
      "sessionAffinity": "CLIENT_IP"
    }
    

    启用连接排空

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

    后续步骤