介绍

EnvoyFilter 提供了一种机制,可以自定义 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 修改某些字段的值、添加特定过滤器,甚至添加全新的监听器、集群等。这个功能必须小心使用,因为不正确的配置可能会破坏整个网格。与其他 Istio 网络对象不同,EnvoyFilters 是附加应用的。在特定命名空间中给定工作负载可以存在任意数量的 EnvoyFilters 。这些 EnvoyFilters 的应用顺序如下:所有位于配置根命名空间中的 EnvoyFilters ,然后是匹配工作负载命名空间中所有匹配到的 EnvoyFilters。

注意点

注意1:此 API 的某些方面与 Istio 网络子系统以及Envoy XDS API 的内部实现密切相关。虽然EnvoyFilter API本身将保持向后兼容性,但通过此机制提供的任何 envoy 配置都应该在Istio代理版本升级时进行仔细监控,以确保已弃用字段被适当地删除和替换。

注意2:当多个Envoy Filters 绑定到给定名称空间中相同工作负载时,在创建时间顺序上按顺序处理所有补丁。如果多个Envoy Filter 配置彼此冲突,则行为未定义。

注意3:要将一个Envoyer Filter 资源应用于系统中的所有工作负载(sidecars 和 gateways),请在配置根命名空间中定义该资源,而不使用 workloadSelector。

样例

下面的示例在根命名空间 istio-config 中声明了一个全局默认 EnvoyFilter 资源,它将自定义协议过滤器添加到系统中所有 sidecar 的出站端口 9307 上。该过滤器应该在终止 tcp_proxy 过滤器之前添加以生效。此外,它为网关和 sidecar 中的所有 HTTP 连接设置了30秒的闲置超时时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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

以下示例启用了Envoy的Lua过滤器,用于在bookinfo命名空间中具有标签“app:reviews”的reviews服务pod的服务端口8080上到达的所有入站HTTP调用。lua过滤器调用外部服务internal.org.net:8888,该服务需要envoy中特殊集群定义。此配置还将该集群添加到sidecar中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: reviews-lua
namespace: bookinfo
spec:
workloadSelector:
labels:
app: reviews
configPatches:
# The first patch adds the lua filter to the listener/http connection manager
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
portNumber: 8080
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE
value: # lua filter specification
name: envoy.filters.http.lua
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_request(request_handle)
-- Make an HTTP call to an upstream host with the following headers, body, and timeout.
local headers, body = request_handle:httpCall(
"lua_cluster",
{
[":method"] = "POST",
[":path"] = "/acl",
[":authority"] = "internal.org.net"
},
"authorize call",
5000)
end
# The second patch adds the cluster that is referenced by the lua code
# cds match is omitted as a new cluster is being added
- applyTo: CLUSTER
match:
context: SIDECAR_OUTBOUND
patch:
operation: ADD
value: # cluster specification
name: "lua_cluster"
type: STRICT_DNS
connect_timeout: 0.5s
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: lua_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
protocol: TCP
address: "internal.org.net"
port_value: 8888

以下示例覆盖了istio-system命名空间中入口网关上的侦听器中HTTP连接管理器中的某些字段(HTTP闲置超时和X-Forward-For受信任跳数),用于SNI主机app.example.com:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: hcm-tweaks
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
match:
context: GATEWAY
listener:
filterChain:
sni: app.example.com
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"
xff_num_trusted_hops: 5
common_http_protocol_options:
idle_timeout: 30s

以下示例插入了一个 attributegen 过滤器,该过滤器生成 istio_operationId 属性,该属性由 istio.stats 过滤器使用。filterClass: STATS 编码了这种依赖关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: reviews-request-operation
namespace: myns
spec:
workloadSelector:
labels:
app: reviews
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
patch:
operation: ADD
filterClass: STATS # This filter will run *before* the Istio stats filter.
value:
name: istio.request_operation
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration: |
{
"attributes": [
{
"output_attribute": "istio_operationId",
"match": [
{
"value": "ListReviews",
"condition": "request.url_path == '/reviews' && request.method == 'GET'"
}]
}]
}
vm_config:
runtime: envoy.wasm.runtime.null
code:
local: { inline_string: "envoy.wasm.attributegen" }

