envoyfilter资源

envoyfilter资源

直接配置网格中envoy的filter,使用envoy原生语法,以补丁/合并式合,配置到sidecar envoy上

istio并没有完全实现envoy的全部功能,所以有些额外的功能,需要用envoyfilter资源,配置envoy的各种过滤器

envoyfilter资源提供自定义sidecar envoy的配置接口,支持修改、添加字段,增加侦听器、集群等

未实现功能:

  • 跨域集群网络构建:envoyfilter + se + gw
  • 扩展认证
  • 限速
  • 访问日志等

配置生效方式

1个命名空间中允许1个workload(pod)关联多个envoyfilter资源。当有多个envoyfilter资源时,首先是root namespace(istiod运行的命名空间,这里的配置对所有命名空间都生效)的所有envoyfilter生效,再是当前workload命名空间中所有匹配到的envoyfilter资源

注:

  • istio不同版本时,envoyfilter可能不具备向后兼容,所以升级时,需要仔细对比是否有弃用字段,替换字段
  • 多个envoyfilter资源应用在1个workload时,根据创建时间顺序生效,若配置冲突无法判断
  • 应谨慎使用,可能破坏网格稳定性

配置

kubectl explain

image-20231216182037190

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
spec:
  configPatches:             #配置补丁
  - applyTo: str              #补丁应用的地方
      #INVALID,
      #LISTENER,侦听器
      #FILTER_CHAIN,过滤器链
      #NETWORK_FILTER
      #HTTP_FILTER
      #ROUTE_CONFIGURATION
      #VIRTUAL_HOST
      #HTTP_ROUTE
      #CLUSTER
      #EXTENSION_CONFIG
      #BOOTSTRAP
    match:                    #具体配置对象
      listener:               #侦听器相关配置
        name: str
        filterChain:
          name: str
          applicationProtocols: str
          destinationPort: str
          filter:
            name: str
            subFilter:
              name: str
          sni: str
          transportProtocol: str
        listenerFilter: str
        portName: str
        portNumber: int
      routeConfiguration:     #路由相关配置
        name: str
        vhost:
          name: str
          route:
            name: str
            action: str
        gateway: str
        portName: str
        portNumber: int
      cluster:                #集群相关配置
        name: str
        portNumber: int
        service: str
        subset: str
      context: str            #补丁的上下文
        #ANY,所有envoy都生效
        #SIDECAR_INBOUND,sidecar入站侦听器上
        #SIDECAR_OUTBOUND,sidecar出站侦听器上
        #GATEWAY,网关envoy上生效
      proxy:                  #istio proxy的版本,指定版本避免版本不兼容问题
        metadata: {}
        proxyVersion: str
    patch:                    #补丁具体操作内容
      filterClass: str        #过滤器类型
        #UNSPECIFIED
        #AUTHN,认证相关filter
        #AUTHZ,授权相关filter
        #STATS,状态相关filter
      operation: str          #如何打补丁
        #INVALID,标记为不合法
        #MERGE,合并
        #ADD,添加
        #REMOVE,删除
        #INSERT_BEFORE,前面插入
        #INSERT_AFTER,后面插入
        #INSERT_FIRST,首行插入
        #REPLACE,替换
      value: str              #补丁配置段
  priority: int               #优先级
  workloadSelector:           #标签选择器,选择生效pod,空则生效所有
    labels: {}

官方案例

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.config.filter.network.custom_protocol"
        typed_config: ...
  - 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
posted @ 2023-12-25 17:53  suyanhj  阅读(253)  评论(0)    收藏  举报