10.6.1 定义Envoy过滤器

EnvoyFilter对象描述了针对代理服务的过滤器,可以通过workloadLabels字段限定针对哪些工作负载,通过f ilters字段指明过滤器配置信息。具体定义如表10-2所示。

表10-2 定义Envoy过滤器

EnvoyFilter.Filter资源对象定义了要加入过滤器链条的Envoy过滤器的具体配置信息,定义如表10-3所示。

表10-3 EnvoyFilter.Filter资源对象定义

EnvoyFilter.ListenerMatch资源对象定义了如何选择一个监听器,在符合条件的情况下才会加入该过滤器配置,只有ListenerMatch中列出的所有条件全部符合(逻辑与)的情况下才能进行插入。具体定义如表10-4所示。

表10-4 EnvoyFilter.ListenerMatch资源对象定义

下面讲解一个使用Istio EnvoyFilter进行HTTP请求与响应头信息设置的例子,以此来了解它的扩展机制。以下资源给出了相应的EnvoyFilter示例(下载本书示例代码之后,切换到目录envoyfilter下可查看所有相关的代码):


apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-http-header-filter
spec:
  filters:
  - listenerMatch:
      listenerType: SIDECAR_OUTBOUND
    filterType: HTTP
    filterName: envoy.lua
    filterConfig:
      inlineCode: |
        -- 在请求路径上被调用
        function envoy_on_request(request_handle)
          -- 添加一个自定义的请求头
          request_handle:headers():add("mykey", "myvalue")
        end
        -- 在响应路径上被调用
        function envoy_on_response(response_handle)
          body_size = response_handle:body():length()
          -- 等待整个响应正文并添加一个请求头和正文的大小
          response_handle:headers():add("response-body-size", tostring(body_size))
          -- 移除一个名为 'x-powered-by' 的响应头
          response_handle:headers():remove("x-powered-by")
        end

只需将上述的YAML内容(保存为envoy-f ilter-http-headers.yaml)应用于Istio集群,即可使用该Envoy过滤器定义的功能,如下所示:


kubectl apply -f envoy-filter-http-headers.yaml

可以通过运行以下命令查看已安装的Envoy过滤器:


kubectl get envoyfilter
NAME                        AGE
custom-http-header-filter   1h