EnvoyFilter
提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。
这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。
对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。
这些 EnvoyFilter 的应用顺序如下:
配置根命名空间中的所有 EnvoyFilter,
其次是工作负载命名空间中的所有匹配 EnvoyFilter。
下面来看一个配置样例:
- apiVersion: networking.istio.io/v1alpha3
- kind: EnvoyFilter
- metadata:
- name: lazyxds-egress-als
- namespace: istio-system
- spec:
- workloadSelector:
- labels:
- app: istio-egressgateway-lazyxds
- configPatches:
- - applyTo: NETWORK_FILTER
- match:
- context: GATEWAY
- listener:
- filterChain:
- filter:
- name: "envoy.filters.network.http_connection_manager"
- patch:
- operation: MERGE
- value:
- typed_config:
- "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
- access_log:
- - name: envoy.access_loggers.file
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
- path: "/dev/stdout"
- log_format:
- 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"
- - name: envoy.access_loggers.http_grpc
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
- common_config:
- log_name: http_envoy_accesslog
- transport_api_version: "V3"
- grpc_service:
- envoy_grpc:
- 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部分,以上述的配置为例:
- patch:
- operation: MERGE
- value:
- typed_config:
- "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
- access_log:
- - name: envoy.access_loggers.file
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
- path: "/dev/stdout"
- log_format:
- 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"
- - name: envoy.access_loggers.http_grpc
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
- common_config:
- log_name: http_envoy_accesslog
- transport_api_version: "V3"
- grpc_service:
- envoy_grpc:
- 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是一个数组类型。在回到我们的配置,可以看到这里注入了两个元素:
- - name: envoy.access_loggers.file
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
- path: "/dev/stdout"
- log_format:
- 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"
- - name: envoy.access_loggers.http_grpc
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.access_loggers.grpc.v3.HttpGrpcAccessLogConfig
- common_config:
- log_name: http_envoy_accesslog
- transport_api_version: "V3"
- grpc_service:
- envoy_grpc:
- 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