EnvoyFilter
EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。与其他 Istio 网络对象不同,EnvoyFilter 是累加应用。对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。这些 EnvoyFilter 的应用顺序如下:配置根命名空间中的所有 EnvoyFilter,其次是工作负载命名空间中的所有匹配 EnvoyFilter。
注意一
该 API 的某些方面与 Istio 网络子系统的内部实现以及 Envoy 的 xDS API 有很深的关系。虽然 EnvoyFilter API 本身将保持向后兼容,但通过该机制提供的任何 Envoy 配置应在 Istio 代理版本升级时仔细审查,以确保废弃的字段被适当地删除和替换。
注意二
当多个 EnvoyFilter 被绑定到特定命名空间的同一个工作负载时,所有补丁将按照创建顺序处理。如果多个 EnvoyFilter 的配置相互冲突,则其行为将无法确定。
注意三
要将 EnvoyFilter 资源应用于系统中的所有工作负载(sidecar 和 gateway)上,请在 config 根命名空间中定义该资源,不要使用 workloadSelector。
示例
下面的例子在名为 istio-config 的根命名空间中声明了一个全局默认的 EnvoyFilter 资源,在系统中的所有 sidecar 上添加了一个自定义的协议过滤器,用于 outbound 端口 9307。该过滤器应在终止 tcp_proxy 过滤器之前添加,以便生效。此外,它为 gateway 和 sidecar 的所有 HTTP 连接设置了 30 秒的空闲超时。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-protocol
namespace: istio-config # 如在 meshConfig 资源中定义的。
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: SIDECAR_OUTBOUND # 将会匹配所有 sidecar 中的所有 outbound listener
listener:
portNumber: 9307
filterChain:
filter:
name: "envoy.filters.network.tcp_proxy"
patch:
operation: INSERT_BEFORE
value:
# 这是完整的过滤器配置,包括名称和 typed_config 部分。
name: "envoy.config.filter.network.custom_protocol"
typed_config:
...
- applyTo: NETWORK_FILTER # HTTP 连接管理器是 Envoy 的一个过滤器。
match:
# 省略了上下文,因此这同时适用于 sidecar 和 gateway。
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
patch:
operation: MERGE
value:
name: "envoy.filters.network.http_connection_manager"
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
common_http_protocol_options:
idle_timeout: 30s下面的例子启用了 Envoy 的 Lua 过滤器,用于处理所有到达 bookinfo 命名空间中的对 reviews 服务 pod 的 8080 端口的 HTTP 调用,标签为 app: reviews。Lua 过滤器调用外部服务internal.org.net:8888,这需要在 Envoy 中定义一个特殊的 cluster。该 cluster 也被添加到 sidecar 中,作为该配置的一部分。
下面的例子覆盖了 SNI 主机 app.example.com 在 istio-system 命名空间的 ingress gateway 的监听器中的 HTTP 连接管理器的某些字段(HTTP 空闲超时和X-Forward-For信任跳数)。
下面的例子插入了一个产生 istio_operationId 属性的 attributegen 过滤器,该属性被 istio.stats fiter 消费。filterClass:STATS 对这种依赖关系进行编码。
下面的例子在 myns 命名空间中插入了一个 http ext_authz 过滤器。
myns 命名空间中的一个工作负载需要访问一个不接受初始元数据的不同 ext_auth服务器。由于 proto merge 不能删除字段,下面的配置使用 REPLACE 操作。如果你不需要继承字段,REPLACE 比 MERGE 更适合。
下面的例子为所有 inbound 的 sidecar HTTP 请求部署了一个 Wasm 扩展。
关于 EnvoyFilter 配置的详细用法请参考 Istio 官方文档。
参考
最后更新于
这有帮助吗?