ASM数据面代理扩展能力综述

简介: 本文介绍ASM数据面代理提供的各种扩展能力,方便您选择更合适的扩展方式满足业务需求。

【阅读原文】戳: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会在处理请求的过程中调用这些代码。您可以参考:

 

https://help.aliyun.com/zh/asm/user-guide/routing-based-on-client-ip-on-asm-gateway?spm=a2c4g.11186623.0.i51

 

目前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:

https://help.aliyun.com/zh/asm/user-guide/write-a-wasm-plugin-for-grid-agents-using-go?spm=a2c4g.11186623.0.i56

 

Rust:

https://help.aliyun.com/zh/asm/user-guide/developing-a-wasm-plugin-for-grid-agents-using-rust?spm=a2c4g.11186623.help-menu-search-147365.d_0

 

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)-阿里云帮助中心

https://help.aliyun.com/zh/asm/user-guide/use-envoy-external-processing-for-custom-processing-of-requests?spm=a2c4g.11186623.help-menu-147365.d_2_9_5.67835c80HQNsxs

 

[2] Attribute

https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/advanced/attributes#arch-overview-request-attributes

 

[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协议的自定义授权服务

https://help.aliyun.com/zh/asm/user-guide/grpc-protocol-custom-authorization-service-development-guide

 

[6] 接入gRPC协议的自定义授权服务

https://help.aliyun.com/zh/asm/user-guide/implement-custom-authorization-by-using-the-grpc-protocol



我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关文章
|
2月前
|
Kubernetes 大数据 调度
使用Kmesh作为阿里云服务网格ASM Sidecarless模式数据面
阿里云服务网格ASM支持Sidecar和Sidecarless两种模式,本文介绍了如何在阿里云ACK集群中部署Kmesh作为Sidecarless数据面并连接ASM控制面。
|
2月前
|
Kubernetes 调度 容器
使用Kmesh作为阿里云服务网格ASM Sidecarless模式数据面
阿里云服务网格ASM支持Sidecar和Sidecarless两种模式,其中Sidecarless模式如Istio Ambient、ACMG和Kmesh等,可减少延迟和资源消耗。Kmesh基于eBPF技术,通过内核空间拦截流量,结合Waypoint Proxy处理L7流量,实现高效的服务治理。本文介绍了如何在阿里云ACK集群中部署Kmesh并连接ASM控制面,包括安装步骤、检查服务状态和流量调度示例。
|
7月前
|
Java
使用ASM动态生成类的拦截代理类
使用ASM动态生成类的拦截代理类
86 0
|
Kubernetes 监控 安全
What this!理清服务网格中Sidecar代理的流量拦截配置
作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月
What this!理清服务网格中Sidecar代理的流量拦截配置
|
网络协议 数据可视化 NoSQL
【服务网格架构】Envoy架构概览(8):统计,运行时配置,追踪和TCP代理
【服务网格架构】Envoy架构概览(8):统计,运行时配置,追踪和TCP代理
|
Kubernetes 安全 机器人
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
1243 0
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
|
JSON Kubernetes 监控
使用阿里云服务网格ASM自定义数据面访问日志
部署在数据平面(即加入网格的Kubernetes集群)的Envoy Proxy可以输出所有访问日志,ASM支持自定义Envoy Proxy输出的访问日志内容。本文介绍如何自定义Envoy Proxy输出的访问日志内容。前提条件已创建ASM实例。具体操作,请参见创建ASM实例。已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。添加集群到ASM实例。具体操作,请参见添加集群到ASM
470 0
使用阿里云服务网格ASM自定义数据面访问日志
|
安全 网络协议 Go
阿里云服务网格ASM之扩展能力(1):在ASM中通过EnvoyFilter添加HTTP请求头
前面的系列文档中介绍了如何创建服务网格ASM实例,并介绍了如何将一个应用示例部署到 ASM 实例中,本文在此基础上介绍如何通过定义EnvoyFilter来添加HTTP请求头,以满足一些场景下的要求,例如使用安全请求头保护应用程序的安全等。
1652 0
阿里云服务网格ASM之扩展能力(1):在ASM中通过EnvoyFilter添加HTTP请求头
|
Kubernetes 安全 Cloud Native
基于 Wasm 和 ORAS 简化扩展服务网格功能
本文将介绍如何使用 ORAS 客户端将具有允许的媒体类型的 Wasm 模块推送到 ACR 注册库(一个 OCI 兼容的注册库)中,然后通过 ASM 控制器将 Wasm Filter 部署到指定工作负载对应的 Pod 中。Wasm Filter 部署中的所有步骤都使用声明方式,也就是说可以创建一个自定义资源 CRD 来描述 Wasm Filter 的部署。一旦该 CRD 创建之后,ASM 控制器可以将 Wasm 模块加载到数据平面层中的相应 Envoy 代理中,同时在控制平面层中也会创建相应的 Istio EnvoyFilter 自定义资源。
基于 Wasm 和 ORAS 简化扩展服务网格功能
|
监控 Java 数据安全/隐私保护
阿里云服务网格ASM之扩展能力(4):在ASM中实现分布式跟踪
服务网格ASM集成了阿里云链路追踪服务,为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等能力,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提升开发诊断效率。
1143 0
阿里云服务网格ASM之扩展能力(4):在ASM中实现分布式跟踪