【阅读原文】戳:ASM数据面代理扩展能力综述
阿里云服务网格(AlibabaCloud Service Mesh,简称ASM)提供一个全托管式的服务网格平台,兼容社区Istio开源服务网格,用于简化服务的治理,包括服务调用之间的流量路由与拆分管理、服务间通信的认证安全以及网格可观测性能力,从而极大地减轻开发与运维的工作负担。
ASM旨在帮助用户在云原生环境下快速构架安全、可靠的业务,默认提供了丰富的流量路由、认证授权以及可观测能力。然而在实际业务的生产落地中,总是会有一些业务特定的需求,是开发框架和ASM的标准能力无法满足的,比如:
• 自定义的流量打标逻辑:根据客户ID、应用版本,甚至基于外部数据源对HTTP请求进行打标;
• 自定义的认证/鉴权逻辑:有特殊的鉴权规则、依赖外部数据源,无法使用ASM提供的标准授权策略实现;
• 操作请求/响应Body;
• 在ASM提供的默认日志以及指标中,加入特定的业务信息。
如果您选择自行在业务代码中实现,和业务耦合度高,需要解决多语言、强制实施、升级等多种问题,在实际落地中会面临较大阻力。
ASM在这方面拥有先天的优势:
1. 语言无关;
2. 集群层面强制实施,无需担心有业务应用跳过这些逻辑;
3. 与业务完全解耦,无需担心升级依赖等问题。
ASM数据面7层代理(网关、Sidecar、Waypoint)基于Envoy实现,Envoy提供了多种扩展方式可以实现丰富的自定义功能。本文将全面介绍当前ASM提供的各类扩展方式以及各自的使用场景。
目前ASM主要提供了以下扩展能力供您选择:
1. EnvoyFilter
2. Lua
3. Wasm
4. External Processing
5. 自定义授权服务
我们将逐一介绍这些扩展方式。
1. EnvoyFilter
Filter是Envoy中的概念,不同的Filter按照一定顺序组成一条Filter链,进入Envoy的请求将按照这个顺序依次被这些Filter处理,然后转发给上游服务。这些Filter使用C++开发,和Envoy的核心代码一起编译成Envoy二进制文件,性能很高。
服务网格语境下的EnvoyFilter是ASM提供的一种Kubernetes资源,您通过Envoyfilter资源修改数据面代理中已有的Filter或者添加新的Filter。
EnvoyFilter具备高度的灵活性,容易出现配置错误或不兼容的情况。因此,使用EnvoyFilter需要对数据面实现有一定的了解。
针对不同版本EnvoyFilter配置可能不同的问题,ASM提供了EnvoyFilter模板,可以参考:
https://help.aliyun.com/zh/asm/user-guide/manage-envoy-filters?spm=a2c4g.11186623.0.0.20acd30cIXffiz
Lua、Wasm和自定义授权服务也是Envoy中的Filter。和普通的Filter不同,这些Filter可以实现一些用户自定义的逻辑。这里只讨论普通的实现特定功能的Envoyfilter。
使用限制:
• 只能使用Envoy官方提供的Filter,并不能实现自定义逻辑。
推荐使用场景:只要Envoy官方提供了可以满足您的需求的Filter,均建议使用EnvoyFilter资源。比如:自定义错误页面、请求返回413时设置缓存大小等。
2. Lua
Lua是一种轻量级、高效的脚本语言,主要用于嵌入式开发和游戏编程。它以简单易学和灵活可扩展闻名,广泛应用于多种领域。Envoy中有一个特殊的Lua Filter,您可以在Filter配置中直接填写Lua代码,Envoy会在处理请求的过程中调用这些代码。您可以参考:
目前Lua脚本只能在处理HTTP请求时生效,您无法直接用它来操作TCP字节流。
使用限制:
• 需要您直接在EnvoyFilter配置中填写Lua代码,所以无法引用外部的工具库,当逻辑复杂时,EnvoyFilter配置将变得难以维护。所以不建议在Lua中写太过复杂的逻辑。
• 不建议在Lua脚本中处理请求或响应Body。在Lua脚本中处理请求或响应Body时,会导致Envoy缓存整个Body,当Body较大时,可能会导致Envoy内存占用过高或请求返回413。
推荐使用场景:当您的需求比较简单并且可以用少量代码完成时,建议使用Lua。运行效率比较高,而且配置简单直观。
3. Wasm
WebAssembly(Wasm)是一种可移植的二进制可执行文件格式。您编写的代码将会被编译成二进制文件,在一个内存安全(对于主机)的沙箱中以接近本机的运行速度执行,使用的资源严格受限,且通过明确定义的API与主机通信,更加安全。Wasm支持使用多种语言编写,比如Rust、C++以及Go等。
和Lua不同,由于您直接提供Wasm二进制文件给Envoy运行,所以可以单独管理这些扩展功能的代码,并且使用外部代码库来满足您的特殊需求。参考文档:
• Go:
• Rust:
Lua和Wasm都支持通过HTTP协议调用外部服务。和Lua相比,Wasm处理请求或响应的能力更加强大,主要分为以下几方面:
1. Wasm支持操作TCP字节流。
2. Wasm支持流式处理请求或响应Body。如果要在Lua中处理Body,会导致整个Body被缓存。在Wasm中,您可以根据需要选择是否缓存整个Body,如果选择分块处理的话,将显著提升Body处理效率并且降低内存占用。
3. 支持使用第三方库。
使用限制:
• Wasm运行时对于GC类语言支持存在问题,使用Go编写Wasm插件在Envoy中执行时,其内存占用会有显著提升。社区更加推荐使用非GC类语言,比如Rust、C++等,这类语言内存占用少,而且执行效率更高。但是这类语言通常编写或编译门槛较高。您可以根据需要自行选择。
推荐使用场景:对相关开发语言熟悉,了解Envoy内部处理逻辑,并且需求比较复杂。Go语言编写简单,可以用于一些对于性能和资源并不敏感的场景。如果对性能和资源占用敏感,建议使用Rust、C++。
4. External Processing
External Processing是Envoy在1.23(对应ASM 1.15)新增的原生C++ HTTP Filter。它可以根据用户的配置,在HTTP请求的不同阶段调用指定的外部服务来处理请求,可以实现如下操作:
• 获取并修改HTTP请求或者响应的Header;
• 获取并修改HTTP请求或响应的Body;
• 获取并修改请求对应的dynamic stream metadata(可用于在metrics以及访问日志中输出自定义信息);
• 直接返回自定义响应。
相关示例,请参考:使用Envoy External Processing对请求进行自定义处理_服务网格(ASM)-阿里云帮助中心[1]
其能力还在不断完善中:
• 1.30(对应ASM 1.22)支持了传递多种Envoy的元数据以及Entoy的Attribute[2]。
• 1.32(对应ASM 1.24)支持了异步调用模式。
使用限制:
• 如果需要对请求和响应的多个阶段进行处理,需要Envoy发起多个外部请求到 External Processing服务。可能造成较高的延迟。
• 只能支持HTTP协议,无法处理TCP字节流。
和Wasm插件比较:
在处理HTTP请求的场景中,Wasm和External Proccessing能力较为相似。
• Wasm:
- “本地执行”,不会发起外部请求,延迟较低。
- Wasm二进制运行在Envoy的沙箱环境中,不支持Linux系统调用。
• External Proccessing:
- 各阶段分离,需要远程调用,延迟较高。
- 完全和Envoy解耦,可自定义程度更高。
推荐使用场景:延迟不敏感的业务,且处理逻辑较为复杂。您可以使用任意语言开发,只要能提供Envoy要求的gRPC接口即可。
5. 自定义授权服务
自定义授权服务原理是:Envoy支持配置一个外部鉴权的Filter,当请求被这个Filter处理时,这个Filter将会调用一个外部的标准HTTP或gRPC服务,由这个服务来判断拒绝或放行请求,并且可以修改或新增请求指定的请求头。自定义授权服务操作请求的能力受限,不如Lua或Wasm灵活,但是其主要优势是和Envoy解耦,API十分稳定,并且不依赖特定编程语言或编程框架,您只需要实现Envoy要求的HTTP或gRPC接口即可。
相关文档可以参考:
• 开发基于HTTP协议的自定义授权服务[3]
• 接入HTTP协议的自定义授权服务[4]
• 开发基于gRPC协议的自定义授权服务[5]
• 接入gRPC协议的自定义授权服务[6]
使用限制:
• 只能对HTTP请求生效,无法作用于响应。
• 可获取的请求元信息受限,不如Lua和Wasm灵活。只能读取请求Body,不能操作请求Body。
• 需要显式配置可操作的请求头,并不能完全由自定义授权服务决定。
• 由于自定义授权服务单独部署,所以会增加一些请求处理延迟。
推荐使用场景:推荐用于认证/鉴权的场景,可以和ASM的授权策略结合,实现更细粒度的认证/鉴权操作。
关于插件中心
ASM插件中心提供了诸多内置插件,这些插件或基于Envoy的原生Filter实现,或基于Lua、Wasm实现。当您遇到一些定制化需求时,建议优先在插件市场查看是否有满足需求的内置插件,如果没有再考虑自行配置或开发。
总结
Envoy在云原生领域越来越流行,强大的可扩展能力是其被越来越多项目和组织认可的重要原因。ASM的数据面基于Envoy实现,既向用户提供了一些能力的封装实现,又向用户透出了灵活的底层接口,能过满足各式各样的定制化需求,让应用开发人员更加专注于业务逻辑开发。并且Envoy的各项扩展能力还在不断进化中,无论是Wasm还是External Processing,相信其未来一定会在性能、功能、安全达到更加平衡的状态。
相关链接:
[1] 使用Envoy External Processing对请求进行自定义处理_服务网格(ASM)-阿里云帮助中心
[2] Attribute
[3] 开发基于HTTP协议的自定义授权服务
https://help.aliyun.com/zh/asm/user-guide/develop-a-custom-http-based-authorization-service
[4] 接入HTTP协议的自定义授权服务
https://help.aliyun.com/zh/asm/user-guide/implement-custom-authorization-by-using-the-http-protocol
[5] 开发基于gRPC协议的自定义授权服务
[6] 接入gRPC协议的自定义授权服务
https://help.aliyun.com/zh/asm/user-guide/implement-custom-authorization-by-using-the-grpc-protocol
我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。
获取关于我们的更多信息~