【Envoy Gateway】Policy attachment:五类策略编译到哪一层,mergeType 挂错父资源会发生什么
内容提要
Envoy Gateway v1.9.0中五类策略(Security、BackendTraffic、ClientTraffic、EnvoyExtension、EnvoyPatch)的生效机制与常见失效原因。重点:mergeType仅允许在xRoute上声明,挂父资源会被拒绝;Lua默认关闭需显式启用;JWT稳定名、限流布局等xDS变更会使旧补丁失效。策略未生效时需先定位是admission拒绝、IR覆盖还是补丁错位。
延伸解读
策略未生效,先定位失败层
文章指出,策略“写了不生效”可能发生在不同层面:admission拒绝、IR覆盖、或补丁错位。例如,mergeType挂在父资源上会被admission拒绝,而Lua策略未生效可能是因为未启用enableLua。排障时应先判断是创建被拒、对象已接受但无效果,还是补丁打空,再对症下药。
mergeType 仅限 xRoute,父资源声明会被拒
v1.9.0起,mergeType字段只允许在xRoute(如HTTPRoute、GRPCRoute等)上声明,挂在Gateway或ListenerSet上会被admission拒绝。这意味着平台无法在父策略上强制向下合并,合并意图只能由子路由策略发出。升级前需检查并删除父资源上的mergeType字段,否则更新会被拒。
Lua 默认关闭,需显式启用
EnvoyExtensionPolicy中的Lua支持在v1.9.0默认关闭,必须在EnvoyGateway配置中设置extensionApis.enableLua: true才能启用。未启用时,Lua策略即使Accepted也不会生效。这是安全默认,因为Lua在Envoy进程内执行无强沙箱。注意disableLua已废弃,与enableLua互斥。
xDS 布局变化导致旧补丁失效
v1.9.0中,JWT provider名称改为稳定名、shared限流规则移至typedPerFilterConfig、Lua过滤器移至listener级,这些变化会使按旧键编写的EnvoyPatchPolicy静默失效。升级后需检查补丁是否仍匹配新资源名,否则即使策略Programmed,补丁也可能打空。
Q&A
Envoy Gateway v1.9.0 中五类策略分别编译到哪一层?
SecurityPolicy、EnvoyExtensionPolicy 编译到 XdsIR 的 HTTP 安全过滤器(HCM 链);BackendTrafficPolicy 跨 RDS 路由动作与 CDS cluster;ClientTrafficPolicy 编译到 XdsIR 的 listener/下游连接选项(LDS);EnvoyPatchPolicy 直接作用于生成的 xDS 资源。
mergeType 在 Envoy Gateway v1.9.0 中允许设置在哪些资源上?挂到父资源会怎样?
mergeType 仅允许设置在 xRoute 上(如 HTTPRoute、GRPCRoute、TCPRoute 等),挂到 Gateway、ListenerSet 等父资源会被 admission 拒绝。
Envoy Gateway v1.9.0 中 Lua 扩展默认是开启还是关闭?如何启用?
Lua 扩展默认关闭,需要在 EnvoyGateway 配置中设置 extensionApis.enableLua: true 才能启用。
Envoy Gateway v1.9.0 中 JWT 稳定名变化对 EnvoyPatchPolicy 有什么影响?
JWT provider/requirement 名称改为内容派生的稳定名,旧补丁若按路由派生的名称匹配会失效,导致补丁打空。
在 Envoy Gateway v1.9.0 中,如果策略未生效,应该从哪些方面排查?
先定位是 admission 拒绝、IR 覆盖还是补丁错位。例如:kubectl 被拒可能是 mergeType 挂父资源;Lua 无副作用可能是未启用 enableLua;对象 Accepted 但无 JWT/限流可能是最具体者获胜覆盖父策略;策略与 Patch 都 Programmed 但行为旧可能是 xDS 布局变化。
Envoy Gateway v1.9.0 中 BackendTrafficPolicy 的 mergeType 允许设置在哪些资源上?
BackendTrafficPolicy 的 mergeType 允许设置在 HTTPRoute、GRPCRoute、TCPRoute、UDPRoute、TLSRoute 上,挂到 Gateway、ListenerSet 等父资源会被拒绝。
Envoy Gateway v1.9.0 中 ClientTrafficPolicy 可以挂到哪些资源上?
ClientTrafficPolicy 只能挂到 Gateway 和 ListenerSet(均可带 sectionName),不能挂到 HTTPRoute 等路由资源。
Envoy Gateway v1.9.0 中 EnvoyPatchPolicy 默认是否开启?如何启用?
EnvoyPatchPolicy 默认关闭,需要设置 extensionApis.enableEnvoyPatchPolicy: true 才能启用。