配置流量扩展程序

借助 Service Extensions,受支持的应用负载平衡器可以使用插件或向后端服务发送标注,以便在处理路径中插入自定义处理。流量扩展程序在请求处理路径中最后运行,在响应处理路径中首先运行,以修改标头和载荷,而不会影响后端服务的选择。本页介绍了如何配置流量扩展。

如需大致了解应用负载平衡器扩展程序,请参阅 Cloud Load Balancing 扩展程序概览

应用负载平衡器的流量扩展指向以下资源:

  • 要附加到的转发规则
  • 插件或调用后端服务,其后端运行 ext_proc gRPC API

流量扩展服务会将相关的扩展服务分组到一个或多个链中。您可以在同一扩展链中配置插件和标注。每个扩展程序链都使用通用表达式语言 (CEL) 匹配条件来选择要处理的流量。负载均衡器会按顺序针对每个链的匹配条件评估请求。当请求符合链中定义的条件时,链中的所有扩展程序都会对该请求执行操作。只有一条链与给定的请求匹配。

链中的每个扩展程序都可以有自己的一组支持的事件。扩展程序对请求和响应内容所做的修改对链中的其余扩展程序可见。对于配置为支持响应事件的扩展程序,扩展程序的序列在响应路径上是反向的。

流量扩展会引用要附加到的负载均衡器转发规则。配置资源后,负载均衡器会开始向扩展服务发送匹配的请求。

如需了解与扩展程序相关的限制,请参阅配额和限制页面。

使用插件进行配置

本部分介绍了如何使用插件配置流量扩展服务。

引用给定插件的所有扩展资源必须具有相同的类型。 扩展程序还必须采用相同的负载均衡方案。您无法使用已在媒体 CDN 扩展程序中使用的插件来配置 Cloud Load Balancing 扩展程序。

准备工作

  1. 创建包含自定义代码的插件。

  2. 创建并配置支持流量扩展插件的应用负载平衡器

    例如,设置具有虚拟机实例组后端的全球外部应用负载平衡器

  3. 设置一种向服务发送测试请求的方式,例如运行 curl。如果您使用的是内部负载均衡器,请创建用于测试的客户端虚拟机

使用插件配置流量扩展程序

