利用 EnvoyPatchPolicy 拓展 Envoy Gateway 的能力

注意:本文基于 Envoy Gateway v1.3.2。

Envoy Gateway 构建在 Envoy Proxy 之上,提供了一套丰富的功能。然而,在某些情况下,你可能希望使用 Envoy Proxy 的一些功能,而这些功能并未通过 Envoy Gateway 的 API 暴露出来。这时就可以使用从 Envoy Gateway v0.5.0 引入的 EnvoyPatchPolicy API[1]。它允许你自定义 Envoy Gateway 生成的 xDS 资源。本文将指导你如何启用该 API,并实现一个非常实用的功能 —— 本地响应修改(Local Reply Modification)[2]

我们将从前置条件开始介绍,然后讲解如何启用 EnvoyPatchPolicy、如何编写自定义响应逻辑,并最终验证效果。

需要注意的是,该 API 由于依赖 Envoy Proxy 和 Envoy Gateway 的 xDS 翻译机制,可能在版本间存在不稳定性。但使用 EnvoyPatchPolicy,可以让你动态地塑造 Envoy Gateway 的行为,释放其全部潜力。

前置条件

在开始之前,请确保你已正确安装 Envoy Gateway 和示例资源清单。运行以下命令完成环境准备并确保可以通过 HTTP 访问示例 backend:

# 安装 Envoy Gateway 和示例清单
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.3.2 -n envoy-gateway-system --create-namespace
kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available
kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v1.3.2/quickstart.yaml -n default
export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:80 &

启用 EnvoyPatchPolicy

默认情况下,EnvoyPatchPolicy 是关闭的。启用该功能需要创建一个配置文件 ConfigMap,并将其挂载到 Envoy Gateway。执行以下命令:

cat <

自定义响应逻辑

使用 EnvoyPatchPolicy API,你可以修改 Envoy Gateway 生成的 xDS 资源[3]。目前仅支持 JSONPatch 类型。

Envoy 提供了修改本地响应内容的能力,你可以通过配置 mappers[4] 来指定需要变更的响应内容。每个 mapper 包含一个 filter[5] 和多个改写规则,例如:

  • • status_code[6]:修改状态码

  • • headers_to_add[7]:添加响应头

  • • body[8]:重写响应内容

  • • body_format_override[9]:指定返回格式

Envoy 会按顺序处理这些 mapper,匹配成功后即应用对应改写规则。

我们来构建一个案例:当后端返回 404 时,Envoy Gateway 将其替换为 406,并附带一段自定义文本提示。

下面是该案例的架构图:

利用 EnvoyPatchPolicy 拓展 Envoy Gateway 的能力_第1张图片


使用 EnvoyPatchPolicy 实现 Local Reply Modification

执行以下配置:

cat <

然后我们需要修改示例中的 HTTPRoute,仅匹配 /get 路径:

kubectl patch httproute backend --type=json -n default --patch '[{
   "op": "add",
   "path": "/spec/rules/0/matches/0/path/value",
   "value": "/get",
}]'

接下来我们访问 /find 路径进行验证:

curl --header "Host: www.example.com" http://localhost:8888/find

你将看到如下响应:

could not find what you are looking for

如前所述,由于 EnvoyPatchPolicy 依赖底层的 Envoy 和 Gateway API 结构,未来版本可能存在差异,请关注官方文档并做好兼容性准备。

尽情探索这个强大的扩展机制,让你的 Envoy Gateway 实现更强的可编程能力吧!

参考资料

  • • Envoy Patch Policy - gateway.envoyproxy.io[10]

  • • Quickstart - gateway.envoyproxy.io[11]

引用链接

[1] EnvoyPatchPolicy API:https://gateway.envoyproxy.io/docs/tasks/extensibility/envoy-patch-policy/
[2]本地响应修改(Local Reply Modification):https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/local_reply
[3]xDS 资源:https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol#resource-types
[4]mappers:https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-localreplyconfig-mappers
[5]filter:https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/accesslog/v3/accesslog.proto#envoy-v3-api-field-config-accesslog-v3-accesslog-filter
[6]status_code:https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-responsemapper-status-code
[7]headers_to_add:https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-responsemapper-headers-to-add
[8]body:https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-responsemapper-body
[9]body_format_override:https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#envoy-v3-api-field-extensions-filters-network-http-connection-manager-v3-responsemapper-body-format-override
[10]Envoy Patch Policy - gateway.envoyproxy.io:https://gateway.envoyproxy.io/docs/tasks/extensibility/envoy-patch-policy/
[11]Quickstart - gateway.envoyproxy.io:https://gateway.envoyproxy.io/docs/tasks/quickstart/

你可能感兴趣的:(gateway)