设置具有虚拟机实例组后端的外部 TCP 代理负载均衡器

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Google Cloud 外部 TCP 代理负载均衡可让您为世界各地的所有用户使用同一个 IP 地址。外部 TCP 代理负载均衡可以自动将流量路由到最靠近用户的实例。

本指南介绍了如何设置外部 TCP 代理负载均衡。在开始之前,请参阅外部 TCP 代理负载均衡概览,了解外部 TCP 代理负载均衡的工作原理。

设置概览

此示例演示了如何为存在于两个区域(us-central1us-east1)中的一项简单服务设置全球级外部 TCP 代理负载均衡。在本示例中,服务是一组配置为在端口 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。外部 TCP 代理负载均衡一般不用于处理 HTTP 流量,但 Apache 是一种常用软件,易于设置测试。

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

控制台

创建实例

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建实例
  3. 名称设置为 ig-us-central1-1
  4. 区域设置为 us-central1
  5. 可用区设置为 us-central1-b
  6. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。
  7. 管理下,点击网络,然后使用 tcp-lb 填充标记字段。
  8. 点击管理,然后在启动脚本字段中输入以下脚本:
    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>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  9. 其余字段保留默认值。
  10. 点击创建
  11. 使用相同的设置创建 ig-us-central1-2,但需在启动脚本字段中添加以下脚本:
    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>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html
  12. 使用相同设置创建 ig-us-east1-1,但需将区域设置为 us-east1,并将可用区设置为 us-east1-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>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  13. 使用相同设置创建 ig-us-east1-2,但需将区域设置为 us-east1,并将可用区设置为 us-east1-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>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud

  1. us-central1-b 可用区中创建 ig-us-central1-1

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-10 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-central1-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>ig-us-central1-1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
  2. us-central1-b 可用区中创建 ig-us-central1-2

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-10 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-central1-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>ig-us-central1-2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
  3. us-east1-b 可用区中创建 ig-us-east1-1

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-10 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-east1-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>ig-us-east1-1</h1></body></html>' | tee /var/www/html/index.html
              EOF"
    
  4. us-east1-b 可用区中创建 ig-us-east1-2

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-10 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-east1-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>ig-us-east1-2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

为每个可用区创建一个实例组并添加实例

控制台

  1. 转到 Google Cloud Console 中的实例组页面。
    转到“实例组”页面
  2. 点击创建实例组
  3. 点击新建非代管式实例组
  4. 名称设置为 us-ig1
  5. 可用区设置为 us-central1-b
  6. 端口映射下,点击添加端口。负载均衡器通过一个指定的端口将流量发送到实例组。创建一个已命名端口来将传入流量映射到特定的端口号。
    1. 端口名称设置为 tcp110
    2. 端口号设置为 110
  7. 虚拟机实例下,选择 ig-us-central1-1ig-us-central1-2
  8. 其他设置保持不变。
  9. 点击创建
  10. 重复上述步骤,但设置以下值:
    • 名称us-ig2
    • 区域us-east1
    • 可用区us-east1-b
    • 端口名称tcp110
    • 端口号110
    • 实例ig-us-east1-1ig-us-east1-2

gcloud

  1. 创建 us-ig1 实例组。

    gcloud compute instance-groups unmanaged create us-ig1 \
        --zone us-central1-b
    
  2. 为实例组创建已命名的端口。

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports tcp110:110 \
        --zone us-central1-b
    
  3. ig-us-central1-1ig-us-central1-2 添加到 us-ig1

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
       --instances ig-us-central1-1,ig-us-central1-2 \
       --zone us-central1-b
    
  4. 创建 us-ig2 实例组。

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

    gcloud compute instance-groups set-named-ports us-ig2 \
       --named-ports tcp110:110 \
       --zone us-east1-b
    
  6. ig-us-east1-1ig-us-east1-2 添加到 us-ig2

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
       --instances ig-us-east1-1,ig-us-east1-2 \
       --zone us-east1-b
    

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

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

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

控制台

  1. 转到 Google Cloud Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则
  3. 名称字段中,输入 allow-tcp-lb-and-health
  4. 网络下,选择 default
  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 Console 中的“负载均衡”页面。
    转到“负载均衡”页面
  2. 点击创建负载均衡器
  3. 开始配置负载均衡器:
    1. TCP 负载均衡下,点击开始配置
    2. 面向互联网或仅限内部设置为从互联网到我的虚拟机
    3. 多个区域或单个区域设置为多个区域
    4. 点击继续
    5. 名称设置为 my-tcp-lb
    6. 点击后端配置
    7. 后端类型下,选择实例组
    8. 协议下,选择 TCP
  4. 配置第一个后端:
    1. 新后端下,选择实例组 us-ig1
    2. 保留其余的默认值。
  5. 配置第二个后端:
    1. 点击添加后端
    2. 选择实例组 us-ig2
    3. 端口号下,删除 80 并添加 110
  6. 配置健康检查:
    1. 健康检查中,选择创建健康检查
    2. 将健康检查的名称设置为 my-tcp-health-check
    3. 协议下,选择 TCP
    4. 端口设置为 110
  7. 可选:配置默认的后端安全政策。默认安全政策会限制超出用户配置阈值的流量。如需详细了解默认安全政策,请参阅速率限制概览

    1. 如需停用 Google Cloud Armor 默认安全政策,请在后端安全政策列表菜单中选择 None
    2. 安全部分中,选择默认安全政策
    3. 政策名称字段中,接受自动生成的名称或输入安全政策的名称。
    4. 请求数字段中,接受默认请求数,或输入介于 110,000 之间的整数。
    5. 间隔字段中,选择间隔。
    6. 对密钥强制执行字段中,选择以下值之一:全部IP 地址X-Forwarded-For IP 地址。如需详细了解这些选项,请参阅确定客户端以进行速率限制
  8. 保留其余的默认值。
  9. 点击保存并继续
  10. 在 Google Cloud Console 中,验证后端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成所有步骤。