以下示例将在myns命名空间中插入一个http ext_authz过滤器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: myns-ext-authz
namespace: myns
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
patch:
operation: ADD
filterClass: AUTHZ # This filter will run *after* the Istio authz filter.
value:
name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
grpc_service:
envoy_grpc:
cluster_name: acme-ext-authz
initial_metadata:
- key: foo
value: myauth.acme # required by local ext auth server.

在 myns 命名空间中的工作负载需要访问一个不接受初始元数据的不同 ext_auth 服务器。由于 proto 合并不能删除字段,因此以下配置使用 REPLACE 操作。如果您不需要继承字段,则 REPLACE 优先于 MERGE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: mysvc-ext-authz
namespace: myns
spec:
workloadSelector:
labels:
app: mysvc
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
patch:
operation: REPLACE
value:
name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
grpc_service:
envoy_grpc:
cluster_name: acme-ext-authz-alt

以下示例为所有入站sidecar HTTP 请求部署了一个 Wasm 扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: wasm-example
namespace: myns
spec:
configPatches:
# The first patch defines a named Wasm extension and provides a URL to fetch Wasm binary from,
# and the binary configuration. It should come before the next patch that applies it.
# This resource is visible to all proxies in the namespace "myns". It is possible to provide
# multiple definitions for the same name "my-wasm-extension" in multiple namespaces. We recommend that:
# - if overriding is desired, then the root level definition can be overriden per namespace with REPLACE.
# - if overriding is not desired, then the name should be qualified with the namespace "myns/my-wasm-extension",
# to avoid accidental name collisions.
- applyTo: EXTENSION_CONFIG
patch:
operation: ADD # REPLACE is also supported, and would override a cluster level resource with the same name.
value:
name: my-wasm-extension
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
config:
root_id: my-wasm-root-id
vm_config:
vm_id: my-wasm-vm-id
runtime: envoy.wasm.runtime.v8
code:
remote:
http_uri:
uri: http://my-wasm-binary-uri
configuration:
"@type": "type.googleapis.com/google.protobuf.StringValue"
value: |
{}
# The second patch instructs to apply the above Wasm filter to the listener/http connection manager.
- applyTo: HTTP_FILTER
match:
listener:
filterChain:
filter:
name: envoy.filters.network.http_connection_manager
subFilter:
name: envoy.filters.http.router
patch:
operation: INSERT_BEFORE
value:
name: my-wasm-extension # This must match the name above
config_discovery:
config_source:
ads: {}
type_urls: ["type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"]

以下示例为所有代理添加了一个 Wasm 服务扩展,使用本地可用的 Wasm 文件。单例 Wasm 扩展用于在执行 Wasm 过滤器的工作程序之间维护共享状态。例如,本地速率限制扩展将依赖于单例来限制所有工作程序中的请求。另一个示例是授权 Wasm 扩展可以使用单例来维护帐户数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: listener-filter-example
namespace: myns
spec:
configPatches:
- applyTo: LISTENER_FILTER
patch:
operation: MERGE
value:
bootstrap_extensions:
- name: envoy.bootstrap.wasm
typed_config:
"@type": type.googleapis.com/envoy.extensions.wasm.v3.WasmService
singleton: true
config:
name: my_plugin
configuration:
"@type": type.googleapis.com/google.protobuf.StringValue
value: |
{}
vm_config:
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/envoy_filter_http_wasm_example.wasm"

以下示例在 envoy.filters.listener.tls_inspector 之前插入了一个 envoy.filters.listener.proxy_protocol 监听器过滤器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: wasm-service
namespace: myns
spec:
configPatches:
- applyTo: LISTENER_FILTER
match:
context: SIDECAR_INBOUND # will match outbound listeners in all sidecars
listener:
portNumber: 15006
listenerFilter: "envoy.filters.listener.tls_inspector"
patch:
operation: INSERT_BEFORE
value:
# This is the full filter config including the name and typed_config section.
name: "envoy.filters.listener.proxy_protocol"
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.listener.proxy_protocol.v3.ProxyProtocol"

