EnvoyFilter CR

  • EnvoyFilter
  •  EnvoyFilter CR提供了自定义Sidecar Envoy配置的接口,其支持的配置功能包括修改指定字段的值、添加特定的过滤器甚至是新增Listener和Cluster等
  • 常在Istio原生的各CR未能提供足够的配置机制,或者无法支持到的配置场景中使用
  • 简单来说,EnvoyFilter提供的是直接向Envoy配置文件打补丁的接口,从而为网格中的各Envoy实例提供了以Envoy原生方式进行配置的机制
  • 同Sidecar等其它几个位于同一API群组(networking.istio.io/v1beta1)内的CR不同的是,EnvoyFilter CR资源对象通过自适应的方式应用于workload之上
  • 一个名称空间当中可同时存在多个应用于同一workload实例的EnvoyFilter CR资源对象
  • 多个EnvoyFilter资源对象在应用时会有着特定的次序:首先是root namespace中的所有EnvoyFilter,而后才是workload实例当前名称空间中所有匹配到的各EnvoyFilter资源对象
  • 注意事项
  • 对于不同的Istio发行版来说,EnvoyFilter提供的配置可能不具有向后兼容性;
  • Istio Proxy版本升级时,需要仔细识别配置字段的废弃和添加等所产生的影响;
  • 多个EnvoyFilters资源对象应用于同一个workload时,它们会根据创建的时间顺次生效,而配置冲突时其结果将无从预料;
  • 切记要谨慎使用该功能,不当的配置定义,可能会破坏网格的稳定性;

EnvoyFilter CR 的资源规范

Istio envoy filter_字段

使用EnvoyFilter配置Envoy

  • EnvoyFilter的关键组成部分
  • 使用workloadSelector指定要配置的Envoy实例
  • 省略该字段,意味着将配置到同一个名称空间下的所有Envoy实例;
  • 若EnvoyFilter定义在了根名称空间,且省略了该字段,则意味着配置到网格中所有名称空间中的Envoy实例
  • 由configPatches给出配置补丁
  • 补丁排序
  • 多个补丁间存在依赖关系时,其应用次序举足轻重
  • EnvoyFilter API内置了两种应用次序
  • 根名称空间下的EnvoyFilter将先于名称空间下的EnvoyFilter资源;
  • 补丁集中的多个补丁以它们定义的顺序完成打补丁操作;
  • 也可以为EnvoyFilter使用priority字段定义其优先级,可用的取值范围是0至2^32-1;
  • 负数优先级,表示将于default EnvoyFilter之前应用
  • 补丁及其位置
  • applyTo指定补丁在Envoy配置文件中要应用到的位置(配置段)
  • match指定补丁在Envoy配置文件中相应的位置上要应用到的具体配置对象(Listener、RouteConfiguration或Cluster)
  • 补丁的内容及相应的操作则由patch字段定义

EnvoyFilter配置示例

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-protocol
namespace: istio-config # as defined in meshConfig resource.
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: SIDECAR_OUTBOUND # will match outbound listeners in all sidecars
listener:
portNumber: 9307
filterChain:
filter:
name: "envoy.filters.network.tcp_proxy"
patch:
operation: INSERT_BEFORE
value:
# This is the full filter config including the name and typed_config section.
name: "envoy.extensions.filters.network.mongo_proxy"
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.network.mongo_proxy.v3.MongoProxy"
...
- applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
match:
# context omitted so that this applies to both sidecars and gateways
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

参考文档

​https://istio.io/latest/zh/docs/reference/config/networking/envoy-filter/​