配置前端服务

  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 Console 中,验证前端配置旁边显示了对勾标记。如果没有显示对勾标记,请仔细检查您是否已完成上述所有步骤。

检查并最终确定

  1. 点击检查并最终确认
  2. 仔细检查您的设置。
  3. 点击创建

gcloud

  1. 创建健康检查。

    gcloud compute health-checks create tcp my-tcp-health-check --port 110
    
  2. 创建后端服务。

    gcloud compute backend-services create my-tcp-lb \
        --global-health-checks \
        --global \
        --protocol TCP \
        --health-checks my-tcp-health-check \
        --timeout 5m \
        --port-name tcp110
    

    或者,您可以使用 --protocol SSL 配置从负载均衡器到实例之间的加密通信。

  3. 将实例组添加到后端服务。

    gcloud compute backend-services add-backend my-tcp-lb \
        --global \
        --instance-group us-ig1 \
        --instance-group-zone us-central1-b \
        --balancing-mode UTILIZATION \
        --max-utilization 0.8
     
    gcloud compute backend-services add-backend my-tcp-lb \
        --global \
        --instance-group us-ig2 \
        --instance-group-zone us-east1-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 \
        --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 \
        --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 代理负载均衡会终止来自客户端的 TCP 连接并创建通向实例的新连接。因此在默认情况下,不会保留原始客户端 IP 和端口信息。

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

请确保外部 TCP 代理负载均衡器的后端实例运行的是支持 PROXY 协议标头的 HTTP(S) 服务器。如果 HTTP(S) 服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。例如,PROXY 协议不适用于 Apache HTTP Server 软件。您可以使用其他 Web 服务器软件,例如 Nginx。

如果您为用户流量设置了 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

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

此页面上的负载均衡器设置示例介绍了如何在创建外部 TCP 代理负载均衡器时启用 PROXY 协议标头。按照以下步骤更改现有目标 TCP 代理的 PROXY 协议标头。

控制台

  1. 转到 Google Cloud Console 中的负载均衡页面。

    转到“负载均衡”页面

  2. 点击您的负载均衡器对应的修改

  3. 点击前端配置

  4. 代理协议字段的值更改为开启

  5. 点击更新以保存更改。

gcloud

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

gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
    --proxy-header=[NONE | PROXY_V1]

配置会话亲和性

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

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

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

控制台

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

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

gcloud

使用以下 gcloud 命令更新 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"
}

启用连接排空

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

排查设置问题

如果页面在尝试访问负载均衡器的 IP 地址时无法加载,请尝试按照以下步骤排查设置问题。

由于端口 110 对于许多浏览器而言都是受限端口,因此必须使用 curl 等工具来测试负载均衡器。如果您无法通过 curl 访问自己的页面,可以查看本节其余部分介绍的一些问题排查步骤。

验证实例的运行状况

验证附加到 my-tcp-lb 后端服务的实例是否为 HEALTHY

gcloud compute backend-services get-health my-tcp-lb

验证防火墙规则是否允许流量

  • 健康检查器和负载均衡器都需要 130.211.0.0/2235.191.0.0/16 处于打开状态。
  • 如果您使用的是实例标记,请确保标记列在防火墙规则的 TARGET_TAGS 下,并确保您的所有实例都具有该标记。在以下示例中,实例具有 tcp-lb 标记。
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                    RULES          SRC_TAGS TARGET_TAGS
allow-tcp-lb-and-health    default 130.211.0.0/22,35.191.0.0/16  tcp:110                 tcp-lb

尝试逐个访问实例

临时设置一条允许您逐个访问实例的防火墙规则,然后尝试从特定实例加载页面。

  1. 打开防火墙,以允许任何来源的流量发送到已标记的实例。为此,请创建一个来源过滤条件,以便对于端口 110 上流向具有 tcp-lb 标记的实例的 TCP 流量,将其来源 IP 地址范围设为 0.0.0.0/0

    gcloud compute firewall-rules create allow-tcp110-0-0-0-0 \
        --source-ranges 0.0.0.0/0 \
        --target-tags tcp-lb \
        --allow tcp:110
    
  2. 查找其中一个实例的 EXTERNAL_IP 地址。

    gcloud compute instances list
    
    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING
  3. 直接从浏览器访问一个或多个实例。

    curl EXTERNAL_IP:110
    
  4. 如果无法通过此方法访问实例,请确保软件运行正常。如果可以逐个访问实例,请确保负载均衡器防火墙规则正确无误。

    gcloud compute firewall-rules describe allow-tcp-lb-and-health
    
    allowed:
      IPProtocol: tcp
        ports:
        '110'
    creationTimestamp: '2017-03-16T15:21:34.119-07:00'
    description: ''
    id: '8144207668574597377'
    kind: compute#firewall
    name: allow-tcp-lb-and-health
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-tcp-lb-and-health
    sourceRanges:
      130.211.0.0/22
      35.191.0.0/16
    targetTags:
      tcp-lb
  5. 确保实例运行正常后,请移除“从任何位置”防火墙规则。

    gcloud compute firewall-rules delete allow-tcp110-0-0-0-0
    

后续步骤