配置路线扩展服务

借助 Service Extensions,受支持的应用负载平衡器可以使用插件或向后端服务发送标注,以便在处理路径中插入自定义处理。 当负载均衡器收到请求标头时,路由扩展程序会在请求处理路径中运行,并且会在负载均衡器评估网址映射之前运行。本页介绍了如何配置路由扩展。

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

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

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

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

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

如需了解与应用负载平衡器扩展相关的限制,请参阅配额和限制页面。

使用插件进行配置

本部分通过一个示例展示了如何配置路由扩展,以使用插件在路径与 /extensions 匹配时将 :host 请求标头重写为 service-extensions.com。之前的主机和新配置的主机映射到不同区域中的后端服务,这展示了路由行为。

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

准备工作

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

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

    按照设置具有虚拟机实例组后端的跨区域内部应用负载平衡器页面上的说明完成所有步骤,但以下步骤除外:

    • 将后端服务命名为 service-one
    • service-one 指向区域 A 中的虚拟机 (VM) 实例。
    • 默认情况下,将 gl7-gilb-url-map 指向 service-one
  3. 设置另一个后端服务 service-two,并将其指向区域 B 中的虚拟机。

  4. 向网址映射添加指向 service-two 的路径匹配器。使用 gcloud compute url-maps add-path-matcher 命令,并提供以下示例值:

      gcloud compute url-maps add-path-matcher gl7-gilb-url-map \
          --path-matcher-name=rewrite-host \
          --default-service=service-two \
          --new-hosts=service-extensions.com \
          --location=global
    
  5. 设置一种向服务发送测试请求的方式(例如,通过运行 curl)。如果您使用的是内部负载均衡器,请创建用于测试的客户端虚拟机

使用插件配置路线扩展服务

  1. 检查配置扩展程序之前的行为。

    1. 验证没有明确路径的请求是否会发送到区域 A

      curl FORWARDING_RULE_IP
      

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

      输出类似于以下内容,表明网页是从 region A 中的虚拟机提供的:

      Page served from region-A-vm
      
    2. 验证网址映射中是否没有与 /extensions 匹配的项:

      curl FORWARDING_RULE_IP/extensions
      

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

      输出表明网址映射中没有与 /extensions 匹配的项。输出类似于以下内容:

      <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
      <html><head>
      <title>404 Not Found</title>
      </head><body>
      ...
      
  2. 配置路线扩展服务。

    控制台

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

      前往 Service Extensions

    2. 点击创建扩展程序

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

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

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

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

    5. 对于扩展信息类型,选择路线扩展信息,然后点击继续

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • 添加要针对匹配请求执行的扩展程序。对于路线扩展,您只能指定一个扩展。

        扩展程序下,执行以下操作,然后点击完成

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

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

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

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

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

        • 可选:如果扩展服务超时或失败,并且您希望继续处理请求或响应,请为故障开放选择已启用

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

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

    10. 点击创建扩展程序

    gcloud

    1. 在 YAML 文件中定义插件,并将其与全局转发规则(例如 cr-ilb-forwarding-rule)相关联。

      cat >route-plugin.yaml <<EOF
          name: route-ext
          forwardingRules:
          - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/cr-ilb-forwarding-rule
          loadBalancingScheme: INTERNAL_MANAGED
          extensionChains:
          - name: "chain1"
            matchCondition:
              celExpression: 'request.path.startsWith("/extensions")'
            extensions:
            - name: 'ext1'
              service: projects/PROJECT_ID/locations/LOCATION/wasmPlugins/WASM_PLUGIN
              failOpen: false
              supportedEvents:
              - REQUEST_HEADERS
      EOF
      

      替换以下内容:

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

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

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

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

    curl FORWARDING_RULE_IP/extensions
    

    输出类似于以下内容,表明网页是从 region B 中的虚拟机提供的:

    Page served from region-B-vm
    

    如需验证插件是否仅针对具有 /extension 路径前缀的请求运行,请重复执行 curl 命令,但不指定路径。

    curl FORWARDING_RULE_IP
    

    输出类似于以下内容:

    Page served from region-A-vm
    

使用宣传信息进行配置

本部分介绍如何使用调出来配置路线扩展服务。

准备工作

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

使用宣传信息配置路线扩展服务

以下示例展示了如何配置在路径与 /extensions 匹配时调用的路由扩展程序。callout-vm 中的路由调用服务器将 Host 标头更改为 service-extensions.com,将路径设置为 /,然后向负载均衡器发送指令以重新计算路由。然后,流量会流向 l7-ilb-backend-service2 而不是 l7-ilb-backend-service

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

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

      curl FORWARDING_RULE_IP/extensions
      

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

      输出表明网址映射中没有与 /extensions 匹配的项。输出类似于以下内容:

      <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
      <html><head>
      <title>404 Not Found</title>
      </head><body>
      ...
      
  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.path.startsWith("/extensions")

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

      • 添加要针对匹配请求执行的扩展程序。对于路线扩展,您只能指定一个扩展。

        扩展程序下,执行以下操作,然后点击完成

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

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

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

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

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

        • 对于超时,请指定一个介于 10 到 1000 毫秒之间的值,在此时间之后,当负载平衡器仍在等待 ext_proc 服务的响应时,流上的消息会超时。

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

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

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

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

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

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

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

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

    10. 点击创建扩展程序

    gcloud

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

      cat >route.yaml <<EOF
          name: route-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.path.startsWith("/extensions")'
            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"
      EOF
      

      PROJECT_ID 替换为项目 ID

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

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

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

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

    curl FORWARDING_RULE_IP/extensions
    

    输出表明,即使原始请求未匹配,流量也匹配了虚拟主机 service-extensions.com 并到达了 l7-ilb-backend-service2 服务。输出类似于以下内容:

    Page served from second backend service
    

    如需验证调出是否仅定位到带有 /extension 前缀的请求,请重复执行 curl 命令,但不要添加 path 前缀。

    curl FORWARDING_RULE_IP
    

    输出类似于以下内容:

    Page served from: l7-ilb-backend-example-1c7t
    

路线扩展的限制

  • 路由扩展程序不支持 HTTP 正文处理。
  • 对于路由扩展,不支持从扩展直接向客户端发送响应。如果您的路线扩展服务器使用包含直接响应的处理响应来响应处理请求,则负载均衡器会忽略该处理响应。

如需了解适用于所有扩展程序的限制,请参阅扩展程序的限制

后续步骤