运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139885874
HuaWei:https://bbs.huaweicloud.com/blogs/429596
【介绍】:本文介绍应用服务网格的灰度发布中的基础知识,整理自华为微认证课程的学习总结笔记和相关开源技术GitHab/官网介绍。
在传统软件升级过程中,新版软件一旦发布,所有用户都会升级到新版本。这种做法存在一定风险:
-
新版软件可能存在未被发现的缺陷或兼容性问题,一旦大规模升级可能影响所有用户的使用体验。
-
用户可能不习惯新版本的界面设计和功能改动,升级后反而降低了满意度。
-
如果新版本出现严重问题需要回退,影响范围会很大。
因此,在软件升级时需要更加谨慎,降低升级风险,避免对用户体验造成骤降。
灰度发布是一种软件升级方式,可以最大限度降低升级风险,平滑过渡到新版本。其基本思路是将新版本先发布给一小部分用户,称为"灰度用户",收集使用反馈后再逐步扩大范围,最终实现全量升级。
灰度发布的别名叫”金丝雀发布(Canary Release)“,源自以前矿井工人携带金丝雀下矿井的做法。由于金丝雀对瓦斯等有毒气体很敏感,矿工可以通过观察金丝雀的健康状况来判断瓦斯浓度是否安全。
类似的,在软件灰度发布中,先给一部分”金丝雀“用户升级新版本,根据他们的使用反馈来评估新版本的可用性,避免影响全部用户。
灰度发布可以定义为:
在保证系统整体稳定运行的前提下,控制新版本影响范围和发布节奏,逐步替换旧版本的一种软件上线部署方式。
其特点包括:
-
可控影响范围:先发布给少量用户,再逐步扩大范围。
-
渐进式发布:版本升级是一个渐进平滑的过程,非一次性事件。
-
用户无感知:用户不需要主动选择版本,升级过程是透明的。
-
可随时回退:一旦发现问题,可随时终止发布并回退版本。
通过灰度发布,可以在不影响整体系统稳定性的情况下,平稳完成软件新老版本的升级替换。这对于业务连续性要求高、升级风险敏感的系统尤为重要。
灰度发布是一个循序渐进、可控可回退的软件升级过程。本小节先通过一个具体的案例来展示灰度发布的典型流程,然后总结出灰度发布的关键步骤。
假设某宝App的一次大版本升级,其灰度发布流程如下:
-
挑选灰度用户:先在浙江地区随机挑选1%的用户作为灰度用户,避开大促时段。
-
发布灰度版本:为这1%用户推送新版App,同时后台系统也要同步升级,保证前后端匹配。
-
监控和分析:密切监控灰度用户的客户端崩溃率、启动耗时、交易转化率等关键指标,并收集用户反馈。
-
评估决策:若灰度效果不理想,则终止发布,修复问题后重新灰度;若效果理想,则逐步扩大灰度范围。
-
分批扩大范围:先扩大到5%用户,然后是20%,50%,直至覆盖所有用户,过程中持续监控和评估。
-
全量发布:待新版本稳定运行一段时间后,即可下线旧版,完成整个灰度发布过程。
从某宝的案例可以看出,灰度发布是一个谨慎、渐进的过程,通过小范围试错来降低新版本的升级风险,并根据实际效果来决定是否继续推进。这种发布模式尤其适合体量大、升级风险高的互联网应用。
灰度发布能够控制变更风险,尽早发现问题,灵活调整策略,是一种成熟可靠的发布方式。一个典型的灰度发布流程通常包括以下7个步骤:
-
制定计划:确定发布时间、灰度策略、回滚机制等,做好充分准备。
-
部署新版本:在生产环境中部署新版本,但暂不对外提供服务。
-
选择灰度用户:根据灰度策略选择初始灰度用户,如按地域、用户属性、流量比例等。
-
灰度发布:将部分流量导入新版本,开始小流量验证新版本。
-
监控与评估:密切监控灰度指标,包括技术指标和业务指标,并根据监控结果决定后续步骤。
-
调整灰度规模:如果灰度效果理想,可逐步扩大灰度流量,直至全量;如果出现问题,则及时回滚。
-
全量上线:灰度完成后,将所有流量切到新版本,再下线旧版本,完成本次发布。
不过需要指出的是,传统的灰度发布方式也存在一些局限性,下一节将介绍这些局限性。
尽管灰度发布是一种成熟的发布方式,但传统的实现方法存在一些缺点。
在传统的灰度发布中,灰度逻辑通常会侵入到应用代码中。例如:
if (isGrayUser(userId)) {
// 灰度版本的逻辑
} else {
// 稳定版本的逻辑
}
这种侵入性的灰度逻辑会增加代码的复杂度,降低可维护性。同时,每次灰度发布都需要修改代码,发布效率低。
为了支持灰度发布,传统做法通常是搭建多套生产环境,如灰度环境和稳定环境。这种方式存在以下问题:
-
硬件和维护成本高,需要更多的服务器和运维投入。
-
环境管理复杂,不同环境的配置和代码可能不一致,增加了维护难度。
-
资源利用率低,灰度环境在非发布期间可能闲置浪费。
综上,传统的灰度发布虽然能够降低风险,但实施成本较高。为了克服这些局限性,业界提出了基于应用服务网格(ASM)的新型灰度发布方案。ASM通过服务代理实现灰度逻辑和流量控制,无需侵入应用代码,也不需要多套物理环境,从而显著降低了灰度发布的复杂度和成本。下一章将重点介绍ASM的原理和优势。
应用服务网格(Application Service Mesh,ASM)是一种新兴的微服务架构,它通过将服务治理能力下沉到基础设施层,提供了一种更加高效、可靠、安全的服务通信和管理方式。本节将从定义、功能和优势三个方面对ASM进行概述。
ASM是一个专用的基础设施层,用于处理服务间的通信、管理服务的行为。它与应用程序代码分离,以额外的进程形式伴随应用部署,接管服务间的网络调用。
从逻辑上看,ASM位于应用程序和底层平台之间:
+-------------------------------------+
| 应用程序服务 |
+-------------------------------------+
| 应用服务网格(ASM) |
+-------------------------------------+
| 基础设施(如Kubernetes) |
+-------------------------------------+
ASM实际上是一个分布式代理网络,每个服务实例旁都会部署一个代理(如Envoy),服务间的调用都要经由代理,代理负责服务发现、路由、负载均衡、限流熔断、安全认证、监控追踪等治理功能。同时,所有代理都由一个集中的控制面(Control Plane)来配置和管理。
这种将服务治理下沉到基础设施的sidecar代理模式,使得ASM可以在不侵入业务代码的前提下,实现对服务行为的细粒度控制,极大降低了微服务架构的复杂度。
ASM作为一个独立的中间层,提供了一系列开箱即用的服务治理功能,主要包括:
- 服务发现:自动维护服务注册表,动态感知服务的变化。
- 智能路由:支持多种路由规则,如基于版本、权重的流量切分。
- 负载均衡:提供多种负载均衡策略,自动剔除不健康节点。
- 弹性能力:提供超时、重试、熔断、限流等弹性机制。
- 安全加密:提供服务间的身份认证和通信加密。
- 可观测性:提供调用指标采集、分布式追踪、日志收集等可观测性手段。
- 灰度发布:支持按流量比例、HTTP头等规则将流量导入不同版本服务。
这些功能使得ASM成为微服务架构的重要基础设施,大大简化了服务治理的实现。应用开发者只需关注业务逻辑,而将服务通信、运维、监控等非功能性需求交由ASM处理。
相比传统的微服务架构,基于ASM的微服务架构具有以下优势:
- 解耦业务逻辑和服务治理,降低了微服务的复杂度。
- 无侵入、可移植,不需要修改业务代码,对应用透明。
- 流量治理更加灵活,支持细粒度的流量控制和灰度发布。
- 可观测性更强,提供统一的指标监控、调用链追踪和日志分析。
- 故障隔离性更好,避免局部故障扩散,提高系统的整体可用性。
- 安全性更高,提供服务认证、鉴权和加密通信等安全措施。
- 扩展性更强,可以方便地接入第三方服务,如负载均衡、消息队列等。
ASM通过将服务治理下沉到基础设施层,提供了一种更加高效、灵活、可靠的微服务架构方案。它极大地简化了微服务的开发和运维,使得开发人员可以更加专注于业务逻辑,从而加速微服务应用的落地和迭代。
当前,以Istio为代表的Service Mesh已经成为业界的主流选择。而华为云的应用服务网格(ASM)产品,则是基于Istio强化和优化后的企业级商用版本。它与华为云的容器平台CCE深度集成,提供了更加易用、高效、安全的服务网格能力,成为众多企业微服务转型和云原生升级的利器。
在下一节,我们将进一步介绍Istio和Kubernetes这两个ASM的关键组件,以帮助读者更好地理解ASM的原理和生态。
要理解应用服务网格(ASM)的原理和优势,首先需要了解其底层依赖的两个关键技术:服务网格Istio和容器编排平台Kubernetes。本节将分别介绍Istio和Kubernetes的基本概念、主要功能和技术特点。
Istio是一个开源的服务网格(Service Mesh)平台,由Google、IBM和Lyft联合开发,于2017年开源。它提供了一种透明且语言无关的方式来实现微服务的可观察性、流量管理、安全性和可移植性。
Istio为微服务提供了以下关键功能:
-
流量管理:
- 动态路由:根据流量策略动态调整服务间的流量分配,如按版本、按权重分流。
- 弹性能力:超时、重试、熔断、故障注入等。
- 流量镜像:将实时流量的副本发送到镜像服务,用于调试和测试。
-
可观察性:
- 调用链追踪(Tracing):跟踪分布式服务间的调用链。
- 监控指标:如服务的调用量、延迟、成功率等。
- 日志收集:收集服务的访问日志、错误日志等。
-
安全性:
- 服务间认证:支持JWT、mTLS等身份认证方式。
- 访问控制:细粒度的基于角色(RBAC)的访问控制。
- 通信加密:服务间通信支持TLS加密。
Istio通过在服务间部署一组轻量级网络代理(Sidecar),实现了上述功能,而无需侵入服务代码。Sidecar代理拦截进出服务的流量,并根据控制平面下发的策略执行相应的流量管理、监控追踪和安全控制逻辑。
Kubernetes(k8s)是一个开源的容器编排平台,最初由Google开发,于2014年开源并捐赠给CNCF基金会。它提供了一个可移植、可扩展、高可用的平台,用于自动化部署、伸缩和管理容器化应用。
Kubernetes的主要功能包括:
-
服务发现和负载均衡:可以使用DNS名称或自己的IP地址公开容器,如果到容器的流量很大,Kubernetes可以负载均衡并分配网络流量。
-
存储编排:自动挂载所选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚:可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态。
-
自动完成装箱计算:根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工作负载,以提高资源利用率并节省资源。
-
自我修复:重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
-
配置管理:允许存储和管理敏感信息,例如密码、OAuth令牌和ssh密钥。可以在不重建容器映像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes提供了一个声明式的API来管理应用,用户通过YAML文件来定义应用的期望状态,如副本数、资源配额、访问策略等,Kubernetes则负责在集群中维持该状态。这种"期望状态"管理模式简化了应用的运维,提高了发布效率。
此外,Kubernetes还有一个重要的概念是Pod。Pod是Kubernetes中最小的可部署单元,它由一个或多个容器组成,共享存储和网络空间。Pod是短暂的,随时可能被销毁和重建。Kubernetes使用Pod来实现应用的弹性伸缩、故障恢复和滚动升级等功能。
总的来说,Kubernetes通过声明式API、Pod等概念,提供了一个自动化的容器编排平台,极大地简化了应用的部署、伸缩和管理。而Istio则专注于提供服务网格能力,与Kubernetes形成互补。下一节将介绍Istio和Kubernetes的关系。
Istio和Kubernetes是两个独立的开源项目,但它们在微服务领域形成了紧密的互补关系。
一方面,Istio依赖Kubernetes来编排和管理其组件。Istio控制平面和数据平面的组件都是以Pod的形式部署在Kubernetes集群中的。Istio需要使用Kubernetes的服务发现、容器编排、故障恢复等能力来维护自身的高可用性。同时,Istio也通过向Pod注入Sidecar代理的方式,将流量管理等功能无缝集成到Kubernetes应用中。
另一方面,Istio为Kubernetes应用提供了重要的服务网格能力,弥补了Kubernetes在微服务治理方面的不足。例如,Kubernetes的服务(Service)只提供了简单的负载均衡,而Istio可以实现细粒度的流量管理,如按版本分流、故障注入等。Kubernetes缺乏分布式追踪和监控指标收集,而Istio可以提供调用链追踪、监控指标等可观察性功能。Kubernetes没有服务间认证和加密的机制,而Istio可以提供mTLS加密和基于角色的访问控制等安全特性。
因此,Istio和Kubernetes的组合,提供了一个全面的微服务平台:
- Kubernetes负责应用的生命周期管理、资源调度、弹性伸缩、自愈等。
- Istio负责服务间的流量管理、可观察性、安全性等。
这种"Kubernetes+Istio"的架构,已经成为业界构建生产级微服务平台的标准配置。华为云的容器服务(CCE)和应用服务网格(ASM),就是基于Kubernetes和Istio打造的托管服务,使用户可以便捷地构建和管理微服务应用,下一节将对CCE做进一步介绍。
云容器引擎(Cloud Container Engine,CCE)是云服务供应商提供的高可靠高性能的企业级容器管理服务,支持Kubernetes和Docker等主流的容器技术。CCE简化了用户创建和管理容器化应用的过程,集成了华为云的计算、存储、网络等资源,提供了全生命周期的容器服务。
-
兼容原生Kubernetes:完全兼容原生Kubernetes API,支持使用kubectl等原生工具管理。
-
高可靠高性能:基于华为云可靠的云服务器、云硬盘等基础设施,提供高可靠高性能的容器运行环境。
-
安全隔离:支持VPC网络隔离、容器隔离等多层次安全防护,保障容器应用和数据的安全。
-
简单易用:提供图形化界面和命令行工具,简化容器集群的创建、管理和监控。
-
丰富的应用市场:集成了Docker Hub、华为云容器镜像服务等主流镜像仓库,提供了大量的预置应用模板。
-
灵活的计费方式:支持包年包月和按需计费两种模式,可根据实际需求灵活选择。
CCE适用于各种容器化应用的部署和管理场景,例如:
-
微服务架构:使用CCE部署和管理微服务应用,利用容器的快速启动和隔离特性,实现服务的敏捷开发和独立部署。
-
DevOps持续交付:集成Jenkins等CI/CD工具,实现代码提交到部署的自动化流程。
-
应用弹性伸缩:根据应用负载情况自动调整容器实例数量,提高资源利用率。
-
混合云部署:支持多云和本地数据中心的统一纳管,实现应用在不同环境间的无缝迁移。
-
大数据应用:运行Spark、Hadoop等大数据处理框架,利用容器的快速部署和弹性伸缩能力,提高作业的执行效率。
CCE作为核心服务,与其他云服务形成了紧密的生态集成,例如:
- 与云监控服务集成,提供容器级别的监控告警。
- 与云日志服务集成,提供容器日志的采集、存储和分析。
- 与云解析服务集成,为容器应用提供灵活的域名解析能力。
- 与应用服务网格(ASM)集成,提供服务网格治理能力。
其中,CCE与ASM的集成尤为重要。ASM补齐了CCE在微服务领域的短板,提供了流量管理、服务监控、安全防护等关键能力。用户可以在CCE上一键部署ASM,实现容器应用的全生命周期管理和服务治理。下一节将重点介绍ASM的架构原理。
ASM 采用了控制平面和数据平面分离的架构设计,以实现灵活的流量管理和策略控制。
控制平面负责管理和配置整个服务网格,包括服务注册、服务发现、流量规则下发等。它由一组用于管理代理的组件组成,这些组件通过 API 下发策略和配置,并从代理接收遥测数据。控制平面通常包括以下关键组件:
-
Pilot:负责服务发现、流量管理和智能路由。Pilot 接收控制面的流量规则,将其转换为 Envoy 可以理解的配置,再下发到数据平面的代理。
-
Mixer:负责策略控制和遥测收集。Mixer 从代理接收遥测数据,并根据控制面下发的策略对请求进行访问控制、配额管理等。
-
Citadel:负责服务间身份和证书管理。Citadel 为服务颁发证书,实现服务间的双向 TLS 认证。
-
Galley:负责配置校验和分发。Galley 对控制面收到的配置进行校验,再将其分发到其他控制平面组件。
控制平面通过 xDS 协议(如 LDS、RDS、CDS、EDS 等)将流量规则、策略、证书等动态下发到数据平面的代理,实现配置的实时更新。同时,控制平面也监听代理上报的服务发现、负载等信息,以调整流量策略。
数据平面由一组智能代理(Sidecar Proxy)组成,它们与服务实例一起部署,接管进出服务的流量。数据平面代理的职责包括:
-
服务发现:动态感知服务实例的变化。
-
健康检查:检测后端服务实例的健康状态。
-
负载均衡:根据负载均衡算法选择后端服务实例。
-
流量路由:根据控制平面下发的路由规则转发流量。
-
安全通信:与其他代理或服务建立加密连接。
-
可观测性:收集和上报流量指标、日志、调用链等。
ASM 中最常用的数据平面代理是 Envoy,它是一个高性能、可扩展的 C++ 网络代理。Envoy 提供了动态服务发现、负载均衡、TLS 终止、HTTP/2 & gRPC 代理、熔断、健康检查、基于百分比流量拆分的分阶段发布等功能。
控制平面和数据平面的分离,使得 ASM 可以独立升级控制平面,而不影响数据平面的流量转发。这种解耦提高了 ASM 的灵活性和可维护性。数据平面代理在转发流量的同时,还执行控制平面下发的流量规则和策略,实现了应用层流量管理。
Sidecar模式是ASM实现服务治理的核心机制。它将服务治理功能从应用程序中剥离出来,由一个独立的代理程序(即Sidecar容器)来承载。Sidecar与应用容器部署在同一个Pod中,并拦截进出应用的所有流量。
在Kubernetes中部署ASM时,会在每个Pod中注入一个Sidecar容器,如下图所示:
+-------------------------+
| Pod |
| +------------------+ |
| | 应用容器 | |
| | | |
| +------------------+ |
| |
| +------------------+ |
| | Sidecar容器 | |
| | | |
| +------------------+ |
+-------------------------+
Sidecar容器通常使用Envoy等高性能的代理组件,它监听特定的端口,如15000端口。而应用容器的流量则被配置为通过localhost的15000端口来发送和接收。这样一来,Sidecar就能拦截应用的所有入口和出口流量。
当流量进入Pod时,它首先被Sidecar拦截。Sidecar根据从控制平面(如Pilot)获取的路由规则和策略,对流量进行处理,如路由、负载均衡、限流等。处理后的流量再转发给应用容器处理。
而当应用容器需要向外发送请求时,它首先将请求发送给Sidecar。Sidecar同样根据控制平面下发的规则对请求进行处理,如负载均衡、断路、重试等。处理后的请求再由Sidecar转发出去。
整个过程如下图所示:
+----------+ +-----------+
| Sidecar | | 应用容器 |
| | | |
--->| Envoy |---------->| Tomcat |
| |<----------| |
+----------+ +-----------+
这种Sidecar代理模式的优点是:
- 无侵入:应用程序无需任何修改,就可以获得服务治理能力。
- 语言无关:Sidecar与应用程序的语言和框架无关,可以用于任何应用。
- 独立升级:Sidecar与应用分离,可以独立升级,降低升级风险。
- 可移植:Sidecar屏蔽了底层平台的差异,提供了统一的服务治理接口。
Sidecar代理的配置由ASM的控制平面(如Pilot)统一管理。控制平面将路由规则、策略等配置,以xDS协议(如LDS、RDS、CDS、EDS)下发给各个Sidecar代理。Sidecar获得配置后,动态更新自己的路由表和策略,以执行相应的流量管理逻辑。
同时,Sidecar也收集应用的流量指标和调用数据,上报给控制平面,实现了集中式的监控和追踪。这种配置下发和数据收集的过程:
+--------------------+ +------------------+
| 控制平面 | | 数据平面 |
| | xDS | |
| +-------------+ | ---------> | +-----------+ |
| | Pilot | | | | Sidecar | |
| +-------------+ | <--------- | +-----------+ |
| | 指标数据 | |
+--------------------+ +------------------+
通过这种方式,ASM实现了对服务网格的集中控制和实时监控,而无需修改应用代码。这大大降低了微服务治理的复杂度。
引入Sidecar容器会带来一定的资源开销,主要包括:
- CPU和内存:每个Sidecar容器需要占用一定的CPU和内存资源。
- 网络延迟:流量需要经过Sidecar的转发,会引入微小的网络延迟。
- 部署复杂度:需要对每个应用Pod进行Sidecar注入,增加了部署复杂度。
但总的来说,Sidecar带来的开销是可以接受的,尤其是与它提供的服务治理能力相比。而且,可以通过调整Sidecar的资源配额、连接池等参数来优化性能,将开销降到最低。
此外,一些轻量级的Sidecar实现,如Google的PROXYLESS gRPC,可以避免为每个应用部署Sidecar,而是直接将治理逻辑以库的形式链接到应用中,从而降低了资源占用。但这种方式侵入性较强,不如独立的Sidecar容器灵活。
概括一下:Sidecar模式是ASM的核心机制,它以一种无侵入、可移植的方式实现了微服务的流量管理、可观测性和安全性。尽管引入了一定的复杂度和开销,但与传统的SDK集成相比,Sidecar模式是目前最灵活和可扩展的服务治理方案。
ASM作为一个完整的服务网格解决方案,包含了多个关键组件,它们分工协作,共同提供了服务发现、智能路由、流量管理、策略执行和安全防护等一系列功能。下面我们就来看看ASM的4个核心组件:Pilot、Mixer、Citadel和Galley。
Pilot是Istio的核心组件之一,充当服务网格的控制平面,负责管理和配置部署在网格中的Envoy代理实例。
具体来说,Pilot的功能包括:
-
服务发现:Pilot使用平台特定的服务发现机制(如Kubernetes的API Server)来查找服务注册表中的服务实例。
-
流量管理:Pilot将高级路由规则转换为Envoy特定的配置,并动态更新Envoy代理的路由规则。这样,Pilot就可以控制服务之间的流量,实现灰度发布、AB测试等功能。
-
弹性功能:Pilot为Envoy提供了超时、重试、熔断等弹性配置,提高了服务的容错性和稳定性。
-
服务健康检查:Pilot从Envoy代理收集服务的健康状况,并将不健康的服务实例从负载均衡池中移除。
可以看到,Pilot通过与Envoy代理的交互,实现了服务发现、流量控制等关键功能,是Istio的流量管理器。Pilot让运维人员可以通过简单的配置来控制服务间的流量,而无需修改服务代码。
Mixer是Istio的另一个核心组件,负责在服务网格中执行访问控制和使用策略。Mixer独立于Envoy代理,可提供灵活的插件模型,方便扩展和集成自定义的后端。
Mixer的主要功能包括:
-
前置条件检查:Mixer可以对请求执行前置条件检查,如身份验证、授权等,并拒绝不符合条件的请求。
-
配额管理:Mixer可以对服务的访问配额进行限制,如限制每秒的请求数、CPU使用量等。
-
遥测数据收集:Mixer负责从Envoy代理收集遥测数据,如请求日志、监控指标等,并将其发送到后端的监控系统。
-
策略评估:Mixer根据制定的访问控制策略对请求进行评估,并返回是否允许请求继续。
Mixer让Istio的策略执行和遥测收集变得高度可配置和可扩展。通过Mixer,可以实现灵活的访问控制、限流、计费等功能,并且可以对接各种监控后端,实现对服务网格的可观察性。
Citadel是Istio的安全组件,负责在服务网格中提供身份和凭证管理。
Citadel的核心功能包括:
-
身份供给:Citadel为网格中的每个服务实例提供强大的身份,以实现服务到服务以及最终用户到服务的身份验证。
-
证书管理:Citadel负责自动化密钥和证书轮换,为每个服务实例生成证书,并将其分发给Envoy代理。这为服务间通信提供了双向TLS认证。
-
凭证管理:Citadel将服务认证机制从应用层移动到服务网格基础架构中。应用程序无需管理自己的凭证,Citadel会自动为服务生成身份和凭证。
通过Citadel,Istio可以在服务网格内提供全面的安全防护,包括服务身份验证、加密通信、基于角色的访问控制等。Citadel使得服务间的通信更加安全可靠,而无需修改服务代码。
Galley是Istio的配置校验和分发组件,它在Istio1.1版本中引入,负责对Istio的配置文件进行校验、处理和分发。
Galley的主要功能包括:
-
配置校验:Galley对Istio的各种资源配置(如虚拟服务、目标规则等)进行语法和语义校验,确保配置的正确性。
-
配置处理:Galley将通过校验的配置转换为适合下游组件(如Pilot)使用的格式。
-
配置分发:Galley将处理后的配置分发给相应的下游组件,如将路由配置分发给Pilot。
-
配置存储:Galley将Istio的配置存储在一个统一的配置存储中,供其他组件订阅和使用。
通过Galley,Istio实现了配置的集中式管理和分发。Galley对配置进行了校验和处理,降低了配置错误的风险。同时,Galley作为配置的统一分发点,简化了其他组件的配置管理。
总的来说,Pilot、Mixer、Citadel和Galley这4个组件分别负责流量管理、策略控制、安全防护和配置管理,构成了Istio服务网格的核心,为微服务应用提供了全方位的服务治理能力。在实际的应用服务网格(ASM)产品中,华为云在Istio的基础上进行了增强和优化,使其更加易用和高效。
应用服务网格(ASM)提供了强大的流量管理能力,可以支持多种灰度发布策略。本节将重点介绍ASM支持的3种主要灰度发布类型:金丝雀发布、蓝绿发布和AB测试。
金丝雀发布,也称灰度发布,是一种增量式发布策略,是当前应用灰度发布的主流方式。其基本思路是先将一小部分实际流量引入新版本进行测试,待验证没问题后再逐步扩大范围,最终把所有流量都迁移到新版本。
在ASM中实现金丝雀发布非常简单,只需要通过定义流量规则,将一定比例的流量路由到新版本服务即可。例如,可以先让10%的流量访问新版本,其余90%流量访问旧版本,观察一段时间后,如果新版本运行平稳,再把新版本流量比例逐步调高到20%、50%、80%,直到100%。
ASM支持根据多种规则来划分流量,如按照百分比、请求内容、客户端版本等,可以灵活地控制金丝雀发布的范围和节奏,并在过程中随时调整流量规则。
金丝雀发布的优点是风险可控,用户影响小。一旦发现问题,可以快速切回旧版本,同时放量速度也比较敏捷。但其缺点是发布周期较长,而且新旧版本会长时间同时运行,资源消耗大。
蓝绿发布是一种非增量式的发布策略,又称红黑发布(Red-Black Release)。其实现方式是在生产环境中同时部署两个版本:旧版本(称为蓝色版)和新版本(称为绿色版),两个版本都有自己的服务和数据库等资源。在切换流量时,先将旧版本的流量逐步切到新版本,直到新版本承载100%流量,再下线旧版本。
蓝绿发布的切换过程非常快,对用户是透明的。新版本一旦就绪,所有用户都可以快速升级,因此适合对系统可用性要求高的场景。
在ASM中实现蓝绿发布,需要先把新版本的服务部署到与旧版本并行的生产环境中,再通过ASM的VirtualService定义流量规则,将指向旧版本的流量逐步切换到新版本。一旦切换完成,就可以下线旧版本,回收资源。
蓝绿发布的优点是用户切换快,系统停机时间短,回滚也比较方便。但其缺点是需要两倍以上的资源,而且数据库切换比较复杂,通常需要单独处理。此外,蓝绿发布不能分批验证,一旦新版本有问题,影响范围会比较大。
AB测试是一种对比实验式的发布策略,主要用于评估两个版本的效果差异。与金丝雀发布和蓝绿发布不同,AB测试的重点不是安全地发布新版本,而是通过科学的实验设计和统计分析,来比较两个版本在关键指标上的表现,从而指导产品优化和决策。
在AB测试中,需要将用户流量分成两个或多个对等分组,每组用户访问不同的版本,收集一段时间的数据后,通过统计检验等方法分析各版本的效果差异,验证优化假设。
ASM可以方便地实现AB测试。首先,同时部署多个版本的服务;然后,通过定义流量规则,按照某种策略(如随机、权重、用户特征等)将流量分配到不同版本;最后,对各版本的关键指标进行采集和分析,得出优化结论。
例如,一个电商网站优化了推荐算法,想评估新算法的效果。可以使用ASM按 90%:10% 的比例将流量随机分配到新旧两个算法,观察一周后,分析比较两组用户的转化率、客单价等指标,若新算法效果显著更优,则可以全量上线新版本。
AB测试的优点是可以在线上环境进行受控实验,获得真实用户反馈,降低决策风险。但其缺点是实验周期较长,而且需要较大流量才能得到统计显著的结论,因此更适合大流量应用。
综上,金丝雀发布、蓝绿发布和AB测试是ASM支持的三种主要灰度策略,各有特点和适用场景。在实际的系统升级和优化中,可以根据需求灵活选择,也可以将它们组合使用,以达到安全、高效、可控地发布和验证新版本的目的。
下一节,我们将进一步介绍ASM灰度发布的流量规则,即如何根据不同的请求属性来划分和路由流量。
ASM的一大优势是支持多种灵活的流量划分规则,可以根据不同的请求属性将流量路由到不同版本的服务。常见的灰度规则包括基于HTTP Header、Cookie、操作系统和浏览器、源IP等。下面我们来分别介绍这几类规则。
HTTP Header是HTTP请求中的头部字段,包含了关于请求的元数据,如User-Agent、Accept、Cookie等。ASM可以根据请求的HTTP Header来划分流量。
例如,我们可以在请求头中自定义一个X-Canary
字段,当X-Canary
的值为true
时,将请求路由到新版本服务,否则路由到旧版本。这个规则可以用Istio的VirtualService来表示:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- name: canary-release
match:
- headers:
X-Canary:
exact: "true"
route:
- destination:
host: my-service-v2
- route:
- destination:
host: my-service-v1
这个VirtualService定义了两条路由规则:
- 如果请求头中
X-Canary
的值等于"true"
,则将请求路由到my-service-v2
,即新版本服务。 - 其他请求默认路由到
my-service-v1
,即旧版本服务。
通过在请求头中设置X-Canary
字段,就可以灵活地控制哪些请求访问新版本。这种方式适合内部测试或者Beta用户试用等场景。
Cookie是一种在浏览器中存储的用户身份信息,常用于记录用户登录态、偏好设置等。ASM支持根据请求的Cookie来划分流量。
例如,我们可以在Cookie中设置一个user_group
字段,当user_group
的值为beta
时,将请求路由到新版本,否则路由到旧版本。相应的VirtualService定义如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- name: canary-release
match:
- headers:
Cookie:
regex: "^(.*?; )?user_group=beta(;.*)?$"
route:
- destination:
host: my-service-v2
- route:
- destination:
host: my-service-v1
这里的匹配规则使用了正则表达式,当Cookie中包含user_group=beta
时,就将请求路由到新版本my-service-v2
。
基于Cookie的灰度发布适合根据用户属性(如会员等级、地域等)来划分流量,可以将某些特定用户群体引入到新版本服务。但要注意Cookie的安全性,防止被恶意篡改。
ASM还可以根据请求的User-Agent头来识别操作系统和浏览器,进而划分流量。这在移动端应用或者浏览器兼容性测试时非常有用。
例如,我们想将Android用户的请求导入新版本服务,而iOS用户仍然访问旧版本。可以定义如下规则:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- name: canary-release
match:
- headers:
User-Agent:
regex: ".*Android.*"
route:
- destination:
host: my-service-v2
- route:
- destination:
host: my-service-v1
当User-Agent头匹配".*Android.*"
正则表达式时,请求会被路由到my-service-v2
。类似地,我们可以根据浏览器类型(如Chrome、Firefox、Safari等)来划分流量。
在某些场景下,我们可能想根据请求的来源IP来划分流量,如只对公司内网IP开放新版本服务。ASM支持根据源IP或IP段来制定路由规则。
例如,只将来自10.0.0.0/8
网段的请求导入新版本:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- name: canary-release
match:
- sourceLabels:
app: 10.0.0.0/8
route:
- destination:
host: my-service-v2
- route:
- destination:
host: my-service-v1
这里使用了sourceLabels
字段来匹配源IP。当请求IP属于10.0.0.0/8
网段时,请求被路由到新版本服务。
基于源IP的灰度规则适用于内部系统的升级测试,通过将新版本服务只暴露给特定IP范围,可以降低升级风险。但在公有云或者经过NAT网关的环境中,这种方式的可靠性可能会下降。
以上就是ASM支持的几种典型的灰度发布流量规则。这些规则可以单独使用,也可以组合使用,以匹配不同的业务场景需求。ASM提供了声明式的DSL(如Istio的VirtualService)来定义这些规则,使得灰度发布策略的配置和管理变得简单灵活。
同时,这些规则都是在服务网格的数据平面(如Envoy代理)实施的,无需修改应用程序代码,因此适用于各种异构的微服务环境。通过细粒度的流量控制,ASM让灰度发布变得更加可控和安全,大大降低了服务升级的风险。
ASM为灰度发布提供了一套完整的解决方案,相比传统的灰度发布方式,具有以下几个显著优势:
传统的灰度发布通常需要在应用程序中嵌入SDK或者代理,与业务逻辑耦合,侵入性强。而ASM采用Sidecar模式,将灰度逻辑移入独立的网络代理中,与应用容器解耦,实现了无侵入的灰度发布。
应用程序不需要感知灰度发布的存在,也不需要为适配灰度规则而修改代码。这极大地降低了灰度发布的实施成本,使开发人员可以专注于业务逻辑的开发。
ASM支持为新老版本的服务独立部署和扩缩容,新版本服务可以与旧版本服务部署在不同的资源池或者集群中,实现物理隔离。这避免了新老版本服务相互影响,提高了灰度发布的稳定性。
例如,我们可以先在一个小规模的集群中部署新版本服务,对其进行充分的测试和验证。等新版本服务稳定后,再逐步扩大集群规模,并将流量切换过去。这种方式可以降低变更风险,即使新版本出现问题,也不会影响旧版本服务的可用性。
ASM提供了细粒度的流量控制能力,可以通过简单的配置(如VirtualService)来动态调整新老版本服务的流量比例。这使得灰度流量的切换变得非常便捷。
例如,我们可以先将5%的流量导入新版本服务,观察一段时间后,如果新版本运行稳定,再逐步提高流量比例到10%、20%、50%,直到完全切换到新版本。整个过程不需要重新部署服务,只需要修改流量规则即可。
而且,ASM还支持根据灰度效果自动调整流量。例如,我们可以设置一个策略,当新版本服务的错误率超过某个阈值时,自动将流量切回旧版本,避免影响用户体验。这种自动化的流量控制方式,进一步降低了灰度发布的运维成本。
ASM提供了丰富的监控指标和可视化工具,可以实时观测灰度发布的效果。通过收集新老版本服务的请求量、响应时间、错误率等指标,我们可以全面评估灰度发布的进展和风险。
例如,在Istio中,我们可以使用Prometheus和Grafana来监控服务的关键指标,当发现新版本服务的响应时间显著增加时,可以及时中断灰度,避免问题扩大。
同时,ASM还提供了分布式追踪和日志收集的能力,可以在请求层面分析新版本服务的异常行为,快速定位和解决问题。
综上,ASM为灰度发布提供了一套安全、高效、可靠的技术方案。它通过将灰度逻辑下沉到基础设施层,实现了业务代码与灰度机制的解耦,并提供了灵活的流量控制和实时监控能力,使得灰度发布变得更加简单和可控。这极大地降低了服务升级的风险,提高了发布效率,为持续交付和微服务演进提供了有力的支撑。
华为云应用服务网格(ASM)是一款全托管的服务网格产品,提供了一整套灰度发布、流量管理、服务治理、安全防护的解决方案。它基于Istio开源项目,并针对华为云环境做了增强和优化,使得用户可以便捷地在华为云上构建和管理现代化微服务应用。
接下来,我们将重点介绍华为云ASM的几大核心功能。
华为云ASM在服务连接方面提供了以下关键能力:
-
服务注册与发现:ASM集成了华为云服务注册中心(CSE),可以自动将部署在华为云容器引擎(CCE)中的微服务实例注册到ASM,并提供DNS、Kubernetes原生等多种服务发现机制,方便服务之间的相互调用。
-
负载均衡:ASM提供了灵活的负载均衡策略,包括轮询、最少连接、一致性哈希等,可以根据服务的特点选择合适的负载均衡算法。同时,ASM还支持locality load balancing,可以优先将请求转发到同一个可用区或者地域的服务实例,减少网络时延。
-
熔断与重试:为了提高服务的容错性,ASM内置了熔断和重试机制。当某个服务实例出现故障时,ASM会自动将其隔离,避免故障扩散;同时,ASM会自动重试失败的请求,减少业务失败率。用户还可以通过配置来自定义熔断和重试的策略,如熔断触发条件、重试次数等。
华为云ASM提供了全方位的安全防护能力,包括:
-
认证与鉴权:ASM支持多种身份认证方式,如JWT、OIDC、mTLS等,可以对服务的访问进行身份验证。同时,ASM还支持细粒度的授权和权限控制(RBAC),可以限制服务的访问范围,提高系统安全性。
-
加密通信:ASM默认为服务之间的通信提供mTLS加密,可以防止通信内容被窃听或篡改。用户还可以灵活地配置TLS策略,如加密算法、密钥强度等。
-
安全策略:ASM允许用户定义各种安全策略,如白名单、黑名单、限流、API管控等,对服务的访问进行精细化控制。通过这些策略,可以有效防范各种恶意攻击,如DDoS、SQL注入、XSS等。
华为云ASM提供了强大的流量控制和管理能力,主要体现在以下几个方面:
-
灰度发布:ASM支持多种灰度发布策略,可以按照流量比例、HTTP头、Cookie等规则将请求流量逐步导入新版本服务。通过灰度发布,可以控制新版本对用户的影响范围,及时发现和解决问题,平滑完成业务升级。
-
流量镜像:ASM可以将实时流量拷贝一份到镜像服务,用于在线调试和测试。这种机制可以在不影响线上业务的情况下,对新版本服务进行真实流量验证,从而降低发布风险。
-
故障注入:ASM支持故障注入机制,可以人为模拟服务故障,如延迟、异常、abort等,以验证系统的容错和恢复能力。通过故障注入,可以在生产环境下进行混沌工程实践,提高系统的稳定性和可靠性。
-
流量管控:ASM可以对服务间的流量进行精细化管控,如按照调用关系拓扑、服务API、消费者标签等多维度定义流量策略。通过这些策略,可以实现租户隔离、分级授权、计费限流等业务场景,满足企业级用户的管控需求。
-
弹性伸缩:ASM与华为云弹性伸缩服务(AOS)深度集成,可以根据服务的流量状况自动调整后端实例数量。当流量增大时,ASM会触发AOS扩容服务实例;当流量减小时,ASM会触发AOS缩容实例,实现服务的自动弹性。
以上控制能力使得ASM成为一个全方位的服务流量管控平台,可以有效提升云原生应用的交付质量和效率。
华为云ASM提供了开箱即用的遥测和可观测性能力,支持多种维度的监控指标采集、分布式追踪、日志收集等,帮助用户实时洞察服务运行状态,快速定位和诊断问题。
- 监控指标:ASM自动收集服务网格的流量指标(如QPS、成功率、延迟等)、资源指标(如CPU、内存、网络等)和服务指标(如熔断状态、限流触发次数等),并与云监控服务无缝集成,提供实时监控大盘和告警通知。用户可以通过灵活的PromQL查询语句,对指标数据进行多维分析和聚合。
- 分布式追踪:ASM与华为云分布式追踪服务(CTS)集成,可以自动为每个请求生成一个全局唯一的TraceID,记录请求经过的每个服务节点,并将链路信息异步发送到CTS。用户可以通过CTS UI直观地查看请求的端到端调用链,快速定位性能瓶颈和异常服务。
- 调用拓扑:ASM可以自动生成服务间的依赖拓扑图,实时展示服务的调用关系和流量状况。通过拓扑图,用户可以直观地了解服务架构,发现异常调用和潜在风险,并进行有针对性的优化。
- 日志收集:ASM支持采集服务的业务日志和Sidecar代理日志,并将其发送到云日志服务(LTS)进行存储和分析。用户可以通过LTS的检索和告警功能,快速查询关键日志,发现错误堆栈,并设置异常日志告警,实现问题的快速响应和处理。
- 服务依赖分析:ASM可以分析服务之间的依赖关系,生成服务依赖矩阵。通过这个矩阵,用户可以了解服务之间的调用频率、延迟、错误率等关键指标,评估服务的重要性和影响范围,合理规划容量和优化服务。
- 多维度排查:ASM提供了tags机制,可以对请求进行多维度标记,如应用、版本、环境、租户等。在排查问题时,用户可以根据这些tags快速过滤和定位异常请求,缩小排查范围,提高诊断效率。
- 总之,华为云ASM的遥测和可观测性能力,可以帮助用户全方位地监控服务网格,实时掌握业务和系统的健康状态,并在出现问题时快速定位和诊断,最大限度地提高服务可用性和稳定性,减少运维成本。
随着微服务架构和容器化技术的普及,越来越多的应用采用了基于Kubernetes等容器编排平台的部署方式。然而,原生的Kubernetes只提供了基本的服务发现和负载均衡能力,在复杂的企业级生产环境中,仍然面临服务管理、流量治理、安全认证等挑战。
ASM作为一种先进的服务网格解决方案,可以与容器编排平台无缝集成,提供强大的流量治理和管控能力,帮助用户应对大规模容器集群的服务治理难题。下面我们就来看看ASM在容器化服务流量治理中的几个典型应用场景。
在Kubernetes集群内部,Pod之间的流量是直接互通的,缺乏有效的流量管控手段。ASM通过在每个Pod中注入一个Sidecar代理,接管Pod的入口和出口流量,从而实现对服务间流量的细粒度管控。
例如,ASM可以根据服务的身份(Service Account)和命名空间(Namespace)来制定流量策略,限制服务之间的访问权限。只允许特定服务访问另一些服务,禁止其他未授权的访问。这种基于身份的准入控制,可以有效提高集群的安全隔离性。
此外,ASM还可以对服务间的流量进行负载均衡、限流熔断、故障注入等治理操作。通过在Sidecar代理上执行这些流量治理规则,可以在不修改服务代码的情况下,实现对服务行为的动态控制和优化。
除了集群内部的服务间流量,ASM还可以对进入集群的外部流量进行管控。通过在集群入口部署一个Ingress Gateway(如Istio Gateway),ASM可以拦截所有进入集群的流量,并根据预设的路由规则将请求转发到内部服务。
ASM支持丰富的入口流量治理特性,包括:
- 多协议支持:支持HTTP、HTTPS、HTTP/2、gRPC等多种应用层协议。
- 灵活的路由规则:支持基于URI、Header、权重等多种条件的流量路由。
- 安全防护:支持HTTPS加密通信,并可对请求进行身份认证、授权。
- 监控指标:提供丰富的流量指标,如QPS、成功率、延迟等,可与Prometheus等监控系统集成。
通过在入口处统一管控流量,ASM可以简化集群的对外暴露和服务访问,提高服务的安全性和可观测性。
在实际生产环境中,企业通常会部署多个Kubernetes集群,跨集群的服务调用十分常见。但Kubernetes原生并不支持跨集群服务发现和通信,给运维带来了挑战。
ASM提供了一套跨集群服务网格解决方案,可以将多个Kubernetes集群连接成一个统一的服务网格,实现跨集群的服务注册、发现和流量管控。
具体来说,ASM通过在每个集群中部署一个控制平面(如Istio控制平面),并让这些控制平面相互连通,形成一个统一的跨集群控制平面。这个控制平面维护了所有集群的服务注册表,可以实现跨集群的服务发现。
同时,ASM在每个集群的出口处部署一个Egress Gateway,用于拦截出口流量。当一个服务要访问另一个集群的服务时,流量会先到达本集群的Egress Gateway,然后由控制平面查询到目标服务的实际地址,再由EgressGateway将请求转发到目标集群的Ingress Gateway,最后到达目标服务。
这种跨集群流量转发机制,将服务间的通信从 N*N 的复杂度降低到了N的复杂度,大大简化了跨集群服务调用的实现。同时,由于流量都要经过Gateway,ASM可以在Gateway上实施全局的流量治理策略,如负载均衡、访问控制、流量镜像等,实现跨集群的一致化管理。
当容器化服务需要升级时,如何平滑地发布新版本,并尽可能减少对用户的影响,是一个关键的挑战。ASM提供了强大的灰度发布能力,可以帮助用户安全、可控地完成服务升级。
ASM支持多种灰度发布策略,包括:
- 基于权重的流量切分:可以为新老版本配置流量权重,如10%的流量到新版本,90%到老版本。
- 基于请求内容的流量切分:可以根据请求的Header、URI等内容,将流量导向不同版本。
- 基于用户属性的流量切分:可以根据用户的身份、所在地域等属性,将流量导向不同版本。
通过这些灰度策略,可以将一部分用户流量逐步导入到新版本服务,进行小规模验证。同时,ASM提供了详细的监控指标和分布式追踪能力,可以实时观察新版本的运行状况,及时发现和解决问题。当新版本稳定后,再逐步扩大流量比例,最终完全替换老版本。
ASM还提供了一键回滚机制,当新版本出现重大问题时,可以快速将全部流量切回老版本,最大限度地降低服务中断的影响。
ASM为容器化服务的流量治理提供了一套完整的解决方案,覆盖了集群内部、集群入口、多集群、灰度发布等多个关键场景。通过将流量管控能力下沉到基础设施层,ASM可以在不侵入应用程序的前提下,实现对服务流量的细粒度管控、监测和优化,大大简化了服务网格的运维难度。
随着ASM的不断发展和成熟,其必将成为容器化环境下流量治理的关键基础设施,帮助企业构建起高可用、高性能、安全可控的现代化服务网格,加速微服务架构的落地和推广。
- 点赞
- 收藏
- 关注作者
评论(0)