以下示例可帮助您配置流量扩展程序,该扩展程序会在主机与 example.com 匹配时添加响应标头 hello: service-extensions

  1. 检查网址映射中是否存在 example.com 的匹配项。

    1. 针对客户端虚拟机中的转发规则运行以下 curl 命令:

      curl -D - -H "host: example.com" FORWARDING_RULE_IP
      

      FORWARDING_RULE_IP 替换为转发规则的 IP 地址。如需查找 IP 地址,请使用 gcloud compute forwarding-rules describe 命令

      输出类似于以下内容:

      HTTP/1.1 200 OK
      ...
      content-length: 46
      content-type: text/html
      via: 1.1 google
      
  2. 配置流量扩展程序。

    控制台

    1. 在 Google Cloud 控制台中,前往服务扩展程序页面。

      前往 Service Extensions

    2. 点击创建扩展程序

      系统会打开一个向导,引导您完成一些初始步骤。

    3. 对于产品,选择负载均衡。然后,点击继续

      系统会显示支持的应用负载平衡器列表。

    4. 对于负载均衡器类型,请选择全球外部应用负载均衡器或跨区域内部应用负载均衡器。然后,点击继续

    5. 对于扩展程序类型,选择流量扩展程序,然后点击继续

    6. 如需打开创建扩展程序表单,请点击继续

      创建扩展程序表单中,请注意页面顶部显示的前述选择项无法修改。

    7. 基本信息部分,执行以下操作:

      1. 为扩展程序指定一个唯一名称。

        名称必须以小写字母开头,后面最多可跟 62 个小写字母、数字或连字符,但不能以连字符结尾。

      2. 可选:输入简短的扩展程序说明,最多可输入 1,024 个字符。

      3. 可选:在标签部分中,点击添加标签。然后,在显示的行中,执行以下操作:

        • 中,输入键名称。
        • 对于,输入该键的值。

        如需添加更多键值对,请点击添加标签。您最多可以添加 64 个键值对。

        如需详细了解标签,请参阅为项目创建和更新标签

    8. 转发规则字段中,选择要与扩展程序关联的一条或多条转发规则,例如 http-content-rule

      已与其他扩展服务相关联的转发规则无法选择,并且会显示为不可用。

    9. 对于扩展程序链,请添加一个或多个要针对匹配请求执行的扩展程序链。

      如需添加扩展链,请执行以下操作,然后点击完成

      • 对于新扩展链,请指定一个唯一的名称。

        名称必须符合 RFC-1034 的要求,仅限使用小写字母、数字和连字符,且长度上限为 63 个字符。此外,第一个字符必须是字母,最后一个字符必须是字母或数字。

      • 若要匹配执行扩展程序链的请求,请为匹配条件指定通用表达式语言 (CEL) 表达式,例如 request.host == "example.com"

        如需详细了解 CEL 表达式,请点击获取语法帮助或参阅 CEL 匹配器语言参考文档

      • 添加一个或多个要针对匹配请求执行的扩展程序。

        对于每个扩展服务,请在扩展服务下执行以下操作,然后点击完成

        • 对于可编程性类型,选择插件

        • 对于扩展程序名称,请指定一个唯一的名称。

          名称必须符合 RFC-1034 的要求,仅限使用小写字母、数字和连字符,且长度上限为 63 个字符。此外,第一个字符必须是字母,最后一个字符必须是字母或数字。

        • 对于插件,请选择使用服务扩展程序创建的具有相同产品和扩展程序类型的插件。

        • 对于事件,选择一个或多个调用扩展程序的 HTTP 事件类型。

        • 对于转发标头,点击添加标头,然后添加要转发到扩展程序的 HTTP 标头(从客户端或后端)。如果未指定标头,则系统会发送所有标头。

        • 可选:如果扩展服务超时或失败,并且您希望继续处理请求或响应,请为故障开放选择已启用。链中的后续扩展程序也会执行。

          默认情况下,系统未选择故障时打开选项。在这种情况下,如果发生错误,请求或响应处理会停止。如果响应标头尚未传递给下游客户端,系统会向客户端返回通用 HTTP 500 状态代码。如果响应标头已传递,则会重置到客户端的 HTTP 数据流。

          如果优先考虑安全性或完整性,建议采用默认选项,即不选择应急开启。启用故障开放(尤其是对于非关键操作)有助于优先考虑可用性。

    10. 点击创建扩展程序

    gcloud

    1. 在 YAML 文件中定义插件,并将其与转发规则相关联,例如 http-content-rule

      cat >traffic-plugin.yaml <<EOF
          name: traffic-ext
          forwardingRules:
          - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/http-content-rule
          loadBalancingScheme: EXTERNAL_MANAGED
          extensionChains:
          - name: "chain1"
            matchCondition:
              celExpression: 'request.host == "example.com"'
            extensions:
            - name: 'ext1'
              service: projects/PROJECT_ID/locations/LOCATION/wasmPlugins/WASM_PLUGIN
              failOpen: false
              supportedEvents:
              - RESPONSE_HEADERS
      EOF
      

      替换以下内容:

      • PROJECT_ID项目 ID
      • REGION:转发规则的区域。该值必须与为插件位置指定的值一致。
      • LOCATION:插件的位置,可以是 global 或区域。
      • WASM_PLUGIN:插件的 ID 或完全限定名称。
    2. 导入流量扩展程序。使用 gcloud service-extensions lb-traffic-extensions import 命令以及以下示例值。

      gcloud service-extensions lb-traffic-extensions import traffic-ext \
          --source=traffic-plugin.yaml \
          --location=global
      

    创建流量扩展服务后,新插件需要一段时间才能分发到所有位置。由于插件并非同时交付到所有地区,因此时间可能会因地区而异。

  3. 如需验证流量扩展程序是否按预期工作,请使用相同的 curl 命令:

    curl -D - -H "host: example.com" FORWARDING_RULE_IP
    

    输出内容包含 hello: service-extensions 响应标头。

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/
    hello: service-extensions
    via: 1.1 google
    

    如需验证扩展程序是否仅以 example.com 流量为目标,请重复执行 curl 命令,但不要添加 host 标头。

    curl -D - FORWARDING_RULE_IP
    

    输出类似于以下内容:

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/html
    via: 1.1 google
    

