阿里云服务网格ASM流量治理完全指南:从原理到生产级实践
引言:微服务治理的挑战与ASM的诞生
在微服务架构大规模普及的今天,一个复杂的业务系统往往由数十甚至数百个微服务组成。服务之间的网络通信变得极其复杂,开发者不仅需要关注业务逻辑的实现,还需要投入大量精力处理服务发现、负载均衡、流量路由、熔断降级、超时重试、安全加密等基础设施层面的问题。这种将通信逻辑与业务逻辑耦合在一起的做法,严重影响了开发效率和系统稳定性。
服务网格技术的出现,为解决这一困境提供了全新的思路。它将微服务间的通信逻辑从应用层剥离,下沉到独立的基础设施层,通过在每个服务实例旁部署代理来接管所有的网络流量,从而实现了通信层与业务层的解耦。阿里云服务网格ASM正是在这一理念下诞生的全托管式服务网格平台。ASM基于Kubernetes构建,完全兼容社区Istio开源服务网格,将Istio控制面的所有组件进行托管,极大降低了用户的使用和运维成本。通过ASM,开发者可以使用声明式的配置定义灵活的路由规则、执行安全策略、观测服务行为,而无需修改任何业务代码。
需要先登录阿里云控制台,点击:阿里云控制台
一、ASM架构解析:控制面与数据面的协同
理解ASM的流量治理机制,首先需要了解其整体架构。ASM分为控制面和数据面两大部分。
1.1 控制面:托管的治理大脑
控制面是ASM的治理核心,负责读取用户配置、管理服务注册信息、下发治理策略到数据面。在ASM中,控制面的所有组件均由阿里云全托管。用户无需关心控制面的部署、升级、扩缩容和运维,只需专注于业务应用的开发与部署。控制面的核心职责包括:服务注册与发现、配置管理与分发、安全证书管理、策略执行与遥测数据收集。
1.2 数据面:无处不在的流量拦截
数据面由部署在每个业务Pod中的网络代理组成,这些代理会拦截进出Pod的所有网络流量,并按照控制面下发的指令对流量进行处理。ASM默认使用Envoy作为数据面代理,Envoy是一款高性能的七层代理,具备丰富的流量治理能力。
目前ASM支持两种数据面部署模式:
- Sidecar模式:每个业务Pod中自动注入一个Envoy代理容器,该代理管理进出Pod的所有流量。这是最经典的服务网格数据面模式,适用于大多数场景。
- Ambient模式:每个节点部署一个四层代理,同时可以为命名空间或指定服务部署七层Envoy代理。该模式进一步降低了资源开销,提供了更灵活的数据面部署选项。
ASM支持多种数据面基础设施形态,包括ACK托管集群、ACK Serverless集群、ACS集群、ACK Edge集群等,实现了跨异构基础设施的流量管理能力。
二、核心配置资源:VirtualService与DestinationRule
在ASM中,流量治理的核心配置主要通过两种自定义资源来实现:VirtualService和DestinationRule。
2.1 VirtualService:流量路由的指挥官
VirtualService定义了流量如何从源服务路由到目标服务。它可以根据请求的HTTP头、URI路径、查询参数等条件,将流量分发到不同的服务版本或后端。ASM评估VirtualService的路由规则优先于DestinationRule的策略。
以下是一个典型的VirtualService配置示例,它将流量按权重分配到服务的v1和v2版本:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-vs
namespace: default
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10在这个示例中,所有来自用户jason的请求都会被路由到reviews服务的v2版本,而其他请求则有90%的概率被路由到v1版本,10%的概率被路由到v2版本。
2.2 DestinationRule:目标服务的策略配置
DestinationRule定义了在路由发生后,发往目标服务的流量策略。它指定了负载均衡策略、来自Sidecar的连接池大小以及异常检测设置的相关配置,以便从负载均衡池中检测并清除不健康的主机。
以下是一个DestinationRule配置示例,它定义了服务的子集并配置了连接池和异常检测:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews-dr
namespace: default
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
loadBalancer:
simple: ROUND_ROBIN
outlierDetection:
consecutiveErrors: 5
interval: 30s
baseEjectionTime: 30sASM同时提供了图形化的配置界面,您可以直接在控制台创建目标规则和虚拟服务,而无需编写YAML文件,大幅简化了流量管理操作。
三、高可用治理策略
ASM提供了丰富的流量治理策略来构建分布式系统的容错能力,包括超时处理、重试机制、熔断限流、故障注入和流量镜像等。
3.1 超时处理
当请求上游服务时,存在上游服务一直没有响应的现象。您可以设置一个等待时间,到达该时间后如果上游服务还没有响应,则直接请求失败,不再等待。通过设置超时,可以确保应用程序在后端服务无响应时能够收到错误返回,从而以适当的回退行为进行处理。
以下是在VirtualService中配置超时的示例:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin
http:
- route:
- destination:
host: httpbin
timeout: 5s如果在5秒内请求的服务没有响应,则直接返回错误结果,不再等待。
3.2 重试机制
如果某个服务请求另一个服务失败,例如请求超时、连接超时、服务宕机等错误,可以通过配置重试机制重新请求该服务。ASM支持在VirtualService中定义HTTP请求重试策略。
以下示例配置了对httpbin服务的重试策略:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin
http:
- route:
- destination:
host: httpbin
retries:
attempts: 3
perTryTimeout: 5s
retryOn: connect-failure,reset该配置表示:当httpbin应用无响应或与httpbin应用建立连接失败时,会重新请求httpbin应用3次,每次的请求超时时间为5秒。需要注意的是,如果一次请求未达到最大重试次数,但所有重试花费的总时间已经超过了超时时间,则Sidecar代理会停止请求重试并进行超时返回。
3.3 熔断机制
熔断器跟踪服务实例的访问状态,通过跟踪一段时间内服务实例的访问请求判定其健康状况,将不健康的实例从连接池中隔离,从而提高服务总体的访问成功率。ASM通过DestinationRule中的connectionPool和outlierDetection配置来实现熔断功能。
以下示例配置了连接池限制和异常检测:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin-dr
spec:
host: httpbin
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
connectTimeout: 30ms
http:
http1MaxPendingRequests: 10
http2MaxRequests: 100
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 60s
maxEjectionPercent: 50该配置限制了最大连接数为100,连接超时时间为30毫秒,并设置了当连续出现5次5xx错误时,将实例从负载均衡池中移除60秒。
3.4 故障注入
故障注入可以让你在受控环境中发现微服务中隐藏的问题,例如不匹配的超时配置、缺失的重试逻辑或错误的异常处理,避免这些问题在生产环境中导致故障。ASM支持通过VirtualService进行应用层的故障注入,模拟延迟增加或HTTP错误等条件。
以下示例向所有发往httpbin服务的请求注入5秒的延迟:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin-vs
namespace: default
spec:
hosts:
- httpbin
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: httpbinASM支持两种故障类型:
- 延迟故障:在转发请求之前增加延迟,用于模拟上游服务缓慢或网络拥塞。
- 中止故障:在不转发请求的情况下返回错误码,用于模拟上游服务故障或不可用。
两种类型都支持匹配条件和百分比采样,以精准控制受影响的流量范围。
3.5 流量镜像
流量镜像也称影子流量,该功能将实时流量的副本发送到镜像服务,而镜像流量发生在主服务的关键请求路径之外。镜像服务处理实时流量,但其响应会被丢弃,不影响主请求路径。这一功能主要用于在不影响最终客户端的情况下,使用真实生产流量测试新版本服务。
以下是在VirtualService中配置流量镜像的示例:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin
http:
- route:
- destination:
host: httpbin
subset: v1
weight: 100
mirror:
host: httpbin
subset: v2
mirrorPercentage:
value: 100.0该配置将100%的请求流量镜像到v2版本,而主请求仍然路由到v1版本。
四、ASM网关:南北向流量管理
ASM网关负责管理集群的南北向流量,即从集群外部进入集群内部的流量。ASM为网关提供了直观的图形化界面,您可以直接在控制台创建目标规则和虚拟服务,而无需编写YAML文件。
4.1 入口网关配置
使用ASM网关的流量路由功能,首先需要创建入口网关,然后导入上游服务,最后创建流量策略。ASM网关支持HTTP、HTTPS、TCP、gRPC等多种协议。
以Bookinfo应用为例,通过ASM网关配置/productpage和/login等路由策略,用户可以通过/productpage等路径访问到Bookinfo服务。
4.2 出口流量管理
ASM在出口流量管理方面提供了多种灵活且高效的解决方案。根据管控粒度的不同,ASM提供两种出口流量管理方式:
- 细粒度管控:通过ServiceEntry和Waypoint实现精细化的单服务出口流量控制。ServiceEntry将外部服务添加到Istio服务注册表中,使其流量受到Istio的监控和控制。
- 全局策略管控:通过EgressPolicy实现全局层面的出站流量策略控制,适用于需要从全局层面统一管控出站流量的场景。
以下是一个ServiceEntry的配置示例,将外部HTTP服务注册到网格中:
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: external-svc
spec:
hosts:
- api.example.com
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
location: MESH_EXTERNAL注册外部服务后,可以通过VirtualService配置相应的路由规则,实现对外部服务的流量治理。
五、灰度发布与全链路流量管理
5.1 基于权重的灰度发布
ASM支持通过VirtualService的权重路由实现灰度发布。通过调整不同版本之间的流量权重,可以逐步将流量从旧版本迁移到新版本,实现平滑的版本升级。
以下示例将90%的流量路由到v1版本,10%的流量路由到v2版本,实现金丝雀发布:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 105.2 流量泳道与全链路灰度
当服务之间存在调用链路时,对服务的灰度发布往往不局限于单个服务,而是需要对服务的整条请求链路进行环境隔离与流量控制。ASM支持通过流量泳道将应用的相关版本隔离成一个独立的运行环境,以满足应用服务的全链路灰度发布场景。
流量泳道的核心思想是将云原生应用中的多个服务根据版本隔离成多个独立运行环境,由服务网格通过精细化地控制服务间的东西向流量来实现。ASM自1.20.6.27版本起,支持通过ASMSwimLaneGroup和ASMSwimLane两种YAML编写的自定义资源来定义流量泳道。全链路灰度治理策略主要专注于整个调用链,流量控制视角从服务转移至请求链路上,仅需制定少量的治理规则便可构建从网关到整个后端服务的多个流量隔离环境。
5.3 金丝雀升级
ASM支持基于修订与标签的升级模式,以更稳定安全的方式执行新版本控制面的金丝雀升级。在新升级模式中,数据面的网格代理将与其使用的特定控制面版本相关联。Istio为命名空间引入了istio.io/rev标签,指示哪个控制面版本应该为相应命名空间中的工作负载注入Sidecar代理。在金丝雀升级过程中,可通过将部分服务先升级的方式来验证目标版本是否符合预期,若验证结果不符合预期,可以快速进行回滚来保证服务的稳定性。
六、零信任安全体系
6.1 mTLS全链路加密
通过ASM,您可以在完全不修改应用的情况下使用mTLS对全链路流量进行加密,并且可以在各个环节使用mTLS提供的证书来进行访问控制,以提升业务整体的安全水位。
ASM实现全链路mTLS加密具有以下优势:
- 应用只需要关注业务逻辑,将安全能力下沉至网格基础设施。
- ASM管理了集群内通信的证书颁发以及轮转,大大降低了维护负担。
- 迁移过程中无需修改业务应用,迁移更加顺畅。
在ASM中,东西向流量的mTLS通信是基础功能,只需将集群内通信双方启用Ambient模式即可,Pod之间的通信会被自动升级为mTLS,应用无需做任何修改。mTLS通信中用到的证书基于工作负载使用的ServiceAccount颁发,并且由ASM控制面定期进行轮转,完全无需手动干预。
ASM提供了对等身份认证配置,在迁移过程中可将认证级别调整为PERMISSIVE(同时接收明文和mTLS流量),迁移结束后修改为STRICT(只接收mTLS流量),确保集群内的流量全部使用mTLS加密。
6.2 认证与授权
ASM支持完善的认证和授权配置,还提供了灵活的扩展能力,支持对接HTTP协议和gRPC协议的自定义授权服务。在网关上可以配置JWT认证来完成对请求身份的认证;对于网格内的请求,默认通过网格提供的mTLS证书完成请求身份的认证。
确认了请求身份之后,可以使用授权策略来限制请求的行为。授权策略决定一个经过认证的请求是否被允许到达其目标。通过AuthorizationPolicy可以实现精细的访问控制,例如限制特定服务只能被特定的命名空间访问,或者限制特定HTTP方法和路径的访问。
以下是一个授权策略的示例,限制只有来自特定来源的请求才能访问reviews服务:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: reviews-viewer
namespace: default
spec:
selector:
matchLabels:
app: reviews
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/bookinfo-productpage七、可观测性体系
ASM提供日志、监控指标、链路追踪三个维度的可观测配置功能。您可以通过ASM控制台为全局、命名空间或指定工作负载自定义相关配置,例如日志输出的格式、指标的维度、是否启用特定监控指标、设置链路追踪的采样率等。
7.1 访问日志
ASM支持启用或禁用访问日志输出、设置日志输出形式、自定义日志格式、日志过滤等功能。打开启用日志输出开关后,服务网格数据平面Sidecar或网关会将访问日志输出至容器标准输出。
查看Sidecar日志的示例命令:
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1输出示例:
{
"authority_for":"47.110.XX.XXX",
"bytes_received":"0",
"bytes_sent":"22382",
"downstream_local_address":"192.168.0.29:80",
"duration":"80",
"method":"GET",
"path":"/static/favicon.ico",
"protocol":"HTTP/1.1",
"response_code":"200"
}7.2 监控指标
ASM集成了可观测监控Prometheus版,可以实现对服务网格的监控。在开通ARMS之后,可以在ARMS中为ACK集群一键安装Prometheus监控插件,通过ARMS预定义的仪表板监控Kubernetes集群的众多性能指标。
7.3 链路追踪
ASM支持链路追踪功能,可以追踪请求在微服务之间的完整调用链。ASM支持设置链路追踪的采样率,以平衡可观测性需求和性能开销。
八、生产实践最佳实践
8.1 多集群流量管理
ASM实例可以管理来自多个Kubernetes集群的应用服务,提供统一的流量管理和服务发现能力。在多集群场景下,ASM支持基于地理位置的流量管理能力:
- 地域感知路由:流量被导向离发起Pod最近的Pod,尽可能将调用保持在同可用区内。
- 跨地域容灾:当一个地域的服务不可用时,自动将流量重新路由到健康的地域。
8.2 版本选择建议
ASM提供免费版、企业版和旗舰版等版本:
- 免费版:适用于功能测试和评估,支持最多50个Pod。
- 企业版:适用于中小规模生产环境,支持最多1000个Pod,提供企业级增强和SLA保障。
- 旗舰版:适用于大规模生产环境,支持最多10000个Pod,提供企业级增强和SLA保障。
选择合适的数据面模式也至关重要:Sidecar模式适用于大多数通用场景,而Ambient模式在资源开销和灵活性方面更具优势。
8.3 配置管理最佳实践
- 声明式配置:将所有ASM配置以YAML形式存储在Git仓库中,实现基础设施即代码。
- 命名空间隔离:利用命名空间级别的配置隔离不同环境的流量策略。
- 渐进式变更:使用金丝雀发布和灰度路由逐步推出配置变更,降低风险。
- 可观测性先行:在生产环境部署前,确保日志、监控和链路追踪体系已就绪。
问答环节
问1:ASM与开源Istio是什么关系?
答:ASM完全兼容开源Istio服务网格,基于Kubernetes构建,将Istio控制面的所有组件进行托管。用户可以使用Istio的声明式配置语法定义路由规则和安全策略,同时享受阿里云全托管带来的运维便利。
问2:VirtualService和DestinationRule有什么区别?
答:VirtualService定义流量如何从源服务路由到目标服务,包括路由匹配条件和权重分配;DestinationRule定义路由发生后发往目标服务的策略,包括负载均衡、连接池大小和异常检测。ASM先评估VirtualService的路由规则,再应用DestinationRule的策略。
问3:如何在ASM中实现灰度发布?
答:通过VirtualService配置不同版本之间的流量权重分配,将少量流量路由到新版本进行验证,逐步增加新版本的流量比例。对于全链路灰度场景,可以使用流量泳道功能将整条调用链上的服务版本隔离成独立的运行环境。
问4:ASM如何保障微服务间的通信安全?
答:ASM通过mTLS实现全链路加密通信,证书基于ServiceAccount颁发并由控制面定期轮转。同时支持JWT认证和AuthorizationPolicy授权策略,实现零信任安全体系。
问5:Sidecar模式和Ambient模式如何选择?
答:Sidecar模式在每个Pod中注入Envoy代理,适用于大多数通用场景;Ambient模式在每个节点部署四层代理,可按需部署七层代理,资源开销更低,部署更灵活。
问6:ASM的可观测性包含哪些方面?
答:ASM提供日志、监控指标和链路追踪三个维度的可观测能力。支持访问日志的启用/禁用和格式自定义,集成Prometheus监控指标,支持链路追踪及采样率配置。



