前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Istio-EnvoyFilter配置浅谈

Istio-EnvoyFilter配置浅谈

作者头像
tunsuy
发布2023-11-13 20:42:24
5250
发布2023-11-13 20:42:24
举报

EnvoyFilter

EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。 这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。 对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。

这些 EnvoyFilter 的应用顺序如下:

配置根命名空间中的所有 EnvoyFilter,

其次是工作负载命名空间中的所有匹配 EnvoyFilter。

配置介绍

下面来看一个配置样例:

代码语言:javascript
复制
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部分,以上述的配置为例:

代码语言:javascript
复制
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是一个数组类型。在回到我们的配置,可以看到这里注入了两个元素:

代码语言:javascript
复制
代码语言:javascript
复制
- 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有文化的技术人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • EnvoyFilter
  • 配置介绍
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档