EnvoyFilter

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

注意1:由于这是“碎玻璃”配置,不同 Istio 版本之间不会有任何向后兼容性。即 此配置会根据 Istio 网络子系统的内部实现而发生变化。

注意2:在 Istio 代理版本升级中,应仔细检查通过此机制提供的 Envoy 配置,以确保废弃字段被删除并合适地替换。

注意3:当多个 EnvoyFilters 绑定到给定命名空间中的同一个工作负载时,将按创建时间的顺序顺序处理所有补丁。如果多个 EnvoyFilters 配置相互冲突,则该行为是不确定的。

注释4:*_ToEnvoyFilter 资源应用于系统中的所有工作负载(sidecarsgateways),在配置根命名空间中定义资源,而不需要工作负载选择器。

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

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:name: custom-protocolnamespace: istio-config               # as defined in meshConfig resource.
spec:configPatches:- applyTo: NETWORK_FILTERmatch:context: SIDECAR_OUTBOUND             # will match outbound listeners in all sidecarslistener:portNumber: 9307filterChain:filter:name: "envoy.tcp_proxy"patch:operation: INSERT_BEFOREvalue:name: "envoy.config.filter.network.custom_protocol"config:...- applyTo: NETWORK_FILTER             # http connection manager is a filter in Envoymatch:# context omitted so that this applies to both sidecars and gatewayslistener:filterChain:filter:name: "envoy.http_connection_manager"patch:operation: MERGEvalue:typed_config:"@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"idle_timeout: 30s

下面的示例中,为 bookinfo 命名空间中到达带有标签为 app: reviewsreviews 服务 Pod 的服务端口 8080 的所有入站 HTTP 调用启用 Envoy 的 Lua 筛选器。Lua 过滤器调出到外部服务 internal.org.net:8888,该服务在 Envoy 中需要特殊的集群定义,集群也作为此配置的一部分添加到 sidecar 中。

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:name: reviews-luanamespace: bookinfo
spec:workloadSelector:labels:app: reviewsconfigPatches:# The first patch adds the lua filter to the listener/http connection manager- applyTo: HTTP_FILTERmatch:context: SIDECAR_INBOUNDlistener:portNumber: 8080filterChain:filter:name: "envoy.http_connection_manager"subFilter:name: "envoy.router"patch:operation: INSERT_BEFOREvalue:                # lua filter specificationname: envoy.luaconfig: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: CLUSTERmatch:context: SIDECAR_OUTBOUNDpatch:operation: ADDvalue:                # cluster specificationname: "lua_cluster"type: STRICT_DNSconnect_timeout: 0.5slb_policy: ROUND_ROBINhosts:- socket_address:protocol: TCPaddress: "internal.org.net"port_value: 8888

下面的示例中,覆盖了 HTTP 连接管理器中的某些字段(HTTP 空闲超时和 X-Forward-For 受信任的跃点),这些字段位于 SNI 主机 app.example.comistio-system 命名空间的入口网关上的监听器中。

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:name: hcm-tweaksnamespace: istio-system
spec:workloadSelector:labels:istio: ingress-gatewayconfigPatches:- applyTo: NETWORK_FILTER             # http connection manager is a filter in Envoymatch:context: GATEWAYlistener:filterChain:sni: app.example.comfilter:name: "envoy.http_connection_manager"patch:operation: MERGEvalue:idle_timeout: 30sxff_num_trusted_hops: 5

EnvoyFilter

EnvoyFilter 提供了一种机制,自定义 Istio Pilot 生成的 Envoy 配置。

字段 类型 描述 是否必需
workloadSelector WorkloadSelector 用于选择在其上应用此补丁配置的指定 Pods/VMs 组的条件。如果省略,EnvoyFilter 补丁将应用于同一命名空间中的所有工作负载。如果在配置根名称空间中存在 EnvoyFilter,它将被应用于任何命名空间中的所有工作负载
configPatches EnvoyConfigObjectPatch[] 具有匹配条件的一个或多个补丁

EnvoyFilter.ApplyTo

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

