配置流量扩展程序

借助 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 页面。

      前往 Service Extensions

    2. 点击创建扩展程序

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

    3. 在“产品”部分,选择 Load Balancing 。然后,点击继续

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

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

    5. 在“扩展程序类型”部分,选择流量扩展程序 ,然后点击 继续

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

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

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

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

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

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

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

      • 部分,输入键名称。
      • 部分,输入该键的值。

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

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

    9. 转发规则 部分,选择要与扩展程序关联的一个或多个转发 规则,例如 http-content-rule

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

    10. 扩展程序部分,如需添加要针对匹配的 请求执行的扩展程序,请执行以下操作:

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

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

      • 可编程性类型 部分,选择插件

      • 插件 部分,选择使用 Service Extensions 为同一产品和扩展程序类型创建的插件。

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

      • 转发属性部分,选择您 希望扩展程序转发的属性。如需了解详情,请参阅 支持的属性

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

      • 可选:如果扩展程序超时或失败,并且您希望 请求或响应处理继续进行,请在失败时打开部分选择已启用。链中的后续扩展程序也会执行。

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

        在优先考虑安全性或完整性时,最好保留失败时打开 处于未选中状态的默认选项。启用 失败时打开(尤其是对于非关键操作)有助于 优先考虑可用性。

      如果您希望指定多个扩展程序或扩展程序链,而不是单个扩展程序,请点击表单末尾的切换到高级模式 按钮,然后指定所需的扩展程序和链。扩展程序会按照其列出的顺序运行。

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

    11. 点击创建扩展程序

    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
              forwardAttributes:
              - request.host
              - request.path
      EOF
      

      替换以下内容:

      • PROJECT_ID:项目 ID。
      • REGION:转发规则的区域。该值必须与为插件位置指定的值一致。
      • LOCATION:插件的位置,可以是 global 或区域。
      • WASM_PLUGIN:插件的 ID 或完全限定名称。

      如需详细了解 YAML 文件中的字段,请参阅 API 文档中的 ExtensionChain 。如需了解受支持的属性, 请参阅 支持的属性

    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 页面。

      前往 Service Extensions

    2. 点击创建扩展程序

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

    3. 在“产品”部分,选择 Load Balancing 。然后,点击继续

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

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

    5. 在“扩展程序类型”部分,选择流量扩展程序 ,然后点击 继续

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

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

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

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

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

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

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

      • 部分,输入键名称。
      • 部分,输入该键的值。

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

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

    9. 转发规则部分,选择要与扩展程序关联的一个或多个转发 规则,例如 l7-ilb-forwarding-rule

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

    10. 扩展程序部分,如需添加要针对匹配的 请求执行的扩展程序,请执行以下操作:

      • 可编程性类型 部分,选择标注

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

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

      • 授权部分,输入从 负载均衡器发送到扩展程序服务的 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 个字符。所有值都必须是字符串。

      如果您希望指定多个扩展程序或扩展程序链,而不是单个扩展程序,请点击表单末尾的切换到高级模式 按钮,然后指定所需的扩展程序和链。扩展程序会按照其列出的顺序运行。

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

    11. 点击创建扩展程序

    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
              forwardAttributes:
              - request.host
              - request.path
      EOF
      

      PROJECT_ID 替换为 项目 ID

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

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

      如需详细了解 YAML 文件中的字段,请参阅 API 文档中的 ExtensionChain 。如需了解受支持的属性, 请参阅 支持的属性

    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
    

后续步骤