• Istio-EnvoyFilter配置浅谈


    EnvoyFilter

    EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。
    这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。
    对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。

    这些 EnvoyFilter 的应用顺序如下:

    配置根命名空间中的所有 EnvoyFilter,

    其次是工作负载命名空间中的所有匹配 EnvoyFilter。

    配置介绍

    下面来看一个配置样例:

    1. apiVersion: networking.istio.io/v1alpha3
    2. kind: EnvoyFilter
    3. metadata:
    4.   name: lazyxds-egress-als
    5.   namespace: istio-system
    6. spec:
    7.   workloadSelector:
    8.     labels:
    9.       app: istio-egressgateway-lazyxds
    10.   configPatches:
    11.     - applyTo: NETWORK_FILTER
    12.       match:
    13.         context: GATEWAY
    14.         listener:
    15.           filterChain:
    16.             filter:
    17.               name: "envoy.filters.network.http_connection_manager"
    18.       patch:
    19.         operation: MERGE
    20.         value:
    21.           typed_config:
    22.             "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
    23.             access_log:
    24.               - name: envoy.access_loggers.file
    25.                 typed_config:
    26.                   "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
    27.                   path: "/dev/stdout"
    28.                   log_format:
    29.                     text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n"
    30.               - name: envoy.access_loggers.http_grpc
    31.                 typed_config:
    32.                   "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
    33.                   common_config:
    34.                     log_name: http_envoy_accesslog
    35.                     transport_api_version: "V3"
    36.                     grpc_service:
    37.                       envoy_grpc:
    38.                         cluster_name: lazyxds-accesslog-service

    下面来具体看看每个字段的含义:

    • workloadSelector:用于选择应用此补丁的pod或虚拟机

    • configPatches:具有匹配条件的补丁

    其中,如果 workloadSelector 没有被配置,此补丁将应用于相同名称空间中所有工作负载的实例

    下面来看看configPatches的配置:

    • applyTo:指定在Envoy配置中应用补丁的位置

    • match:用于匹配监听器、路由或集群

    • patch:与操作一起应用的补丁

    其中, ApplyTo 可以配置的值有:

    名称说明
    LISTENER将补丁应用于监听器。
    FILTER_CHAIN将补丁应用于过滤器链。
    NETWORK_FILTER应用补丁到网络过滤器链,修改现有的过滤器或添加一个新的过滤器。
    HTTP_FILTER将补丁应用于HTTP连接管理器中的HTTP过滤器链,以修改现有的过滤器或添加新的过滤器。
    ROUTE_CONFIGURATION将补丁应用于HTTP连接管理器内的Route配置。
    VIRTUAL_HOST将补丁应用于路由配置内部的虚拟主机。
    HTTP_ROUTE在路由配置中将补丁应用于匹配的虚拟主机内的路由对象。
    CLUSTER将补丁应用到集群。
    EXTENSION_CONFIG在ECDS输出中应用补丁或添加扩展配置。
    BOOTSTRAP将补丁应用于初始化配置。

    这里重点说下path部分,以上述的配置为例:

    1. patch:
    2.   operation: MERGE
    3.   value:
    4.     typed_config:
    5.       "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
    6.       access_log:
    7.         - name: envoy.access_loggers.file
    8.           typed_config:
    9.             "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
    10.             path: "/dev/stdout"
    11.             log_format:
    12.               text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n"
    13.         - name: envoy.access_loggers.http_grpc
    14.           typed_config:
    15.             "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
    16.             common_config:
    17.               log_name: http_envoy_accesslog
    18.               transport_api_version: "V3"
    19.               grpc_service:
    20.                 envoy_grpc:
    21.                   cluster_name: lazyxds-accesslog-service

    配置说明:

    • operation:表示怎么对下面的补丁进行处理,这里merge表示合并的意思

    • value:表示patch的具体配置

    下面来看下value的配置参数:

    • typed_config:一个proto接口的patch情况

    下面来看下typed_config的配置参数:

    • @type:proto接口定义路径
      比如这里的"type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"对应的proto接口就是这个:https://github.com/envoyproxy/envoy/blob/af8aef48b5395d32d4bbac5aa3ed0a84d3bf31d1/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#L40

      access_log:这个表示上面type定义的接口中的属性,
      这里就表示HttpConnectionManager对象的access_log属性repeated config.accesslog.v3.AccessLog access_log = 13;
      可以看到这个access_log是一个数组类型。在回到我们的配置,可以看到这里注入了两个元素:

      1. - name: envoy.access_loggers.file
      2.   typed_config:
      3.     "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
      4.     path: "/dev/stdout"
      5.     log_format:
      6.       text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n"
      7. - name: envoy.access_loggers.http_grpc
      8.   typed_config:
      9.     "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
      10.     common_config:
      11.       log_name: http_envoy_accesslog
      12.       transport_api_version: "V3"
      13.       grpc_service:
      14.         envoy_grpc:
      15.           cluster_name: lazyxds-accesslog-service

     上面的配置就不一一解析了,跟上面我们说的都是一样的。

    https://istio.io/latest/docs/reference/config/networking/envoy-filter/#EnvoyFilter-Patch

    https://github.com/envoyproxy/envoy/blob/af8aef48b5395d32d4bbac5aa3ed0a84d3bf31d1/api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto#L40

  • 相关阅读:
    Chrome插件开发
    springboot项目集成kafka,并创建kafka生成消息线程池
    力扣:611. 有效三角形的个数
    (视频教程)Complexheatmap做热图之设置不一样的注释效果
    Spring的事务
    智能交通收费RFID读写器在不停车收费(ETC)系统中的应用
    WinForm之TCP客户端通讯
    贝叶斯网络详解
    PCM格式图解
    Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息
  • 原文地址:https://blog.csdn.net/m0_47495420/article/details/134279676