以下示例匹配为判断请求来源是否是test.com,然后对应添加project-version header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: header-envoy-filter
namespace: test
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: envoy.filters.network.http_connection_manager
subFilter:
name: envoy.filters.http.router
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.lua
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inlineCode: |
function envoy_on_request(request_handle)
local authority = request_handle:headers():get(":authority")
local version_header = request_handle:headers():get("project-version")
if authority == "testaaa.com" then
if version_header == nil then
request_handle:headers():add("project-version", "master")
end
elseif authority == 'testbbb.com' then
if version_header == nil then
request_handle:headers():add("project-version", "master")
end
end
end
workloadSelector:
labels:
app: orange

EnvoyFilter

EnvoyFilter 提供了一种机制,可以定制由 Istio Pilot 生成的 Envoy 配置。

FieldTypeDescriptionRequired
workloadSelectorWorkloadSelector用于选择应用此补丁配置的特定Pods/VMs集合的标准。如果省略,则该配置中的所有补丁将应用于同一命名空间中的所有工作负载实例。如果省略,则EnvoyFilter补丁将应用于同一命名空间中的所有工作负载。如果在配置根命名空间中存在EnvoyFilter,则它将被应用于任何命名空间中适用的工作负载。No
configPatchesEnvoyConfigObjectPatch[]一个或多个带有匹配条件的补丁。Yes
priorityint32优先级定义了在上下文中应用补丁集的顺序。当一个补丁依赖于另一个补丁时,补丁应用的顺序非常重要。API 提供了两种主要方式来排序补丁。根命名空间中的补丁集会在工作负载命名空间中的补丁集之前被应用。同一补丁集内部的修复程序按照它们在 configPatches 列表中出现的顺序进行处理。优先级默认值为 0,范围为 [min-int32, max-int32]。具有负优先级的修复程序集将在默认值之前处理;具有正优先级的修复程序集将在默认值之后处理。建议从10倍数开始设置优先级以留出插入更多项所需的空间。 补丁集按以下升序键排序:优先级、创建时间、完全限定资源名称。No

EnvoyFilter.ProxyMatch

要匹配的代理的一个或多个属性。

FieldTypeDescriptionRequired
proxyVersionstring一个使用特定版本的Istio代理选择代理的golang正则表达式(RE2)格式。给定代理的Istio版本是从节点元数据字段ISTIO_VERSION中获取的,该字段由连接到Pilot时提供的代理提供。此值作为环境变量(ISTIO_META_ISTIO_VERSION)嵌入在Istio代理docker镜像中。自定义代理实现应提供此元数据变量以利用Istio版本检查选项。No
metadatamap<string, string>连接到Istio Pilot时,根据代理提供的节点元数据进行匹配。请注意,虽然Envoy的节点元数据是Struct类型,但Pilot仅处理字符串键值对。元数据中指定的所有键都必须与确切值匹配。如果任何指定的键不存在或值不匹配,则匹配将失败。No

EnvoyFilter.ClusterMatch

必须满足 ClusterMatch 中指定的条件,才能将补丁应用于集群。

FieldTypeDescriptionRequired
portNumberuint32生成此集群的服务端口。如果省略,则适用于任何端口的集群。注意:对于入站集群,它是服务目标端口。No
servicestring此集群的完全限定服务名称。如果省略,则适用于任何服务的集群。对于通过服务条目定义的服务,服务名称与在服务条目中定义的主机相同。注意: 对于入站集群,此项将被忽略。No
subsetstring与服务相关联的子集。如果省略,则适用于任何服务子集的群集。No
namestring要匹配的集群的确切名称。要按名称匹配特定集群(例如内部生成的“Passthrough”集群),请将clusterMatch中除名称以外的所有字段留空。No