名称 描述
INVALID 占位符
LISTENER 将补丁应用到监听器
FILTER_CHAIN 将补丁应用到过滤器链上
NETWORK_FILTER 将补丁应用到网络过滤器链,可以修改现有的过滤器或添加新的过滤器
HTTP_FILTER 将补丁应用于 HTTP 连接管理器中的 HTTP 过滤器链,以修改现有的过滤器或添加新的过滤器
ROUTE_CONFIGURATION 将补丁应用于 HTTP 连接管理器中的 Route 配置(rds 输出)。这不适用于虚拟主机。当前,仅允许对路由配置对象进行 MERGE 操作
VIRTUAL_HOST 将补丁应用到路由配置中的虚拟主机
HTTP_ROUTE 在路由配置中将补丁应用于匹配的虚拟主机内部的路由对象上。当前,仅允许对路由对象进行 MERGE 操作
CLUSTER 在 CDS 输出中将补丁应用于集群。也用于添加新的集群

EnvoyFilter.ClusterMatch

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

字段 类型 描述 是否必需
portNumber uint32 为其生成集群的服务端口。如果省略,则应用于任何端口的集群
service string 此集群的完全限定服务名。如果省略,则应用于任何服务的集群。对于通过 ServiceEntry 定义的服务,服务名称与在 ServiceEntry 中定义的主机相同
subset string 与服务关联的子集。如果省略,则应用于服务的任何子集的集群
name string 要匹配的集群的精确名称。要通过名称匹配特定的集群,例如内部生成的 Passthrough 集群,请将 ClusterMatch 中除 name 之外的所有字段保留为空

EnvoyFilter.DeprecatedListenerMatch.ListenerProtocol

名称 描述
ALL 所有协议
HTTP HTTP/HTTPS/HTTPS/gRPC
TCP 任何非 HTTP 监听器

EnvoyFilter.DeprecatedListenerMatch.ListenerType

名称 描述
ALL 所有监听器
SIDECAR_INBOUND sidecar 中的入站监听器
SIDECAR_OUTBOUND sidecar 中的出站监听器
GATEWAY 网关监听器

EnvoyFilter.EnvoyConfigObjectMatch

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

字段 类型 描述 是否必需
context PatchContext 匹配的特定配置生成的上下文。Istio Pilot 会在 Gateway、到 sidecar 的入站流量和 sidecar 的出站流量的上下文中生成 Envoy 配置
proxy ProxyMatch 匹配与代理关联的属性
listener ListenerMatch (oneof) 匹配 Envoy 监听器属性
routeConfiguration RouteConfigurationMatch (oneof) 匹配 Envoy HTTP 路由配置属性
cluster ClusterMatch (oneof) 匹配 Envoy 集群属性

EnvoyFilter.EnvoyConfigObjectPatch

字段 类型 描述 是否必需
applyTo ApplyTo 指定应在 Envoy 配置中的何处应用补丁。匹配将根据 applyTo 选择合适的对象。例如,带有 HTTPFILTERapplyTo 在监听器上具有一个匹配条件,在 envoy.http connection_manager 上具有一个网络过滤器选择,在应该执行插入的 HTTP 过滤器上具有一个子过滤器选择。同样,CLUSTER 上的 applyTo 应该在集群上而不是在监听器上具有匹配项(如果提供)
match EnvoyConfigObjectMatch 匹配 监听器或路由 的 配置或集群
patch Patch 与操作一起应用的补丁

EnvoyFilter.Filter.FilterType

名称 描述
INVALID 占位符
HTTP HTTP 过滤器
NETWORK 网络过滤器

EnvoyFilter.InsertPosition.Index

在过滤器链中的索引或位置。

名称 描述
FIRST 首位插入
LAST 尾部插入
BEFORE 在给定过滤器之前插入
AFTER 在给定过滤器之后插入

EnvoyFilter.ListenerMatch

要将补丁应用到跨所有过滤链的指定监听器上,或者应用到监听器内部的指定过滤链上,必须满足监听器匹配中指定的条件。

