借助 Service Extensions,受支持的应用负载平衡器 可以使用插件或向后端服务发送标注,以便在处理路径中插入自定义处理 。流量扩展程序 在请求处理路径中最后运行,在响应处理路径中首先运行,以便修改标头和载荷,而不会影响后端服务的选择。本页面介绍了如何配置流量扩展程序。
如需大致了解应用负载平衡器扩展程序,请参阅 Cloud Load Balancing 扩展程序概览。
应用负载平衡器的流量扩展程序指向以下资源:
- 要附加到的转发规则
- 后端运行
ext_procgRPC API 的插件或标注后端服务
流量扩展程序会将相关的扩展程序服务分组到一个或多个链中。您可以在同一扩展程序链中配置插件和标注。每个扩展程序链都会使用 通用表达式语言 (CEL) 匹配条件来选择要处理的流量。负载均衡器会按顺序针对每个链的匹配条件评估请求。当请求与链定义的条件匹配时,链中的所有扩展程序都会处理该请求。只有一个链与给定请求匹配。
链中的每个扩展程序都可以有自己的一组受支持的事件。扩展程序对请求和响应内容所做的修改对链中的其余扩展程序可见。对于配置为支持响应事件的扩展程序,扩展程序的顺序在响应路径上是相反的。
流量扩展程序引用要附加到的负载均衡器 转发规则。 配置资源后,负载均衡器会开始向扩展程序服务发送匹配的请求。
如需了解与扩展程序相关的限制,请参阅 配额和限制页面。
使用插件进行配置
本部分介绍了如何使用插件配置流量扩展程序。
引用给定插件的所有扩展程序资源都必须是同一类型。 扩展程序还必须具有相同的负载均衡方案。您无法使用已在媒体 CDN 扩展程序中使用的插件配置 Cloud Load Balancing 扩展程序。
准备工作
创建并配置支持流量扩展程序插件的应用负载平衡器。
设置一种向服务发送测试请求的方式,例如运行 curl。如果您使用的是内部负载均衡器, 请创建一个客户端虚拟机以进行测试。
使用插件配置流量扩展程序
以下示例可帮助您使用插件配置流量扩展程序,该插件会在主机与 example.com 匹配时添加响应标头 hello: service-extensions。
检查网址映射中是否有与
example.com匹配的项。针对客户端虚拟机中的转发规则运行以下
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
配置流量扩展程序。
控制台
在 Google Cloud 控制台中,前往 Service Extensions 页面。
点击创建扩展程序 。
系统会打开一个向导,引导您完成一些初始步骤。
在“产品”部分,选择 Load Balancing 。然后,点击继续 。
系统会显示 受支持的应用负载平衡器 列表。
在“负载均衡器类型”部分,选择“全球外部应用负载均衡器”或“跨区域内部应用负载均衡器”。然后,点击继续 。
在“扩展程序类型”部分,选择流量扩展程序 ,然后点击 继续 。
如需打开创建扩展程序 表单,请点击继续 。
在创建扩展程序 表单中,请注意,页面顶部显示的前述选择项不可修改。
在基本信息 部分,执行以下操作:
为扩展程序指定一个唯一名称。
名称必须以小写字母开头,后面最多可跟 62 个小写字母、数字或连字符,但不能以连字符结尾。
可选:输入关于扩展程序的简短说明,最多可使用 1,024 个字符。
可选:在标签 部分,点击添加标签 。然后,在显示的行中,执行以下操作:
- 在键 部分,输入键名称。
- 在值 部分,输入该键的值。
如需添加更多键值对,请点击添加标签 。您最多可以添加 64 个键值对。
如需详细了解标签,请参阅 为项目创建和更新标签。
在转发规则 部分,选择要与扩展程序关联的一个或多个转发 规则,例如
http-content-rule。无法选择已与其他扩展程序关联的转发规则,并且这些规则会显示为不可用。
在扩展程序部分,如需添加要针对匹配的 请求执行的扩展程序,请执行以下操作:
如需匹配执行扩展程序链的请求,请在 匹配条件 部分指定通用表达式语言 (CEL) 表达式,例如
request.host == "example.com"。如需详细了解 CEL 表达式,请点击 获取语法帮助 或参阅 CEL 匹配器语言参考文档。
在可编程性类型 部分,选择插件 。
在插件 部分,选择使用 Service Extensions 为同一产品和扩展程序类型创建的插件。
在事件部分,选择调用 扩展程序的一个或多个 HTTP 事件类型。
在转发属性部分,选择您 希望扩展程序转发的属性。如需了解详情,请参阅 支持的属性。
在转发标头部分,点击添加标头,然后添加 要转发到扩展程序的 HTTP 标头(来自客户端或 后端)。如果未指定标头,则系统会发送所有标头。
可选:如果扩展程序超时或失败,并且您希望 请求或响应处理继续进行,请在失败时打开部分选择已启用。链中的后续扩展程序也会执行。
默认情况下,系统不会选择失败时打开 选项。在这种情况下,发生错误时,请求或响应处理会停止。如果响应标头尚未传递给下游客户端,系统会向客户端返回通用 HTTP
500状态代码。如果响应标头已传递,则会重置到客户端的 HTTP 数据流。在优先考虑安全性或完整性时,最好保留失败时打开 处于未选中状态的默认选项。启用 失败时打开(尤其是对于非关键操作)有助于 优先考虑可用性。
如果您希望指定多个扩展程序或扩展程序链,而不是单个扩展程序,请点击表单末尾的切换到高级模式 按钮,然后指定所需的扩展程序和链。扩展程序会按照其列出的顺序运行。
为每个扩展程序和扩展程序链指定唯一名称。名称必须符合 RFC-1034 的要求,仅限使用小写字母、数字和连字符,且长度上限为 63 个字符。此外,第一个字符必须是字母,最后一个字符必须是字母或数字。
点击创建扩展程序 。
gcloud
在 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 。如需了解受支持的属性, 请参阅 支持的属性。
导入流量扩展程序。使用
gcloud service-extensions lb-traffic-extensions import命令 以及以下示例值。gcloud service-extensions lb-traffic-extensions import traffic-ext \ --source=traffic-plugin.yaml \ --location=global
创建流量扩展程序后,新插件需要一些时间才能分发到所有位置。由于插件不会同时分发到所有位置,因此不同位置所需的时间可能会有所不同。
如需验证流量扩展程序是否按预期运行,请使用相同的
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 添加到匹配的请求。
检查网址映射中是否有与
example.com匹配的项。针对客户端虚拟机中的转发规则运行以下
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
配置流量扩展程序。
控制台
在 Google Cloud 控制台中,前往 Service Extensions 页面。
点击创建扩展程序 。
系统会打开一个向导,引导您完成一些初始步骤。
在“产品”部分,选择 Load Balancing 。然后,点击继续 。
系统会显示 受支持的应用负载平衡器 列表。
选择负载均衡器类型。对于区域级负载平衡器,还要指定区域。点击继续 。
在“扩展程序类型”部分,选择流量扩展程序 ,然后点击 继续 。
如需打开创建扩展程序 表单,请点击继续 。
在创建扩展程序 表单中,请注意,页面顶部显示的前述选择项不可修改。
在基本信息 部分,执行以下操作:
为扩展程序指定一个唯一名称。
名称必须以小写字母开头,后面最多可跟 62 个小写字母、数字或连字符,但不能以连字符结尾。
可选:输入关于扩展程序的简短说明,最多可使用 1,024 个字符。
可选:在标签 部分,点击添加标签 。然后,在显示的行中,执行以下操作:
- 在键 部分,输入键名称。
- 在值 部分,输入该键的值。
如需添加更多键值对,请点击添加标签 。您最多可以添加 64 个键值对。
如需详细了解标签,请参阅 为项目创建和更新标签。
在转发规则部分,选择要与扩展程序关联的一个或多个转发 规则,例如
l7-ilb-forwarding-rule。无法选择已与其他扩展程序关联的转发规则,并且这些规则会显示为不可用。
在扩展程序部分,如需添加要针对匹配的 请求执行的扩展程序,请执行以下操作:
在可编程性类型 部分,选择标注 。
如需匹配执行扩展程序链的请求,请在 匹配条件 部分指定通用表达式语言 (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 个字符。此外,第一个字符必须是字母,最后一个字符必须是字母或数字。
点击创建扩展程序 。
gcloud
在 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 。如需了解受支持的属性, 请参阅 支持的属性。
导入流量扩展程序。使用
gcloud service-extensions lb-traffic-extensions import命令以及以下 示例值。gcloud service-extensions lb-traffic-extensions import traffic-ext \ --source=traffic.yaml \ --location=us-west1
验证流量扩展程序是否按预期运行。使用相同的
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
后续步骤
- 在 Service Extensions 插件 GitHub 代码库中查看 Rust、Go 和 C++ 版插件示例及测试工具。
- 在
Service Extensions 标注 GitHub 代码库中查看
ext_proc服务器的 Python 和 Go 示例。 - 配置路由扩展程序
- 管理扩展程序
- 管理插件
- 将扩展程序配置为 Google 服务