EnvoyFilter.RouteConfigurationMatch

必须满足 RouteConfigurationMatch 中指定的条件,才能将补丁应用于路由配置对象或路由配置中特定的虚拟主机。

FieldTypeDescriptionRequired
portNumberuint32生成此路由配置的服务端口号或网关服务器端口号。如果省略,则适用于所有端口的路由配置。No
portNamestring仅适用于GATEWAY上下文。生成此路由配置的网关服务器端口名称。No
gatewaystring此路由配置生成的 Istio 网关配置的命名空间/名称。仅适用于上下文为 GATEWAY 的情况。应采用命名空间/名称格式。与 portNumberportName 结合使用,以准确选择网关配置对象中特定 HTTPS 服务器的 Envoy 路由配置。No
vhostVirtualHostMatch在路由配置中匹配特定的虚拟主机,并将补丁应用于该虚拟主机。No
namestring要匹配的路由配置名称。可以使用名称来匹配特定的路由配置,例如所有 sidecar 的内部生成的 http_proxy 路由配置。No

EnvoyFilter.ListenerMatch

指定在监听器匹配中的条件必须满足,才能将补丁应用于特定监听器上的所有过滤器链或监听器内的特定过滤器链。

FieldTypeDescriptionRequired
portNumberuint32服务端口/网关端口,用于发送/接收流量。如果未指定,则匹配所有侦听器。尽管为实例/pod 端口生成了入站侦听器,但只应使用服务端口来匹配侦听器。No
filterChainFilterChainMatch在监听器中匹配特定的过滤器链。如果指定了,则补丁将应用于过滤器链(如果指定了特定的过滤器)而不是应用于监听器中的其他过滤器链。No
listenerFilterstring匹配特定的监听器过滤器。如果指定,则补丁将应用于监听器过滤器。No
namestring按名称匹配特定的监听器。Pilot 生成的侦听器通常以 IP:Port 命名。No

EnvoyFilter.Patch

Patch指定了应如何修改所选对象。

FieldTypeDescriptionRequired
operationOperation确定如何应用补丁。No
valueStruct被修补对象的 JSON 配置。这将使用 proto 合并语义与路径中现有的 proto 进行合并。No
filterClassFilterClass确定过滤器插入顺序。No

EnvoyFilter.EnvoyConfigObjectMatch

在为给定代理生成的配置应用补丁之前,必须满足一个或多个匹配条件。

FieldTypeDescriptionRequired
contextPatchContext要匹配的特定配置生成上下文。Istio Pilot在网关、进入sidecar的流量和从sidecar出发的流量的上下文中生成envoy配置。No
proxyProxyMatch根据代理关联的属性进行匹配。No
listenerListenerMatch (oneof)根据 Envoy 监听器属性进行匹配。No
routeConfigurationRouteConfigurationMatch (oneof)在 Envoy 的 HTTP 路由配置属性上匹配。No
clusterClusterMatch (oneof)根据 Envoy 集群属性进行匹配。No

EnvoyFilter.EnvoyConfigObjectPatch

需要对各种使者配置对象进行更改。

FieldTypeDescriptionRequired
applyToApplyTo指定在Envoy配置中应用补丁的位置。匹配条件应基于applyTo选择适当的对象。例如,具有“HTTP_FILTER”的applyTo预计会在侦听器上具有匹配条件,在envoy.filters.network.http_connection_manager上选择网络过滤器,并在相对于插入操作的HTTP过滤器上进行子过滤器选择。同样,对于“CLUSTER”的applyTo应该在集群上(如果提供了)进行匹配,而不是在侦听器上进行匹配。No
matchEnvoyConfigObjectMatch在侦听器/路由配置/集群上匹配。No
patchPatch需要在操作过程中应用的补丁。No

EnvoyFilter.RouteConfigurationMatch.RouteMatch

在路由配置中,匹配虚拟主机内的特定路由。

