配置边缘扩展程序

借助 Service Extensions,受支持的应用负载平衡器 可以使用插件在处理路径中插入自定义处理 。 边缘扩展程序会在负载均衡器收到请求标头 并且在评估网址映射或 调用 Cloud CDN 之前 在请求处理路径中运行,这让您可以影响缓存和路由。本页面介绍了如何配置边缘扩展程序。

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

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

  • 要附加到的转发规则
  • 插件

扩展程序引用要附加到的负载均衡器 转发规则。 配置资源后,负载均衡器会开始向扩展程序服务发送匹配的请求。您只能将一个边缘扩展程序附加到转发规则,并且只能在边缘扩展程序链中包含一个插件。

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

使用插件进行配置

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

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

准备工作

  1. 创建一个插件,其中包含您的 自定义代码。

  2. 创建并配置支持边缘扩展程序插件的应用负载平衡器。

    按照设置具有虚拟机实例组后端的全球外部应用负载平衡器页面上的说明执行所有步骤,但以下步骤除外:

    • 将后端服务命名为 service-one。
    • 将 service-one 指向区域 A 中的虚拟机 (VM) 实例。
    • 默认情况下,将 gl7-gxlb-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-gxlb-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 页面。

      前往 Service Extensions

    2. 点击创建扩展程序 。

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

    3. 对于产品,选择 Load Balancing 。然后,点击继续 。

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

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

    5. 对于扩展程序类型,选择边缘扩展程序,然后点击 继续。

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

      在创建扩展程序 表单中,请注意,之前的选择项不可修改。

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

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

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

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

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

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

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

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

    9. 对于转发规则,选择要与扩展程序关联的一条或多条转发规则,例如cr-xlb-forwarding-rule。

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

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

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

        对于每个 CEL 表达式,边缘扩展程序仅允许使用一个正则表达式。

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

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

      • 对于插件,选择使用 Service Extensions 创建的 或相同产品和扩展程序类型的插件。您只能在边缘扩展程序中包含一个插件。

      • 对于转发属性,选择您希望负载均衡器转发给 Wasm 插件或标注的请求、连接和 位置属性。对于每个扩展程序,您最多可以配置 16 个属性。如需了解详情,请参阅 支持的属性。

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

      • 可选:对于故障开放,如果您希望扩展程序故障 开放,请选择已启用。在这种情况下,如果对扩展程序的调用失败或超时,请求或响应处理会继续进行,而不会出错。

        默认情况下,系统不会选择故障开放 字段。在这种情况下,如果响应标头尚未传递给下游客户端,系统会向客户端返回通用 HTTP 500 状态代码。如果响应标头已传递,则会重置到下游客户端的 HTTP 数据流。

      对于边缘扩展程序,您只能为每个扩展程序链指定一个扩展程序。

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

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

    11. 点击创建扩展程序 。

    gcloud

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

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

      替换以下内容:

      • PROJECT_ID: 项目 ID
      • WASM_PLUGIN:插件的 ID 或完全限定名称

      对于每个 CEL 表达式,边缘扩展程序仅允许使用一个正则表达式。

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

      借助 forwardAttributes 字段,您可以指定可以转发给 Wasm 插件或标注服务的请求、连接和位置属性。对于每个扩展程序,您最多可以配置 16 个属性。如需详细了解支持的 属性, 请参阅支持的属性。

    2. 导入边缘扩展程序。使用 gcloud service-extensions lb-edge-extensions import 命令 以及以下示例值:

      gcloud service-extensions lb-edge-extensions import edge-ext \
          --source=edge-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
    

边缘扩展程序的限制

  • 您只能将一个边缘扩展程序附加到转发规则。
  • 边缘扩展程序不支持 HTTP 正文处理。
  • 对于每个 CEL 表达式,边缘扩展程序仅允许使用一个正则表达式。

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

后续步骤