字段 类型 描述 是否必需
portNumber uint32 向其发送或接收流量的服务端口或网关端口。如果未指定,则匹配所有监听器。即使为实例端口或 Pod 端口生成了入站监听器,也应该只使用服务端口来匹配监听器
filterChain FilterChainMatch 匹配监听器中的指定过滤器链。如果指定了,则补丁将应用于过滤器链(以及指定的过滤器,如果指定了),而不是应用于监听器中的其他过滤器链
name string 通过名称匹配指定的监听器。Pilot 生成的监听器通常命名为 IP:Port

EnvoyFilter.ListenerMatch.FilterChainMatch

对于有多个过滤器链的监听器(如 带有许可的 mTLS 的 sidecars 上的入站监听器,有多个 SNI 匹配的网关监听器),可以使用过滤器链匹配来选择要打补丁的指定过滤器链。

字段 类型 描述 是否必需
name string 过滤器链的名称
sni string 过滤器链的匹配条件使用的 SNI 值。如果过滤器链没有 SNI 匹配,则此条件的值为 false
transportProtocol string 仅适用于 SIDECAR INBOUND 上下文。如果非空,则在决定过滤器链匹配时要考虑传输协议。当 tls inspector 监听器过滤器检测到该值时,会将其与新连接的传输协议进行比较。可接受的值包括:raw_buffer - 默认值,当没有检测到传输协议时使用;tls - 当 tls inspector 检测到 tls 协议时设置
applicationProtocols string 仅适用于 sidecars。如果非空,则在决定过滤器链匹配时要考虑一组逗号分隔的应用程序协议。当某个监听器过滤器(如 http_inspector)检测到该值时,会将其与新连接的应用程序协议进行比较。接受的值包括:h2/http/1.1/http/1.0
filter FilterMatch 要应用补丁的指定过滤器的名称。将其设置为 envoy.httpconnectionmanager,以添加过滤器或将补丁应用于 HTTP 连接管理器

EnvoyFilter.ListenerMatch.FilterMatch

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

字段 类型 描述 是否必需
name string 要匹配的过滤器的名称
subFilter SubFilterMatch 过滤器中要匹配的下一级过滤器。通常用于 HTTP 连接管理器过滤器和 Thrift 过滤器

EnvoyFilter.ListenerMatch.SubFilterMatch

匹配另一个过滤器中的特定过滤器的条件。此字段通常用于匹配 envoy.httpconnectionmanager 网络过滤器内的 HTTP 过滤器。也适用于 Thrift 过滤器。

字段 类型 描述 是否必需
name string 要匹配的过滤器的名称

EnvoyFilter.Patch

指定如何给选中的对象打补丁。

字段 类型 描述 是否必需
operation Operation 指定如何应用补丁
value Struct 补丁对象的 json 配置。这将使用 json 合并语义与路径中现有的 proto 进行合并

EnvoyFilter.Patch.Operation

Operation 指定如何应用补丁到选定的配置。

名称 描述
MERGE 使用 json 合并语义将提供的配置与生成的配置合并
ADD 将提供的配置添加到现有列表(监听器,集群,虚拟主机,网络过滤器 或 HTTP 过滤器)。当 applyTo 设置为 ROUTECONFIGURATIONHTTPROUTE 时,将忽略此操作
REMOVE 从列表中删除选定的对象(监听器,集群,虚拟主机,网络过滤器 或 HTTP 过滤器)。不需要指定值。当 applyTo 设置为 ROUTECONFIGURATIONHTTPROUTE 时,将忽略此操作
INSERT_BEFORE 在给定对象数组上执行插入操作。此操作仅在过滤器的上下文中才有用,因为过滤器的顺序很重要。对于集群和虚拟主机,数组中元素的顺序无关紧要。在选定的过滤器或子过滤器之前插入。如果没有选择任何过滤器,指定的过滤器将被插入到列表的开头
INSERT_AFTER 在给定对象数组上执行插入操作。此操作仅在过滤器的上下文中才有用,因为过滤器的顺序很重要。对于集群和虚拟主机,数组中元素的顺序无关紧要。在选定的过滤器或子过滤器之后插入。如果没有选择任何过滤器,指定的过滤器将被插入到列表的末尾

