为外部 HTTP(S) 负载平衡器设置自定义标头和基于参数的查询路由

设置基于查询参数的路由

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

添加两个后端实例组

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

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

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

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

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组
  3. 选择左侧的新建代管实例组
  4. 对于名称,请输入 first-example-ig
  5. 位置下方,选择单个地区
  6. 对于地区,请选择您偏好的地区。本示例使用 us-east1
  7. 对于地区,请选择 us-east1-b
  8. 实例模板下,选择创建新的实例模板
  9. 对于名称,请输入 lb-backend-template
  10. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 9 (stretch)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
  11. 管理、安全、磁盘、网络、单独租用下的管理标签页上,将以下脚本插入到启动脚本字段。

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. 网络下,添加网络标记 allow-health-check

  13. 点击保存并继续

  14. 实例数下,输入 2

  15. 自动扩缩模式下,选择不自动调节

  16. 点击创建以创建新实例组。

按同样的方法创建另一个托管实例组。将第二个命名为 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-9 \
       --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" \
         # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
         http://169.254.169.254/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 Console 中的“防火墙”页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则以创建第二条防火墙规则:
  3. 输入 fw-allow-health-check 作为名称
  4. 网络下,选择 Default
  5. 目标下,选择指定的目标标记
  6. 使用 allow-health-check 填充目标标记字段。
  7. 来源过滤条件设置为 IP ranges
  8. 来源 IP 地址范围设置为 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 Console 中的“外部 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 \
    --global

请记下预留的 IPv4 地址:

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

设置负载平衡器后端

控制台

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

gcloud

  1. 创建运行状况检查
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 创建第一个后端服务
        gcloud compute backend-services create service-a \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 创建第二个后端服务
        gcloud compute backend-services create service-b \
            --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
        

创建网址映射

控制台

Cloud Console 目前不支持设置基于标头和基于参数的路由。请改用 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
    
  2. 更新网址映射。

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

创建目标代理和转发规则

控制台

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

gcloud

  1. 创建目标 HTTP 代理以将请求路由到您的网址映射。
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 创建全局转发规则以将传入请求路由到代理。
        gcloud compute forwarding-rules create http-content-rule \
            --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 标头以进行智能路由。

准备工作

您可以使用现有的外部 HTTP(S) 负载平衡器,也可以新建一个。

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

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

更新网址映射

控制台

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

gcloud

  1. 创建 YAML 文件 /tmp/web-map-http.yaml

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

    defaultService: $[DEFAULT_SERVICE_URL]
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    pathMatchers:
    - defaultService: $[DEFAULT_SERVICE_URL]
      name: matcher1
      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
    
  2. 更新网址映射。

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