FieldTypeDescriptionRequired
namestring默认生成的路由对象名称为 default。使用虚拟服务生成的路由对象将携带虚拟服务 HTTP 路由中使用的名称。No
actionAction将路由与特定的操作类型匹配。No

EnvoyFilter.RouteConfigurationMatch.VirtualHostMatch

在路由配置中匹配特定的虚拟主机。

FieldTypeDescriptionRequired
namestringIstio生成的VirtualHosts对象命名为host:port,其中host通常对应于VirtualService的主机字段或注册表中服务的主机名。No
routeRouteMatch在虚拟主机中匹配特定路由。No

EnvoyFilter.ListenerMatch.FilterChainMatch

对于具有多个过滤器链的侦听器(例如,带有宽松mTLS的sidecar上的入站侦听器,具有多个SNI匹配项的网关侦听器),可以使用过滤器链匹配来选择要修补的特定过滤器链。

FieldTypeDescriptionRequired
namestring分配给过滤器链的名称。No
snistring过滤器链匹配条件使用的SNI值。如果过滤器链没有SNI匹配,则此条件将评估为false。No
transportProtocolstring仅适用于SIDECAR_INBOUND上下文。如果非空,则在确定过滤器链匹配时要考虑的传输协议。当tls_inspector监听器过滤器检测到新连接时,将比较此值与新连接的传输协议。

接受的值包括:

raw_buffer-默认情况下,在未检测到传输协议时使用。
tls-当TLS协议被TLS检查器检测到时设置。
No
applicationProtocolsstring仅适用于sidecar。如果非空,则是一组以逗号分隔的应用程序协议,用于确定过滤器链匹配时考虑的内容。当由诸如http_inspector之类的侦听器过滤器检测到新连接时,将比较此值与新连接的应用程序协议。

接受的值包括:h2、http/1.1、http/1.0
No
filterFilterMatch要应用补丁的特定过滤器名称。将其设置为envoy.filters.network.http_connection_manager以添加过滤器或对HTTP连接管理器应用补丁。No
destinationPortuint32destination_port” 值是过滤器链匹配条件中使用的值。如果过滤器链没有“destination_port”匹配,则此条件将评估为 false。No

EnvoyFilter.ListenerMatch.FilterMatch

在过滤器链中匹配特定过滤器的条件。

FieldTypeDescriptionRequired
namestring要匹配的过滤器名称。对于标准Envoy过滤器,应使用规范化的过滤器名称。No
subFilterSubFilterMatch此过滤器中匹配的下一级过滤器。通常用于HTTP连接管理器过滤器和Thrift过滤器。No

EnvoyFilter.ListenerMatch.SubFilterMatch

在另一个过滤器中匹配特定过滤器的条件。该字段通常用于在envoy.filters.network.http_connection_manager网络过滤器内匹配HTTP过滤器。这也适用于thrift过滤器。

FieldTypeDescriptionRequired
namestring要匹配的过滤器名称。No

EnvoyFilter.RouteConfigurationMatch.RouteMatch.Action

Action” 指的是当 HTTP 路由匹配时 Envoy 所采取的路由行动。

NameDescription
ANY所有三个路线行动
ROUTE将流量路由到一个集群/加权集群。
REDIRECT重定向请求。
DIRECT_RESPONSE直接回复请求并附带特定有效载荷。

EnvoyFilter.Patch.Operation

操作表示如何将补丁应用于所选配置。

