腾讯云服务网格ASM深度实践:微服务架构网站的全托管治理之道
一、服务网格:微服务通信的下一代基础设施
在云原生时代,微服务架构已成为构建现代网站和分布式应用的主流范式。然而,随着微服务数量的增长,服务间的通信管控变得日益复杂。服务网格(Service Mesh)应运而生,它将服务间的网络通信从业务代码中剥离,作为一个独立的基础设施层,专门处理服务发现、负载均衡、加密、认证授权、可观测性等跨领域横切关注点。
服务网格的核心思想是:通过为每个服务实例部署一个轻量级代理(Sidecar),由这个代理接管所有进出服务的网络流量,从而实现对微服务间通信的精细化管控。这些代理共同构成数据平面,而统一的管理控制平面则负责配置和策略下发。采用这种方式,开发人员无需修改业务代码即可获得完整的微服务治理能力。
腾讯云服务网格(Tencent Cloud Mesh,简称TCM,亦称ASM)正是在这一理念下诞生的云原生服务网格产品。它100%兼容Istio API,与腾讯云基础设施原生集成,提供全托管服务化的支撑能力。通过ASM,企业可以轻松保障和管理网格生命周期,实现跨集群、跨环境和异构应用的统一流量调度、安全管控和可观测性。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
二、腾讯云ASM架构深度解析
2.1 全托管架构与传统Istio的差异
传统自建Istio模式下,企业需要自行部署、运维和升级Istio控制面组件(如Pilot、Citadel、Galley等),并管理数据面Envoy代理的生命周期。这种方式虽然灵活,但运维成本高、版本升级风险大、与云基础设施集成度不足。腾讯云ASM采用全托管架构,将控制面的运维复杂度从用户侧剥离,用户无需关注控制面的部署、高可用、监控和备份,即可享受完整的企业级服务网格能力。
ASM架构的核心特征是:托管式的控制面 + 可插拔的数据面。控制面由腾讯云统一运维管理,自动完成组件高可用部署、版本金丝雀升级和故障自愈;数据面则部署在用户集群中,以Sidecar容器的方式与业务Pod共存。这种架构既保留了用户对数据面的掌控权,又极大降低了控制面的运维负担。
2.2 控制面与数据面的协同机制
在ASM中,控制面本质上是一个托管版本的Istio控制平面,包含以下核心组件:Pilot负责服务发现和配置分发,Galley负责配置验证和管理,Citadel负责证书和密钥管理。控制面通过xDS协议(包括CDS、EDS、LDS、RDS等)与数据面Envoy代理进行通信,动态下发路由规则、集群配置、监听器策略和端点信息。
数据面方面,每个微服务Pod中都会注入一个Envoy Sidecar容器。Envoy作为高性能的七层代理,接管Pod的入站和出站流量。当服务A调用服务B时,流量被Pod内的Envoy拦截,Envoy根据控制面下发的xDS配置决定将请求转发到哪个后端实例,同时自动完成负载均衡、重试、超时控制、熔断等治理策略。
ASM在数据面性能上做了大量深度优化:长期在用户态与内核态投入,提供高性能的数据面Envoy版本并支持eBPF流量劫持转发模式,CPU开销降低15%到20%,P99延迟降低20%到40%。这意味着相比原生Istio,ASM能以更少的资源消耗换取更优异的性能表现。
三、业务无侵入的微服务接入与发现
3.1 Sidecar自动注入机制
ASM最突出的优势之一是对业务代码零侵入。通过Sidecar自动注入机制,现有微服务无需任何代码修改即可接入网格。操作方式非常简单:在ASM控制台中,进入目标网格的管理页面,在服务列表页点击Sidecar自动注入,按需勾选需要开启自动注入的命名空间。系统会自动为该命名空间下新创建的Pod注入Envoy Sidecar容器,并配置iptables规则实现流量劫持。
对于已经存在的Pod,可以通过滚动重启的方式触发Sidecar注入。标签控制也非常灵活:只需要为命名空间设置标签istio-injection=enabled,该命名空间下的Pod在创建时就会自动注入Sidecar;如果希望某个特定的Pod不注入Sidecar,可以在Pod上添加注解sidecar.istio.io/inject: false来禁用自动注入。这种精细化的控制能力使得在大型微服务架构中可以渐进式地将服务接入网格,降低迁移风险。
3.2 多集群服务发现与异构系统注册打通
对于中大型微服务架构网站,服务往往分布在多个Kubernetes集群甚至跨虚拟机环境运行。ASM提供了动态的服务发现能力,支持K8s集群的动态增删,也支持虚拟机负载的注册接入。这意味着无论是运行在TKE中的容器化服务,还是遗留系统中的虚拟机服务,都可以被统一纳入网格的管理视图中,实现跨集群、跨环境的服务发现和互通。
ASM还提供了与Nacos等服务注册中心的打通能力。对于已经使用Spring Cloud等微服务框架、基于Nacos做服务注册与发现的系统,ASM支持将Nacos中注册的服务无缝接入网格,实现异构服务框架的互联互通。这种方式使得传统SDK微服务架构可以向服务网格平滑演进,无需推翻原有架构即可逐步享受网格治理的红利。
四、精细化流量治理:从灰度发布到故障容错
4.1 基于VirtualService与DestinationRule的流量管理模型
ASM的流量管理模型完全兼容Istio的CRD体系,核心资源包括Gateway、VirtualService和DestinationRule。Gateway定义网格边缘的负载均衡器配置,用于管控南北向流量;VirtualService定义路由规则,指定流量如何从网关或服务间路由到目标服务;DestinationRule定义目标服务的版本子集和流量策略,包括负载均衡策略、连接池管理、健康检查和熔断配置等。
以下是一个典型的电商场景配置示例:假设有一个订单服务order-service,需要将5%的流量导向v2版本进行金丝雀测试,其余95%继续访问v1版本。首先通过DestinationRule定义服务的两个版本子集:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: order-service
spec:
host: order-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
loadBalancer:
simple: LEAST_CONN然后通过VirtualService定义权重分配规则:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: order-service
spec:
hosts:
- order-service
http:
- match:
- uri:
prefix: /order/
route:
- destination:
host: order-service
subset: v1
weight: 95
- destination:
host: order-service
subset: v2
weight: 5通过这种方式,无需修改任何业务代码即可实现精准的流量切分,为金丝雀发布、A/B测试、蓝绿部署等场景提供了强大支撑。
4.2 灰度发布、金丝雀部署与流量镜像实战
ASM内置了多种典型的灰度发布流程向导。在一个服务版本正常工作的同时,用户可以创建一个新的灰度版本,待灰度版本启动成功后,引导用户配置灰度规则来切分流量。灰度规则可以是基于权重的按比例切分,也可以根据HTTP Header、Cookie或请求内容来定向分发,实现基于用户特征的精细化路由。
除了常规的流量切分,ASM还支持流量镜像,即将生产流量的副本发送到新版本服务进行验证,而主流量依然由稳定版本处理。这种方式可以在不干扰线上业务的前提下,完整验证新版本的正确性和性能表现。配置方式也是在VirtualService中添加mirror字段指定镜像目标即可。
4.3 熔断、限流、重试与超时策略配置
在微服务架构网站中,一个服务的故障很容易产生级联效应,引发大面积不可用。ASM提供了完善的高可用流量治理机制来应对这一问题。通过DestinationRule中的TrafficPolicy,可以配置连接池管理、熔断检测和负载均衡策略。
熔断器的典型配置如下:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: payment-service
spec:
host: payment-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 10
http2MaxRequests: 1000
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 60s
maxEjectionPercent: 50上述配置的含义是:当某个实例连续出现5次5xx错误时,熔断器打开,将该实例摘除负载均衡池60秒,最多允许摘除50%的实例。熔断器会定期尝试放行少量请求探测目标是否恢复,如果探测成功则逐步恢复流量。
对于服务调用链路中的临时性故障,ASM支持配置自动重试策略:通过VirtualService中的retries字段可以设置重试次数、重试超时时间和重试条件,显著提高服务调用的最终成功率。超时控制则通过timeout字段配置单个请求的最大等待时间,避免因下游服务响应缓慢而长期占用线程资源。
故障注入是ASM提供的另一种强大测试能力,无需修改代码即可注入延迟故障或中断故障,用于验证系统的容错能力和恢复机制。这对混沌工程实践和弹性测试非常有价值。
五、零信任安全管控:从mTLS到JWT认证
传统微服务架构中的安全往往依赖网络边界防火墙和IP白名单,但在容器化动态IP环境下这种方式难以为继。ASM基于Istio的安全框架,提供了零信任网络的安全模型:服务间的所有通信默认使用mTLS双向加密,确保传输机密性和身份认证,而无需依赖网络边界。
ASM支持两种安全认证模式:一是自动mTLS(PERMISSIVE模式),服务可以同时接受明文和mTLS加密流量,方便逐步迁移;二是严格mTLS(STRICT模式),所有通信必须经过mTLS加密和认证,杜绝明文流量。
在授权层面,ASM通过AuthorizationPolicy资源实现基于身份的细粒度访问控制。例如,仅允许订单服务调用支付服务,而拒绝其他服务的调用:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: payment-service-policy
spec:
selector:
matchLabels:
app: payment-service
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/order-service"]
to:
- operation:
methods: ["POST"]
paths: ["/pay/"]JWT请求身份认证同样得到完整支持:在网关层或服务层配置RequestAuthentication资源,要求请求携带有效的JWT令牌,并从令牌中提取用户身份信息用于后续的路由决策。这种方式有效解决了容器化动态IP场景下服务认证和访问控制的难题。
六、全方位可观测性:监控、日志与链路追踪
微服务架构的复杂性使得故障定位变得异常困难,一个请求可能跨越数十个服务,任何一个环节的延迟波动都难以追踪。ASM提供了开箱即用的可观测性解决方案,覆盖Metrics指标、Logging日志和Tracing链路追踪三大支柱。
在指标监控方面,ASM与腾讯云监控服务、Prometheus深度集成。每个Envoy Sidecar会自动上报请求成功率、请求延迟、吞吐量等关键指标。网格统一的服务管理Dashboard可以提供跨集群的遥测数据聚合展示,轻松感知分布式应用的流量调度性能和健康状况。
链路追踪方面,ASM支持将分布式追踪数据导出到Jaeger、Zipkin等兼容系统。通过在服务网格层面注入追踪上下文(trace id、span id),无需修改业务代码即可实现全链路调用追踪。运营人员可以在控制台中直观地看到请求从API网关到订单服务、再到支付服务和库存服务的完整调用链路,快速定位性能瓶颈和故障点。
Kiali作为ASM的可视化控制台,提供了服务拓扑图、配置验证和健康检查功能。通过监控网络流量来推断服务间的依赖关系,自动生成服务调用拓扑,并以图形的形式呈现服务间的通信关系和流量状态。当一个服务的某些实例处于不健康状态时,Kiali拓扑图中会实时以红色高亮显示,极大提升了运维的直观性和效率。
日志服务方面,ASM与腾讯云日志服务CLS无缝集成,Envoy的访问日志可以自动采集到CLS中进行全文检索和可视化分析。用户可以根据需要配置日志采样率和日志格式,平衡可观测性需求和存储成本。
七、多集群高可用与跨地域容灾架构
对于追求高可用性的微服务架构网站,跨多集群部署是常见做法。ASM的多集群网格能力使得应用可以同时部署在多个Kubernetes集群中,并获得统一的流量管理和服务发现视角。这种架构可以显著提升应用的可用性、可扩展性和容错能力。
在灾难恢复场景下,如果某个地域的集群发生故障,ASM能够自动感知故障并将流量切换到其他正常集群。结合全局负载均衡和DNS智能解析,可以实现同城双活和两地三中心的多活架构。具体而言,通过在多个地理位置部署Kubernetes集群和ASM网关,配合云解析DNS和全局流量管理GTM,实现地域级故障的自动检测与流量转移,确保业务连续性和高可用性。
配置跨地域容灾的要点包括:将多个集群加入同一个ASM网格,配置服务级别的故障转移策略,通过DestinationRule的localityLbSetting指定优先级和故障转移目标。当本地优先级的后端全部不可用时,流量会自动转移到备选地域的实例。
八、服务网格的实践案例与代码示例
为了帮助读者更好地理解ASM的实际应用,这里提供一个完整的电商微服务网站接入网格的实战示例。假设电商网站由以下服务组成:前端Web服务、商品服务、订单服务、支付服务、库存服务。每个服务部署为Deployment,通过Service暴露访问入口。
8.1 创建网格并接入TKE集群
首先在ASM控制台创建一个新的服务网格实例,选择目标TKE集群并建立关联。创建完成后,为需要治理的命名空间启用Sidecar自动注入,例如电商业务部署在ecommerce命名空间:
kubectl label namespace ecommerce istio-injection=enabled8.2 部署微服务并验证Sidecar注入
部署一个示例订单服务,使用Python Flask编写:
from flask import Flask, jsonify
import os
app = Flask(__name__)
@app.route('/order/info')
def order_info():
return jsonify({
'service': 'order-service',
'version': os.getenv('VERSION', 'v1'),
'status': 'running'
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)对应的Deployment YAML定义:
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service-v1
namespace: ecommerce
spec:
replicas: 3
selector:
matchLabels:
app: order-service
version: v1
template:
metadata:
labels:
app: order-service
version: v1
spec:
containers:
- name: order-container
image: order-service:v1
ports:
- containerPort: 8080
env:
- name: VERSION
value: v1部署完成后,查看Pod状态,每个Pod中应该有两个Container:order-container和istio-proxy,后者就是自动注入的Envoy Sidecar。
8.3 配置入口网关与路由规则
部署一个入口网关接收外部流量,并通过VirtualService将请求路由到前端服务:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: ecommerce-gateway
namespace: ecommerce
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "ecommerce.example.com"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: frontend-vs
namespace: ecommerce
spec:
hosts:
- "ecommerce.example.com"
gateways:
- ecommerce-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: frontend-service
port:
number: 80至此,电商微服务网站已经完整接入ASM,具备完整的流量治理、安全管控和可观测性能力。
九、成本评估与自建Istio对比优势
企业采用服务网格方案时,成本是重要考量因素。ASM的计费方式为按量计费,从网格中集群个数和Sidecar个数两个维度收取费用。集群管理费按每个集群每小时1.57元收取,以每个小时整点的有效集群数为准。每个网格还提供100个免费数据面额度(包括Sidecar和边缘代理网关),超过100个之后,每个Sidecar每小时收取0.00481元,计费的数据面个数为所有Sidecar总在线小时数之和。
以一个典型的中型电商网站为例:包含2个TKE集群,每个集群有150个开启Sidecar的Pod,总Sidecar数量300个。月度费用计算为:集群部分1.57×24×30×2=2260.8元,Sidecar部分200×0.00481×24×30=692.64元,总费用约2953.44元。相比自建Istio所需的控制面服务器资源、运维人力成本和升级风险,托管ASM的综合成本优势明显。
相比自建Istio,ASM的核心优势包括:控制面全托管免运维、内置性能优化和eBPF加速、与腾讯云基础设施无缝集成、开箱即用的可观测性组件、企业级SLA保障、跨多集群一致的CRD管理体验。企业可以将精力聚焦于业务本身而非服务网格基础设施的维护,这正是ASM区别于自建方案的最大价值所在。
十、问答环节
问题1:ASM是否支持不重启Pod的情况下更新Sidecar配置?
支持。ASM提供了Sidecar热升级特性,可以在不重启业务容器的情况下对Envoy代理进行版本升级和配置刷新,业务流量无感知。
问题2:跨多个VPC的集群可以加入同一个ASM网格吗?
可以。ASM支持通过云企业网CCN打通不同VPC和地域的网络连接,实现跨VPC和跨地域的多集群统一管理。
问题3:ASM中如何实现基于用户ID的灰度路由?
通过在VirtualService中配置基于HTTP Header的匹配规则实现。例如,若请求Header中包含x-user-id且值为特定范围,则路由到灰度版本子集。
问题4:ASM是否支持gRPC协议的流量管理?
支持。ASM完全兼容Istio,原生支持gRPC协议的路由、负载均衡、重试、超时和故障注入等治理能力。
问题5:如果业务服务尚未容器化,可以接入ASM吗?
可以。ASM支持虚拟机负载的注册接入,虚拟机中运行的服务只要通过ServiceEntry注册到网格,即可纳入服务发现和流量治理体系。
问题6:ASM中的证书管理是如何实现的?
ASM使用Istio的Citadel组件自动管理mTLS证书的签发、轮换和撤销,证书轮换过程无需重启Pod,业务完全无感知。




