EnvoyFilter需在HTTPRoute的RequestHeaderModifier之后执行的配置咨询
我通过gateway.networking.k8s.io/v1/HTTPRoute配置了请求头修改规则,给匹配/api路径的请求自动添加x-auth-url请求头:
rules: - matches: - path: type: PathPrefix value: /api filters: - type: RequestHeaderModifier requestHeaderModifier: set: - name: "x-auth-url" value: "http://auth.authenticator.svc.cluster.local/apis/auth/v1/verify"
同时在Istio中部署了一个EnvoyFilter,通过Lua脚本提取该请求头并转发到对应地址。手动用curl -H传递x-auth-url时功能正常,但通过HTTPRoute自动添加该头时,EnvoyFilter总是在请求头被添加之前就执行了。我的EnvoyFilter配置片段如下:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: dynamic-auth-filter spec: workloadSelector: labels: istio.io/gateway-name: crc-gateway configPatches: - applyTo: HTTP_FILTER match: context: GATEWAY listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.filters.http.lua typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua inline_code: | function envoy_on_request(request_handle) request_handle:logWarn("[LUA AUTH] Filter invoked. Checking headers...")
查了Envoy文档里的过滤器链补丁点列表,但都是按字母排序的,不知道该怎么配置FilterChain让EnvoyFilter在RequestHeaderModifier之后执行?
核心原因是:Istio中HTTPRoute的RequestHeaderModifier对应Envoy的特定头修改过滤器,而当前Lua过滤器的插入位置在该头修改过滤器之前,导致执行顺序不符。调整步骤如下:
1. 确认RequestHeaderModifier对应的Envoy过滤器名称
首先查看网关Pod的过滤器链,找到头修改逻辑对应的过滤器名称:
istioctl proxy-config filter <网关Pod名称> -n <网关命名空间> -o yaml
在输出中,你会找到对应头修改的过滤器,通常是envoy.filters.http.request_header_modifier或envoy.filters.http.header_to_metadata(取决于Istio版本)。
2. 修改EnvoyFilter的插入位置
将Lua过滤器插入到头修改过滤器的之后,确保头修改完成后再执行Lua逻辑。修改后的EnvoyFilter配置片段如下:
configPatches: - applyTo: HTTP_FILTER match: context: GATEWAY listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.request_header_modifier" # 替换为你查到的实际过滤器名称 patch: operation: INSERT_AFTER # 改为在头修改过滤器之后插入 value: name: envoy.filters.http.lua typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua inline_code: | function envoy_on_request(request_handle) request_handle:logWarn("[LUA AUTH] Filter invoked. Checking headers...")
原理说明
Envoy的HTTP过滤器按链中顺序依次执行:
INSERT_BEFORE会将新过滤器插入到指定过滤器的前面INSERT_AFTER会将新过滤器插入到指定过滤器的后面
之前的配置将Lua过滤器插在router过滤器之前,但路由级别的头修改逻辑是在route过滤器之后、router之前的头修改过滤器中执行的,导致Lua执行时请求头还未被修改。调整插入位置后,Lua会在头修改完成后执行,就能正确读取到x-auth-url请求头。
内容的提问来源于stack exchange,提问作者ensonic

