Please enable Javascript to view the contents

Istio 中的 EnvoyFilter 配置

 ·  ☕ 3 分钟

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

简单说下关键字段

  • applyTo

应用的过滤层,这里指向的是 HTTP 层的过滤

  • workloadSelector

指定了生效的 Pod,如果没有设置 workloadSelector,则对整个命名空间生效。

  • match.context

有四个可选值 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。

  • Pod 级别
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. 参考


微信公众号
作者
微信公众号