EnvoyFilter.PatchContext

PatchContext 将根据流量流向和工作负载选择一类配置。

名称 描述
ANY sidecarsgateways 中的所有监听器、路由、集群
SIDECAR_INBOUND sidecars 中入站的监听器、路由、集群
SIDECAR_OUTBOUND sidecars 中出站的监听器、路由、集群
GATEWAY gateways 监听器、路由、集群

EnvoyFilter.ProxyMatch

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

字段 类型 描述 是否必需
proxyVersion string golang regex 格式(RE2)的正则表达式,可以使用 Istio 代理的特定版本来选择代理。给定代理的 Istio 版本是在连接到 Pilot 时从代理提供的节点元数据字段 ISTIOVERSION 中获得的。此值作为环境变量 ISTIOMETAISTIOVERSION 嵌入在 Istio 代理的 docker 镜像中。自定义代理实现应该提供这个元数据变量,以利用 Istio 版本检查选项
metadata map<string, string> 当连接到 Istio Pilot 时,匹配代理提供的节点元数据。注意,虽然 Envoy 的节点元数据的类型为 Struct,但 Pilot 只处理字符串的键值对。元数据中指定的所有键都必须与精确值匹配。如果指定的任何键不存在或值不匹配,则匹配将失败

EnvoyFilter.RouteConfigurationMatch

当补丁应用到路由配置对象或路由配置中的指定虚拟主机时,必须满足 RouteConfigurationMatch 中指定的条件。

字段 类型 描述 是否必需
portNumber uint32 生成此路由配置的服务端口号或网关服务器端口号。如果省略,则适用于所有端口的路由配置
portName string 仅适用于 Gateway 上下文。生成此路由配置的网关服务器端口名称
gateway string 生成此路由配置的 Istio 网关配置的 namespace/name。仅在上下文为 Gateway 时适用,应该采用 namespace/name 格式。将此字段与 portNumberportName 结合使用,可以为网关配置对象内的特定 HTTPS 服务器准确选择 Envoy 路由配置
vhost VirtualHostMatch 在路由配置中匹配指定的虚拟主机,然后将补丁应用到该虚拟主机
name string 用于匹配的路由配置名称,可用于按此名称匹配特定的路由配置。例如,为所有 sidecars 内部生成的 http_proxy 路由配置

EnvoyFilter.RouteConfigurationMatch.RouteMatch

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

字段 类型 描述 是否必需
name string 默认情况下生成的路由对象命名为 default。使用 VirtualService 生成的路由对象将携带 VirtualService 的 HTTP 路由中使用的名称
action Action 将路由与特定操作类型匹配

EnvoyFilter.RouteConfigurationMatch.RouteMatch.Action

Action 是指 Envoy 在匹配 HTTP 路由时对路由采取的操作。

名称 描述
ANY 所有三个路由操作
ROUTE 将流量路由到 cluster/weighted 集群
REDIRECT 重定向请求
DIRECT_RESPONSE 直接响应具有特定有效负载的请求

EnvoyFilter.RouteConfigurationMatch.VirtualHostMatch

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

字段 类型 描述 是否必需
name string 由 Istio 生成的虚拟主机对象被命名为 host:port,其中主机通常对应 VirtualServicehost 字段或注册表中某个服务的主机名
route RouteMatch 匹配虚拟主机中的特定路由

