Istio中使用的SideCar(Envoy代理),支持EnvoyFilter
过滤器配置。EnvoyFilter
能够通过累加式的配置,定制Istio Pilot生成的Envoy配置。
Istio官方文档:https://istio.io/latest/docs/reference/config/networking/envoy-filter/
EnvoyProxy官方文档:https://www.envoyproxy.io/docs/envoy/latest/
警告:EnvoyFilter
配置和Istio内部实现、Envoy的xDS API密切相关,Istio版本不同其配置可能发生大幅变化,错误的配置可能导致整个集群不可用,而且官方文档也极为隐晦难懂,实际使用时,需要参考文档具体实验并小心部署。
EnvoyFilter:EnvoyFilter
本身本身是Istio中定义的一种资源对象,其中能够通过配置Lua脚本等方式定义HTTP流量的请求和响应拦截处理逻辑,EnvoyFilter
能通过k8s标签机制绑定到Istio网关或VirtualService
上。
我们这里实现一个简单的例子,来展示EnvoyFilter
的用法,Istio版本为1.14.1
。下面例子中,我们对网关使用Lua脚本进行了配置,让所有流量统统返回403
:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: demo-gateway-lua-filter
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
patch:
operation: INSERT_BEFORE
value:
name: envoy.lua
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_request(request_handle)
request_handle:respond({[":status"] = "403"},"nope")
end
spec.workloadSelector
:用于通过标签机制匹配EnvoyFilter
起作用的Pod集合。spec.configPatches
:这个配置就比较复杂了,我们前面说过EnvoyFilter
是累加式的配置,可以看作一个过滤器链上有许多“补丁”,这里配置的就是EnvoyFilter
在哪起作用,以及具体的逻辑。