为传统应用负载均衡器设置基于标头和查询参数的路由

本页包含两个传统应用负载均衡器的示例:

如需为全球级外部应用负载均衡器和区域级外部应用负载均衡器配置流量管理,请参阅以下页面:

准备工作

设置基于查询参数的路由

此示例演示了如何使用查询参数通过与查询字符串匹配来执行 A/B 测试。

添加两个后端实例组

要使路由生效,您必须有多个后端。

要设置两个后端,您的虚拟机需要位于两个实例组中。本指南介绍如何创建运行 Apache 的 Linux 虚拟机的代管式实例组,然后设置负载均衡。

代管式实例组提供运行外部 HTTP 负载均衡器的后端服务器的虚拟机。出于演示目的,后端会传送其各自的主机名。

为简单起见,后端位于同一区域。如果您需要多区域设置,则必须为第二个区域设置实例模板。

控制台

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 lb-backend-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 点击高级选项
    5. 点击网络并配置以下字段:
      1. 对于网络标记,请输入 allow-health-check
    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. 对于名称,输入 first-example-ig
    4. 位置下方,选择单个可用区
    5. 对于区域,选择您的首选区域。本示例使用 us-east1
    6. 对于可用区,选择 us-east1-b
    7. 实例模板下方,选择实例模板 lb-backend-template
    8. 实例数上限下,输入 2
    9. 自动扩缩模式下,选择 Off:do not autoscale
    10. 点击创建

按同样的方法创建另一个代管式实例组。将第二个命名为 second-example-ig,并使其基于 lb-backend-template 模板。

gcloud

  1. 创建实例模板。

    gcloud compute instance-templates create `lb-backend-template` \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --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. 基于模板创建第一个代管式实例组。

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. 基于模板创建第二个代管式实例组。

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

配置防火墙规则

在此示例中,您将创建 fw-allow-health-check 防火墙规则。这是一种入站流量规则,允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识虚拟机。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。
    转到“防火墙政策”
  2. 点击创建防火墙规则以创建第二条防火墙规则:
  3. 输入 fw-allow-health-check 作为名称
  4. 网络下,选择 Default
  5. 目标下,选择指定的目标标记
  6. 使用 allow-health-check 填充目标标记字段。
  7. 来源过滤条件设置为 IPv4 范围
  8. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16
  9. 协议和端口下,选择指定的协议和端口
  10. 选中 TCP 复选框,然后输入 80 作为端口号。
  11. 点击创建

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

预留外部 IP 地址

现在您的实例已启动并正在运行,接下来请设置一个全局静态外部 IP 地址,以供客户用来访问您的负载均衡器。

控制台

  1. 转到 Google Cloud 控制台中的“外部 IP 地址”页面。
    转到“外部 IP 地址”页面
  2. 点击预留静态地址以预留 IPv4 地址。
  3. 指定名称 lb-ipv4-1
  4. 将网络层级设置为标准
  5. IP 版本设置为 IPv4
  6. 类型设置为全局
  7. 点击预留
  8. 确保将类型设置为全局
  9. 点击预留

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

设置负载均衡器后端

控制台

Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud 或 API。

gcloud

  1. 创建健康检查
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 创建第一个后端服务
    • 对于全球外部应用负载均衡器,请将 gcloud CLI 命令与 load-balancing-scheme=EXTERNAL_MANAGED 结合使用。此设置提供了高级流量管理功能
    • 对于经典版应用负载均衡器,请使用 load-balancing-scheme=EXTERNAL
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 创建第二个后端服务
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. 将第一个实例组作为后端添加到第一个后端服务。
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. 将第二个实例组作为后端添加到第二个后端服务。
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

创建网址映射

控制台

Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud 或 API。

gcloud

  1. 创建 YAML 文件 /tmp/web-map-http.yaml。将 PROJECT_ID 替换为您的项目 ID。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. 验证网址映射。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    如果测试通过并且命令输出成功消息,请将更改保存到网址映射。

  3. 更新网址映射。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

创建目标代理和转发规则

控制台

Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud 或 API。

gcloud

  1. 创建目标 HTTP 代理以将请求路由到您的网址映射。
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 创建全局转发规则以将传入请求路由到代理。
    • 对于全球外部应用负载均衡器,请将 gcloud CLI 命令与 load-balancing-scheme=EXTERNAL_MANAGED 结合使用。此设置提供了高级流量管理功能
    • 对于经典版应用负载均衡器,请使用 load-balancing-scheme=EXTERNAL
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

测试

请记下预留的 IPv4 地址:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

通过运行以下命令来测试此设置:

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

在浏览器中,打开 http://IP_ADDRESS?ABTest=Ahttp://IP_ADDRESS?ABTest=B

设置基于 HTTP 标头的路由

此示例演示了如何添加和移除 HTTP 标头以进行智能路由。

准备工作

您可以使用现有的外部应用负载均衡器,也可以新建一个。

您可以将此功能用于任何受支持的后端类型。此示例假定您在实例组中使用虚拟机。

如需设置简单的负载均衡器,请参阅上面的基于查询参数的示例。

更新网址映射

控制台

Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud 或 API。

gcloud

  1. 此示例演示了通过匹配请求的 HTTP 标头中的值来使用 HTTP 请求标头执行 A/B 测试。

    创建 YAML 文件 /tmp/web-map-http.yaml。将 PROJECT_ID 替换为您的项目 ID。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. 验证网址映射。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    如果测试通过并且命令输出成功消息,请将更改保存到网址映射。

  3. 更新网址映射。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

测试

使用关联负载均衡器的 IPv4 地址,通过运行以下命令来测试此设置:

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

后续步骤