使用调出来配置流向用户管理服务的流量扩展

本部分介绍如何使用插桩来配置流量扩展,以扩展到用户管理的插桩后端服务。

准备工作

按照配置插播广告后端服务中的说明创建所需资源。

使用宣传信息配置流量扩展服务

以下示例可帮助您配置流量扩展程序,方法是使用在主机与 example.com 匹配时调用的标注。callout-vm 中的流量扩展服务器会向匹配的请求添加响应标头 hello: service-extensions

  1. 检查网址映射中是否存在 example.com 的匹配项。

    1. 针对客户端虚拟机中的转发规则运行以下 curl 命令:

      curl -D - -H "host: example.com" FORWARDING_RULE_IP
      

      FORWARDING_RULE_IP 替换为转发规则的 IP 地址。如需查找 IP 地址,请使用 gcloud compute forwarding-rules describe 命令

      输出类似于以下内容:

      HTTP/1.1 200 OK
      ...
      content-length: 46
      content-type: text/html
      via: 1.1 google
      
      Page served from: l7-ilb-backend-example-1c7t
      
  2. 配置流量扩展程序。

    控制台

    1. 在 Google Cloud 控制台中,前往服务扩展程序页面。

      前往 Service Extensions

    2. 点击创建扩展程序

      系统会打开一个向导,引导您完成一些初始步骤。

    3. 对于产品,选择负载均衡。然后,点击继续

      系统会显示支持的应用负载平衡器列表。

    4. 选择负载均衡器类型。对于区域级负载平衡器,还需指定区域。点击继续

    5. 对于扩展程序类型,选择流量扩展程序,然后点击继续

    6. 如需打开创建扩展程序表单,请点击继续

      创建扩展程序表单中,请注意页面顶部显示的前述选择项无法修改。

    7. 基本信息部分,执行以下操作:

      1. 为扩展程序指定一个唯一名称。

        名称必须以小写字母开头,后面最多可跟 62 个小写字母、数字或连字符,但不能以连字符结尾。

      2. 可选:输入简短的扩展程序说明,最多可输入 1,024 个字符。

      3. 可选:在标签部分中,点击添加标签。然后,在显示的行中,执行以下操作:

        • 中,输入键名称。
        • 对于,输入该键的值。

        如需添加更多键值对,请点击添加标签。您最多可以添加 64 个键值对。

        如需详细了解标签,请参阅为项目创建和更新标签

    8. 转发规则字段中,选择要与扩展程序关联的一条或多条转发规则,例如 l7-ilb-forwarding-rule

      已与其他扩展服务相关联的转发规则无法选择,并且会显示为不可用。

    9. 对于扩展程序链,请添加一个或多个要针对匹配请求执行的扩展程序链。

      如需添加扩展链,请执行以下操作,然后点击完成

      • 对于可编程性类型,选择调用

      • 对于新的扩展程序链名称,请指定一个唯一的名称。

        名称必须符合 RFC-1034 的要求,仅限使用小写字母、数字和连字符,且长度上限为 63 个字符。 此外,第一个字符必须是字母,最后一个字符必须是字母或数字。

      • 若要匹配执行扩展程序链的请求,请为匹配条件指定通用表达式语言 (CEL) 表达式,例如 request.host == "example.com"

        如需详细了解 CEL 表达式,请点击获取语法帮助或参阅 CEL 匹配器语言参考文档

      • 添加一个或多个要针对匹配请求执行的扩展程序。

        对于每个扩展服务,请在扩展服务下执行以下操作,然后点击完成

        • 对于扩展程序名称,请指定一个唯一的名称。

          名称必须符合 RFC-1034 的要求,仅限使用小写字母、数字和连字符,且长度上限为 63 个字符。此外,第一个字符必须是字母,最后一个字符必须是字母或数字。

        • 对于 Authority,请输入从负载均衡器发送到扩展程序服务的 gRPC 请求中的 authority 标头。

        • 对于后端服务,请选择按照配置插播广告后端服务中的说明创建的后端服务。

        • 对于超时,请指定一个介于 10 到 1000 毫秒之间的值,该值表示数据流上消息的超时时间。

        • 对于事件,选择一个或多个调用扩展程序的 HTTP 事件类型。

        • 对于转发标头,点击添加标头,然后添加要转发到扩展程序的 HTTP 标头(从客户端或后端)。如果未指定标头,则系统会发送所有标头。

        • 可选:如果扩展服务超时或失败,并且您希望继续处理请求或响应,请为故障开放选择已启用。链中的后续扩展程序也会执行。

          默认情况下,系统未选择故障时打开选项。在这种情况下,如果发生错误,请求或响应处理会停止。如果响应标头尚未传递给下游客户端,系统会向客户端返回通用 HTTP 500 状态代码。如果响应标头已传递,则会重置到客户端的 HTTP 数据流。

          如果优先考虑安全性或完整性,建议采用默认选项,即不选择应急开启。启用故障开放(尤其是对于非关键操作)有助于优先考虑可用性。

        • 对于元数据,点击添加元数据,然后指定建议的示例值。对于,请指定 key;对于,请指定 value

          点击添加元数据可添加其他键值对。对于,请指定 fr;对于,请指定 forwarding_rule_id

          通过元数据字段,您可以将任何其他信息从负载均衡器传递到扩展服务器。元数据以 ProcessingRequest 消息的形式发送,并编码为 protobuf.Struct。元数据中与指定转发规则 ID 匹配的任何文本都会替换为与客户端请求关联的转发规则的完全限定资源网址。

          元数据的总大小必须小于 1 KiB。元数据中的键总数必须小于 20。 每个键的长度必须小于 64 个字符。每个值的长度必须小于 1,024 个字符。所有值都必须是字符串。

    10. 点击创建扩展程序

    gcloud

    1. 在 YAML 文件中定义标注,并将其与转发规则相关联。使用提供的示例值。

      cat >traffic.yaml <<EOF
          name: traffic-ext
          forwardingRules:
          - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/l7-ilb-forwarding-rule
          loadBalancingScheme: INTERNAL_MANAGED
          extensionChains:
          - name: "chain1"
            matchCondition:
              celExpression: 'request.host == "example.com"'
            extensions:
            - name: 'ext11'
              authority: ext11.com
              service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/l7-ilb-callout-service
              failOpen: false
              timeout: 0.1s
              metadata:
                "key": "value"
                "fr": "forwarding_rule_id"
              supportedEvents:
              - RESPONSE_HEADERS
      EOF
      

      PROJECT_ID 替换为项目 ID

      扩展程序配置中的 metadata 字段可让您将任何其他信息从负载均衡器传递到扩展程序服务器。元数据以 ProcessingRequest 消息的形式发送,并编码为 protobuf.Struct。元数据中与指定转发规则 ID 匹配的任何文本都会替换为与客户端请求关联的转发规则的完全限定资源网址。

      metadata 的总大小必须小于 1 KiB。 元数据中的键总数必须小于 16。每个键的长度必须小于 64 个字符。每个值的长度必须小于 1,024 个字符。所有值都必须是字符串。

    2. 导入流量扩展程序。使用 gcloud service-extensions lb-traffic-extensions import 命令以及以下示例值。

      gcloud service-extensions lb-traffic-extensions import traffic-ext \
          --source=traffic.yaml \
          --location=us-west1
      
  3. 验证流量扩展服务是否按预期运行。使用相同的 curl 命令:

    curl -D - -H "host: example.com" FORWARDING_RULE_IP
    

    输出内容包含 hello: service-extensions 响应标头。

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/
    hello: service-extensions
    via: 1.1 google
    
    Page served from: l7-ilb-backend-example-1c7t
    

    如需验证扩展程序是否仅以 example.com 流量为目标,请重复执行 curl 命令,但不要添加 host 标头。

    curl -D - FORWARDING_RULE_IP
    

    输出类似于以下内容:

    HTTP/1.1 200 OK
    ...
    content-length: 46
    content-type: text/html
    via: 1.1 google
    
    Page served from: l7-ilb-backend-example-1c7t
    

后续步骤