1. EnvoyFilter 是什么
EnvoyFilter 是 Istio 的 CRD 资源,它允许用户修改 Envoy 的配置,以满足用户针对不同场景的定制需求。
1
2
3
4
5
6
7
8
9
| kubectl get envoyfilter -A
NAMESPACE NAME AGE
istio-system add-request-id-into-ingressgateway 54d
istio-system compression-gzip 18d
istio-system custom-access-log 3d
istio-system ingressgateway-settings 52d
istio-system preserve-request-header-us-test-ingress-gateway 95d
istio-system preserve-x-request-id 54d
|
通常在使用 istio 时,或多或少都会用到一些 EnvoyFilter。
EnvoyFilter 提供的功能是基于 Envoy 已有的内置功能和扩展机制来实现的,主要包括:
- 修改网络请求和响应
- 限流和熔断
- 重试
- 修改路由规则
- 增加额外的监控指标
- 访问黑白名单控制
- 执行 lua 脚本
- …
能够满足大部分的四层、七层的需求,如果满足不了,可以上 WasmPlugin,之前写过一篇 使用 tinygo 开发 Istio WasmPlugin
可以参考。
2. EnvoyFilter 注意事项
不正确的配置可能会破坏整个网格的稳定性,使用 EnvoyFilter 需要十分谨慎。
EnvoyFilter 生效的范围:
- 全局生效,根命名空间中的 EnvoyFilter。根命名空间在配置文件中有,默认
rootNamespace: istio-system
- 指定命名空间生效,创建在指定命名空间中的 EnvoyFilter
EnvoyFilter 优先级:
EnvoyFilter 生效顺序:
3. EnvoyFilter 配置字段
先看一个例子,给经过 Istio Gateway 的 Reponse 进行 Gzip 压缩。
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: compression-gzip
namespace: istio-system
spec:
workloadSelector:
labels:
app: istio-ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
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.compressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
response_direction_config:
common_config:
min_content_length: 256
content_type:
- application/atom+xml
- application/javascript
- application/x-javascript
- application/json
- application/rss+xml
- application/vnd.ms-fontobject
- application/x-font-ttf
- application/x-web-app-manifest+json
- application/xhtml+xml
- application/xml
- font/opentype
- image/svg+xml
- image/x-icon
- text/css
- text/javascript
- text/plain
- text/x-component
compressor_library:
name: text_optimized
typed_config:
"@type": type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip
memory_level: 3
compression_level: COMPRESSION_LEVEL_6
|
简单说下关键字段
应用的过滤层,这里指向的是 HTTP 层的过滤
指定了生效的 Pod,如果没有设置 workloadSelector,则对整个命名空间生效。
有四个可选值 ANY 全局生效、SIDECAR_INBOUND sidecar 入站生效、SIDECAR_OUTBOUND sidecar 出站生效、GATEWAY 网关生效。
- listener.filterChain.filter
指定了过滤器链中的过滤器,这里指向的是 Envoy 的 HTTP 过滤器。
相关的字段可以参考下图:
4. EnvoyFilter 相关的指标监控
在 Sidecar 或者 Gateway 中,本地会暴露一些指标,可以配置 Prometheus 来采集这些指标。
如果需要访问相关指标,可以通过如下接口:
1
| curl 127.0.0.1:15020/stats/prometheus
|
但此时,不一定有你需要的指标,因为 Istio 仅启用了 Envoy 小部分的指标,以避免采集端负担过重。如果要启用更多的指标,可以通过修改相关配置来实现。
4.1 三种规则匹配模式
Istio 提供了三种过滤指标的规则:
- inclusionRegexps, 启用正则匹配的指标
- inclusionPrefixes, 启用前缀匹配的指标
- inclusionSuffixes, 启用后缀匹配的指标
4.2 两个配置级别
修改 istio ConfigMap 中的 mesh 字段
1
| kubectl edit cm istio -n istio-system
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| kind: ConfigMap
apiVersion: v1
metadata:
name: istio
namespace: istio-system
data:
mesh: |-
defaultConfig:
proxyStatsMatcher:
inclusionRegexps:
- ".*http.*"
gatewayTopology:
numTrustedProxies: 1
|
启用所有 HTTP 相关的指标,重启 Istio Gateway 生效。在测试环境中,Metrics 采集的数据从 90MB 一下就升到了 140 MB。
1
2
3
4
5
6
7
8
9
| apiVersion: v1
kind: Pod
metadata:
name: test
annotations:
proxy.istio.io/config: |-
proxyStatsMatcher:
inclusionRegexps:
- ".*http.*"
|
这种就只对注入了 sidecar 的 pod 生效。
5. 总结
本篇主要是介绍了 EnvoyFilter 的基本概念和使用方法,以及 EnvoyFilter 相关的指标监控。
6. 参考