Istio中基于Lua的EnvoyFilter不生效问题排查咨询
问题核心原因
你的配置最根本的错误是Lua HTTP过滤器属于HTTP连接管理器的过滤器链组件,不能直接通过MERGE操作附加到HTTP_ROUTE或VIRTUAL_HOST资源上,你当前的patch操作只是给路由对象加了无关的配置字段,Envoy执行时根本不会读取这部分配置。
可行配置方案(匹配你仅特定VirtualService生效的需求)
简化方案(单EnvoyFilter实现)
直接在网关的HTTP过滤器链插入Lua脚本,在脚本内判断路由名称,仅目标路由执行逻辑:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: gateway-lua-test namespace: istio-system spec: workloadSelector: labels: istio: ingressgateway configPatches: - applyTo: HTTP_FILTER match: context: GATEWAY listener: portNumber: 443 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 inlineCode: | function envoy_on_response(response_handle) -- 匹配你需要的目标路由名称 if response_handle:route():routeConfigName() == "https.443.https.geth-dedicated.default" then response_handle:headers():add("dm3ch-test", "dm3ch") response_handle:logErr("Bye Bye.") end end
通用排查步骤
- 配置生效校验:执行
istioctl proxy-config listeners <gateway-pod-name> -o yaml | grep lua确认过滤器已经被插入到连接管理器的过滤器链中 - 配置语法校验:查看istiod日志,确认没有EnvoyFilter配置格式错误导致的配置丢弃
- 日志排查:查看ingressgateway的Pod日志,确认Lua脚本执行没有语法报错,你使用的
logErr方法输出的日志级别是ERROR,需要确认网关日志级别配置没有过滤ERROR级别的日志 - 版本兼容:你使用的是1.12.0-alpha.1测试版本,存在未修复bug的概率,验证不通可以切换到正式发布的稳定版本(如1.12.9)复现测试
内容的提问来源于stack exchange,提问作者Dm3Ch
相关产品推荐
相关产品推荐