EnvoyFilter相关推荐

  1. 不懂envoyfilter也敢说精通istio系列-ratelimit-istio ratelimit完全手册

    欢迎关注我的公众号: 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下: istio多集群探秘,部署了50次多集群后我得出的结论 istio多集群链路追踪,附实操视频 istio防故障利器,你 ...

  2. 一张图快速了解 Istio 的 EnvoyFilter

    EnvoyFilter简介 EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置.使用 EnvoyFilter 修改某些字段的值,添加特定的过滤器,甚至添加全 ...

  3. Istio 1.3 发布:HTTP 遥测不再需要 Mixer

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 米开朗基杨 来源 | 公众号「云原生实验室」 Istio 是 Google.IBM ...

  4. 基于 Wasm 和 ORAS 简化扩展服务网格功能

    作者 | 王夕宁  阿里云高级技术专家 来源 | 阿里巴巴云原生公众号 本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库(一个 OCI 兼容的注册库)中 ...

  5. 阿里云专家详解 2020 服务网格发展趋势

    作者 | 王夕宁 阿里巴巴高级技术专家 关注"阿里巴巴云原生"公众号,参与文末留言互动,即有机会获得赠书福利! 本文摘自于由阿里云高级技术专家王夕宁撰写的<Istio 服务网 ...

  6. 云原生生态周报 Vol. 19 | Helm 推荐用户转向 V3

    作者| 禅鸣.忠源.天元.进超.元毅 业界要闻 Helm 官方推荐用户迁移到 V3 版本 Helm 官方发布博客,指导用户从 v2 迁移到 v3,这标志着官方开始正式推进 helm 从 v2 转向 v ...

  7. 阿里云服务网格 ASM 发布新功能:提供更精细化的服务治理能力

    简介:服务网格作为服务间通信的基础设施层,吸引了越来越多的用户使用.阿里云服务网格 ASM 将继续为开发者带来便利.9月1日,阿里云服务网格( ASM )产品经理问思为大家解读近期 ASM 发布的一些 ...

  8. Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据

    简介:服务网格ASM的Mixerless Telemetry技术,为业务容器提供了无侵入式的遥测数据.遥测数据一方面作为监控指标被ARMPS/prometheus采集,用于服务网格可观测性:另一方面被 ...

  9. 基于WASM的无侵入式全链路A/B Test实践

    简介:我们都知道,服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力.通过配置VirtualService和DestinationRule,即可实现流量管理.超时重试. ...

最新文章

  1. IIS7 授权配置错误
  2. [codevs 1237] 餐巾计划问题
  3. 在ASP.NET MVC 中获取当前URL、controller、action
  4. pg加密扩展的安装_postgresql的加密扩展插件pgcrypto
  5. node js 开发网站_使用Node JS开发网站
  6. 备份整合更需要一体机
  7. centos mysql
  8. Microsoft C++ 异常: dlib::serialization_error,位于内存位置 0x0133F818 处
  9. 小妲己智能机器人要连接wifi吗_ZIB智伴机器人可以连WiFi吗 ZIB智伴机器人连接WiFi方法...
  10. 基于微信小程序的自驾旅游管理系统
  11. 计算机网络安全讲座心得,学习信息安全心得体会
  12. 据说这些用来问一两年工作经验的人(吓死宝宝了)
  13. 【隐私计算笔谈】MPC系列专题(五):Beaver三元组和BMR协议
  14. VNC Connect远程工具使用-使用体验极高
  15. Android 微信支付配置流程
  16. CSS层级小技巧!如何在滚动时自动添加头部阴影?
  17. 爱否赢了?华为拍月亮方法已申请专利
  18. BIM模型一键输出 3D Tiles (for Cesium) 和 glTF/blg
  19. Sublime Text 3 的 Markdown 实时预览全面总结
  20. 火狐怎么导入收藏夹_火狐浏览器怎么把网页添加到收藏夹

热门文章

  1. 一个优秀的公众号运营者需要具备哪些能力?
  2. jmeter学习记录(3)jmeter中如何引用变量?
  3. 按键点亮LED,按一下亮,按一下灭
  4. elementUi 设置滚动条
  5. mysql delayed_mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
  6. 绝地求生无法启动因为计算机中丢失,绝地求生无法启动怎么办_绝地求生无法启动解决方法...
  7. Python爬虫:wd参数
  8. 20行Python代码实现图形化翻译工具(附源码和成品下载地址)
  9. Dicom文件转mhd,raw文件格式
  10. VC/Wince 实现仿Win8 Metro风格界面1——设计概述和自绘Button