NameDescription
INVALID
MERGE使用 proto 合并语义将提供的配置与生成的配置合并。如果您要完全指定配置,请使用 REPLACE。
ADD将提供的配置添加到现有列表中(侦听器、集群、虚拟主机、网络过滤器或HTTP过滤器)。当applyTo设置为ROUTE_CONFIGURATION或HTTP_ROUTE时,此操作将被忽略。
REMOVE从列表中删除所选对象(侦听器、集群、虚拟主机、网络过滤器、路由或HTTP过滤器)。不需要指定值。当applyTo设置为ROUTE_CONFIGURATION或HTTP_ROUTE时,此操作将被忽略。
INSERT_BEFORE对命名对象数组进行插入操作。此操作通常仅在过滤器或路由的上下文中有用,其中元素的顺序很重要。路由应基于最具体匹配标准从高到低排序,因为选择第一个匹配元素。对于集群和虚拟主机,数组中元素的顺序并不重要。在所选过滤器或子过滤器之前插入。如果未选择任何过滤器,则指定的过滤器将被插入到列表的开头。
INSERT_AFTER对命名对象数组进行插入操作。此操作通常仅在过滤器或路由的上下文中有用,其中元素的顺序很重要。路由应基于最具体匹配标准从高到低排序,因为选择第一个匹配元素。对于集群和虚拟主机,数组中元素的顺序并不重要。在所选过滤器或子过滤器之后插入。如果未选择任何过滤器,则指定的过滤器将被插入到列表末尾。
INSERT_FIRST对命名对象数组进行插入操作。此操作通常仅在过滤器或路由的上下文中有用,其中元素的顺序很重要。路由应基于最具体匹配标准从高到低排序,因为选择第一个匹配元素。对于集群和虚拟主机,数组中元素的顺序并不重要。根据所选过滤器的存在与否,在列表中首先插入。当您希望根据Match子句中指定的匹配条件将筛选器放在列表中的第一位时,这是特别有用的。
REPLACE用新内容替换命名过滤器的内容。REPLACE操作仅适用于HTTP_FILTER和NETWORK_FILTER。如果未找到命名过滤器,则此操作无效。

EnvoyFilter.Patch.FilterClass

FilterClass 确定过滤器在与控制平面隐式插入的过滤器相对的过滤器链中的插入点。它与 ADD 操作一起使用。这是添加过滤器的首选插入机制,而不是 INSERT_* 操作,因为这些操作依赖于可能不稳定的过滤器名称。如果您的过滤器依赖于或影响了过滤器链中另一个过滤器的功能,则需要注意过滤器排序。在一个 FilterClass 中,按处理顺序插入各个 filter 。

NameDescription
UNSPECIFIED控制平面决定在哪里插入过滤器。如果该过滤器独立于其他过滤器,请不要指定FilterClass。
AUTHN在 Istio 认证过滤器之后插入过滤器。
AUTHZ在 Istio 授权过滤器之后插入过滤器。
STATS在 Istio 统计过滤器之前插入过滤器。

EnvoyFilter.ApplyTo

ApplyTo指定了在Envoy配置中应该应用给定补丁的位置。

NameDescription
INVALID
LISTENER将补丁应用到监听器。
FILTER_CHAIN将补丁应用于过滤器链。
NETWORK_FILTER将补丁应用于网络过滤器链,以修改现有的过滤器或添加新的过滤器。
HTTP_FILTER将补丁应用于HTTP连接管理器中的HTTP过滤器链,以修改现有过滤器或添加新的过滤器。
ROUTE_CONFIGURATION将补丁应用于HTTP连接管理器中的路由配置(rds输出)。这不适用于虚拟主机。目前,仅允许在路由配置对象上执行MERGE操作。
VIRTUAL_HOST将补丁应用于路由配置内的虚拟主机。
HTTP_ROUTE将补丁应用于路由配置中匹配的虚拟主机内的路由对象。
CLUSTER将补丁应用于 CDS 输出中的集群。也可用于添加新的集群。
EXTENSION_CONFIG将补丁应用于或在 ECDS 输出中添加扩展配置。请注意,ECDS 仅受 HTTP 过滤器支持。
BOOTSTRAP将补丁应用于引导配置。
LISTENER_FILTER将补丁应用于监听器过滤器。

EnvoyFilter.PatchContext

PatchContext根据流量方向和工作负载类型选择配置类别。

NameDescription
ANY两个sidecar和网关中的所有听众/路由器/集群。
SIDECAR_INBOUNDsidecar中的入站监听器/路由/集群。
SIDECAR_OUTBOUND侧车中的出站监听器/路由/集群。
GATEWAY网关监听器/路由/集群。