运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)

运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇) 运维专题 基于应用服务网格的灰度发布(上:理论基础篇) –
文章信息 –
Author: 李俊才 (jcLee95) Visit

操作和维护主题

基于应用服务网格的灰度发布(第1部分:理论基础)

文章信息-

作者: 李俊才(jcLee95)

访问CSDN: https://jclee95.blog.csdn.net。

我的网站:http://thispage.tech/

邮箱: 291148484@163.com。

中国深圳

本文地址:https://blog.csdn.net/qq_28550263/article/details/139885874

华为:https://bbs.huaweicloud.com/blogs/429596

【简介】:本文介绍了应用服务网格灰度发布的基础知识,整理自华为微认证课程学习总结笔记以及相关开源技术GitHab/官网介绍。

下一段:《 基于应用服务网格的灰度发布(下:实践篇-基于华为云) 》

目录

1. 概述1.1 软件升级对用户有何影响1.2 灰度发布概念1.2.1 灰度发布的别名:金丝雀发布1.2.2 灰度发布的定义

1.3 去灰度流程1.3.1 某宝应用去灰度示例1.3.2 去灰度7个步骤

1.4 传统灰度发布的缺点1.4.1 灰度逻辑侵入代码1.4.2 需要多种环境,运维成本高

2. 灰度发布解决方案:应用服务网格(ASM) 2.1 应用服务网格(ASM)概述2.1.1 ASM 定义2.1.2 ASM 特性2.1.3 ASM 优势

2.2 Istio 和Kubernetes 概述2.2.1 Istio2.2.2 Kubernetes(k8s)

2.3 Istio 与Kubernetes 的关系2.4 云容器引擎(CCE)概述2.4.1 CCE 主要特点2.4.2 CCE 使用场景

2.5 ASM 架构2.5 ASM 架构2.5.1 控制平面和数据平面控制平面数据平面

2.5.2 Sidecar模式(1)Sidecar部署方式(2)Sidecar流量拦截(3)Sidecar配置管理(4)Sidecar资源开销

2.5.3 ASM 主要组件2.5.3.1 Istio Manager(Pilot) 2.5.3.2 策略执行模块(Mixer) 2.5.3.3 安全组件(Citadel) 2.5.3.4 配置验证组件(Galley)

3. 基于ASM 的灰度发布3.1 ASM 支持的灰度发布类型3.1.1 Canary 发布3.1.2 Bluegreen 发布3.1.3 AB 测试

3.2 ASM 灰度暴露的流量规则3.2.1 基于HTTP header 的灰度规则3.2.2 基于Cookie 的灰度规则3.2.3 基于操作系统和浏览器的灰度规则3.2.4 基于源IP 尺度规则的灰度规则

3.3 灰度发布的优势3.3.1 无入侵3.3.2 灰度版本独立部署3.3.3 便捷的灰度流量切换3.3.4 灰度效果实时监控

4. 华为云ASM服务4.1 连接4.2 安全4.3 控制4.4 Telemetry 4.5 ASM在容器化服务流量管理中的应用4.5.1 集群内服务之间的流量控制4.5.2 集群入口处的流量控制4.5.3 服务之间的多种流量控制集群服务4.5.4 容器化服务灰度4.5.5 版概述

1. 概述

1.1 软件升级对用户的影响

在传统的软件升级过程中,当新版本的软件发布时,所有用户都会升级到新版本。这种做法存在一定的风险。

新版本的软件可能存在未被发现的缺陷或兼容性问题,重大升级可能会影响所有用户的体验。

用户可能不熟悉新版本的界面设计或功能变化,导致升级后满意度较低。

如果新版本遇到重大问题并需要回滚,其影响可能是毁灭性的。

因此,您在升级软件时应该更加小心,以降低升级风险,避免用户体验突然下降。

1.2 灰度发布的概念

灰度发布是一种软件升级方法,可以最大限度地降低升级风险并提供到新版本的平滑过渡。基本思路是先向一小部分用户发布新版本,称为“灰度用户”,然后在收集使用反馈后逐步扩大范围,最后实现全面升级。

1.2.1 灰度发布的别名:金丝雀发布

但需要指出的是,传统的灰度发布方式也存在一定的局限性。这将在下一节中解释。

1.2.2 灰度发布的定义

虽然灰度发布是一种成熟的发布方式,但传统的实现方式存在一些缺陷。

1.3 灰度发布的流程

在传统的灰度发布中,灰度逻辑通常会侵入应用程序代码。例如:

如果(isGrayUser(用户ID)){

//灰度版逻辑

} 除此之外{

//稳定的逻辑

}

这种繁琐的灰度逻辑增加了代码复杂性并降低了可维护性。同时,灰度的每次发布都需要更改代码,降低了发布效率。

1.3.1 某宝App的灰度发布案例

为了支持灰度发布,传统方法通常需要构建多个生产环境,包括灰度环境和稳定环境。这种方法存在以下问题:

硬件和维护成本较高,需要更多的服务器和运维投资。

环境管理复杂,不同环境下的配置和代码可能不一致,维护难度加大。

非发布期间资源利用率低,灰度环境闲置浪费。

综上所述,传统灰度发布可以降低风险,但实施成本较高。为了克服这些限制,业界提出了基于应用服务网格(ASM)的新的灰度发布解决方案。 ASM通过服务代理实现灰度逻辑和流程控制,无需穿透应用代码或多个物理环境,大幅降低灰度发布的复杂度和成本。下一章重点介绍ASM 的原理和好处。

1.3.2 灰度发布的7个步骤

1.4 传统灰度发布的缺点

应用服务网格(ASM)是一种新型微服务架构,通过将服务治理功能分散到基础设施层,提供更高效、可靠、安全的服务通信和管理方法。本节从定义、特性和优点三个方面对ASM进行概述。

1.4.1 灰度逻辑侵入代码

ASM 是一个专门的基础设施层,用于处理服务之间的通信并管理服务操作。它与应用程序代码分离,以附加进程的形式伴随应用程序部署,并接管服务之间的网络调用。

从逻辑上讲,ASM 位于应用程序和底层平台之间。

+———————————————— +

| 应用服务|

+———————————————— +

| 应用服务网格(ASM)|

+———————————————— ————+

| 基础设施(Kubernetes 等) |

+———————————————— +

ASM实际上是一个分布式代理网络,其中每个服务实例旁边都放置一个代理(例如Envoy),服务之间的所有调用都通过代理进行。安全认证以及监控和跟踪等治理功能。同时,所有代理均由中央控制平面进行配置和管理。

这种将服务治理下沉到基础设施中的sidecar 代理模型,使得ASM 能够在不穿透业务代码的情况下对服务行为进行细粒度的控制,从而显着降低微服务架构的复杂度。

1.4.2 需要多套环境,运维成本高

作为独立的中间层,ASM 提供了一组开箱即用的服务治理功能,包括:

Istio 通过在服务之间部署一组轻量级网络代理(sidecar)来实现这一点,而不会影响服务代码。 Sidecar代理拦截进出服务的流量,并根据控制平面下发的策略执行相应的流量管理、监控跟踪和安全控制逻辑。

2. 灰度发布解决方案:应用服务网格(ASM)

Kubernetes(k8s)是一个开源容器编排平台,最初由Google 开发,并于2014 年开源并捐赠给CNCF 基金会。提供可移植、可扩展且高度可用的平台,用于容器化应用程序的自动部署、扩展和管理。

Kubernetes 的主要特点是:

服务发现和负载平衡:容器可以使用DNS 名称或自己的IP 地址公开,如果容器有大量流量,Kubernetes 可以进行负载平衡以分配网络流量。

存储编排:自动挂载您选择的存储系统,包括本地存储和公共云提供商。

自动化部署和回滚:可以使用Kubernetes 来描述已部署容器的期望状态,Kubernetes 可以以受控的速率将实际状态更改为期望状态。

自动装箱计算:根据资源需求和其他限制自动放置容器,而不牺牲可用性,混合关键和尽力而为的工作负载,以提高利用率并节省资源。

自我修复:重新启动失败的容器、替换容器、杀死不响应用户定义的健康检查的容器,并且在服务准备就绪之前不通知客户端。

配置管理:使您能够存储和管理敏感信息,例如密码、OAuth 令牌和SSH 密钥。可以部署和更新密钥和应用程序配置,而无需重建容器映像或在堆栈配置中公开密钥。

Kubernetes 提供了一个声明式API 来管理您的应用程序。用户通过YAML 文件定义应用程序所需的状态,例如副本数量、资源配额和访问策略。 Kubernetes 在集群内维护这种状态。这种“预期状态”管理模型简化了应用运维,提高了发布效率。

此外,Kubernetes 中的另一个重要概念是Pod。 Pod 是Kubernetes 中最小的可部署单元,由一个或多个共享存储和网络空间的容器组成。 Pod 是临时的,可以随时销毁和重建。 Kubernetes 使用Pod 来实现应用的弹性伸缩、灾难恢复、滚动升级等功能。

总的来说,Kubernetes 通过声明式API 和Pod 等概念提供了自动化的容器编排平台,极大地简化了应用程序的部署、扩展和管理。 Istio 专注于提供服务网格功能,是Kubernetes 的补充。下一节介绍Istio 和Kubernetes 之间的关系。

2.1 应用服务网格(ASM)概述

尽管Istio 和Kubernetes 是两个独立的开源项目,但它们在微服务领域紧密互补。

另一方面,Istio 依赖Kubernetes 来编排和管理其组件。 Istio 控制平面和数据平面组件以Pod 的形式部署到Kubernetes 集群中。 Istio 必须利用Kubernetes 的服务发现、容器编排、灾难恢复等功能来维持高可用性。同时,Istio 通过将Sidecar 代理注入到pod 中,将流量管理和其他功能无缝集成到Kubernetes 应用程序中。

其中,CCE与ASM的集成尤为重要。 ASM弥补了CCE在微服务领域的不足,提供了流量管理、服务监控、安全防护等关键能力。用户可以在CCE上一键部署ASM,实现容器应用完整的生命周期管理和服务治理。下一节重点介绍ASM 的架构原理。

2.1.1 ASM的定义

2.1.2 ASM的功能

2.1.3 ASM的优势

ASM采用控制平面和数据平面分离的架构设计,提供灵活的流量管理和策略控制。

2.2 Istio 和 Kubernetes简介

控制平面负责管理和配置整个服务网格,包括服务注册、服务发现、流量规则分发等。它由一组组件组成,用于管理代理、通过API 发布策略和配置以及从代理接收遥测数据。控制平面通常包括以下主要组件:

Pilot:负责服务发现、流量管理、智能路由。 Pilot 接收控制平面中的流量规则,将其转换为Envoy 理解的配置,并将它们发送到数据平面中的代理。

Mixer:负责策略控制和遥测收集。 Mixer 从代理接收遥测数据,并根据控制平面发布的策略对请求执行访问控制和配额管理等操作。

Citadel:负责管理服务之间的身份和证书。 Citadel 为服务颁发证书并实现服务之间的相互TLS 身份验证。

Galley:负责配置校验和分配。 Galley 会先验证控制平面收到的配置,然后再将其分发到其他控制平面组件。

控制平面通过xDS协议(LDS、RDS、CDS、EDS等)动态地将流量规则、策略、证书等分发给数据平面代理,以实现实时配置更新。同时,控制平面还监控代理上报的服务发现、负载等信息,以调整流量策略。

2.2.1 Istio

数据平面由一组智能代理(边车代理)组成,这些代理与服务实例一起部署,以接管进出服务的流量。数据平面代理的职责包括:

服务发现:动态识别服务实例的变化。

健康检查:检查后端服务实例的健康状况。

负载均衡:根据负载均衡算法选择后端服务实例。

流量路由:根据控制平面下发的路由规则转发流量。

安全通信:与其他代理或服务建立加密连接。

可观察性:收集和报告流量指标、日志、调用链等。

ASM 最常用的数据平面代理是Envoy,一种高性能、可扩展的C++ 网络代理。 Envoy 提供动态服务发现、负载均衡、TLS 终止、HTTP/2 gRPC 代理、电路中断、运行状况检查、基于流量分割百分比的分阶段发布等。

控制平面和数据平面分离,允许ASM独立升级控制平面,而不影响数据平面流量转发。这种分离使得ASM 更加灵活和可维护。数据平面代理在转发流量的同时,还执行控制平面下发的流量规则和策略,实现应用层流量管理。

2.2.2 Kubernetes(k8s)

边车

r模式是ASM实现服务治理的核心机制。它将服务治理功能从应用程序中剥离出来,由一个独立的代理程序(即Sidecar容器)来承载。Sidecar与应用容器部署在同一个Pod中,并拦截进出应用的所有流量。

(1)Sidecar的部署方式

在Kubernetes中部署ASM时,会在每个Pod中注入一个Sidecar容器,如下图所示:

+————————-+
| Pod |
| +——————+ |
| | 应用容器 | |
| | | |
| +——————+ |
| |
| +——————+ |
| | Sidecar容器 | |
| | | |
| +——————+ |
+————————-+

Sidecar容器通常使用Envoy等高性能的代理组件,它监听特定的端口,如15000端口。而应用容器的流量则被配置为通过localhost的15000端口来发送和接收。这样一来,Sidecar就能拦截应用的所有入口和出口流量。

(2)Sidecar的流量拦截

当流量进入Pod时,它首先被Sidecar拦截。Sidecar根据从控制平面(如Pilot)获取的路由规则和策略,对流量进行处理,如路由、负载均衡、限流等。处理后的流量再转发给应用容器处理。

而当应用容器需要向外发送请求时,它首先将请求发送给Sidecar。Sidecar同样根据控制平面下发的规则对请求进行处理,如负载均衡、断路、重试等。处理后的请求再由Sidecar转发出去。

整个过程如下图所示:

+———-+ +———–+
| Sidecar | | 应用容器 |
| | | |
—>| Envoy |———->| Tomcat |
| |<———-| |
+———-+ +———–+

这种Sidecar代理模式的优点是:

无侵入:应用程序无需任何修改,就可以获得服务治理能力。语言无关:Sidecar与应用程序的语言和框架无关,可以用于任何应用。独立升级:Sidecar与应用分离,可以独立升级,降低升级风险。可移植:Sidecar屏蔽了底层平台的差异,提供了统一的服务治理接口。

(3)Sidecar的配置管理

Sidecar代理的配置由ASM的控制平面(如Pilot)统一管理。控制平面将路由规则、策略等配置,以xDS协议(如LDS、RDS、CDS、EDS)下发给各个Sidecar代理。Sidecar获得配置后,动态更新自己的路由表和策略,以执行相应的流量管理逻辑。

同时,Sidecar也收集应用的流量指标和调用数据,上报给控制平面,实现了集中式的监控和追踪。这种配置下发和数据收集的过程:

+——————–+ +——————+
| 控制平面 | | 数据平面 |
| | xDS | |
| +————-+ | ———> | +———–+ |
| | Pilot | | | | Sidecar | |
| +————-+ | <——— | +———–+ |
| | 指标数据 | |
+——————–+ +——————+

通过这种方式,ASM实现了对服务网格的集中控制和实时监控,而无需修改应用代码。这大大降低了微服务治理的复杂度。

(4)Sidecar的资源开销

引入Sidecar容器会带来一定的资源开销,主要包括:

CPU和内存:每个Sidecar容器需要占用一定的CPU和内存资源。网络延迟:流量需要经过Sidecar的转发,会引入微小的网络延迟。部署复杂度:需要对每个应用Pod进行Sidecar注入,增加了部署复杂度。
但总的来说,Sidecar带来的开销是可以接受的,尤其是与它提供的服务治理能力相比。而且,可以通过调整Sidecar的资源配额、连接池等参数来优化性能,将开销降到最低。

此外,一些轻量级的Sidecar实现,如Google的PROXYLESS gRPC,可以避免为每个应用部署Sidecar,而是直接将治理逻辑以库的形式链接到应用中,从而降低了资源占用。但这种方式侵入性较强,不如独立的Sidecar容器灵活。

概括一下:Sidecar模式是ASM的核心机制,它以一种无侵入、可移植的方式实现了微服务的流量管理、可观测性和安全性。尽管引入了一定的复杂度和开销,但与传统的SDK集成相比,Sidecar模式是目前最灵活和可扩展的服务治理方案。

2.5.3 ASM的关键组件

ASM作为一个完整的服务网格解决方案,包含了多个关键组件,它们分工协作,共同提供了服务发现、智能路由、流量管理、策略执行和安全防护等一系列功能。下面我们就来看看ASM的4个核心组件:Pilot、Mixer、Citadel和Galley。

2.5.3.1 Istio管理器(Pilot)

Pilot是Istio的核心组件之一,充当服务网格的控制平面,负责管理和配置部署在网格中的Envoy代理实例。

具体来说,Pilot的功能包括:

服务发现:Pilot使用平台特定的服务发现机制(如Kubernetes的API Server)来查找服务注册表中的服务实例。
流量管理:Pilot将高级路由规则转换为Envoy特定的配置,并动态更新Envoy代理的路由规则。这样,Pilot就可以控制服务之间的流量,实现灰度发布、AB测试等功能。
弹性功能:Pilot为Envoy提供了超时、重试、熔断等弹性配置,提高了服务的容错性和稳定性。
服务健康检查:Pilot从Envoy代理收集服务的健康状况,并将不健康的服务实例从负载均衡池中移除。

可以看到,Pilot通过与Envoy代理的交互,实现了服务发现、流量控制等关键功能,是Istio的流量管理器。Pilot让运维人员可以通过简单的配置来控制服务间的流量,而无需修改服务代码。

2.5.3.2 策略执行模块(Mixer)

Mixer是Istio的另一个核心组件,负责在服务网格中执行访问控制和使用策略。Mixer独立于Envoy代理,可提供灵活的插件模型,方便扩展和集成自定义的后端。

Mixer的主要功能包括:

前置条件检查:Mixer可以对请求执行前置条件检查,如身份验证、授权等,并拒绝不符合条件的请求。
配额管理:Mixer可以对服务的访问配额进行限制,如限制每秒的请求数、CPU使用量等。
遥测数据收集:Mixer负责从Envoy代理收集遥测数据,如请求日志、监控指标等,并将其发送到后端的监控系统。
策略评估:Mixer根据制定的访问控制策略对请求进行评估,并返回是否允许请求继续。

Mixer让Istio的策略执行和遥测收集变得高度可配置和可扩展。通过Mixer,可以实现灵活的访问控制、限流、计费等功能,并且可以对接各种监控后端,实现对服务网格的可观察性。

2.5.3.3 安全组件(Citadel)

Citadel是Istio的安全组件,负责在服务网格中提供身份和凭证管理。

Citadel的核心功能包括:

身份供给:Citadel为网格中的每个服务实例提供强大的身份,以实现服务到服务以及最终用户到服务的身份验证。
证书管理:Citadel负责自动化密钥和证书轮换,为每个服务实例生成证书,并将其分发给Envoy代理。这为服务间通信提供了双向TLS认证。
凭证管理:Citadel将服务认证机制从应用层移动到服务网格基础架构中。应用程序无需管理自己的凭证,Citadel会自动为服务生成身份和凭证。

通过Citadel,Istio可以在服务网格内提供全面的安全防护,包括服务身份验证、加密通信、基于角色的访问控制等。Citadel使得服务间的通信更加安全可靠,而无需修改服务代码。

2.5.3.4 配置校验组件(Galley)

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的基础上进行了增强和优化,使其更加易用和高效。

3. 基于 ASM 的灰度发布

应用服务网格(ASM)提供了强大的流量管理能力,可以支持多种灰度发布策略。本节将重点介绍ASM支持的3种主要灰度发布类型:金丝雀发布、蓝绿发布和AB测试。

3.1 ASM 支持的灰度发布类型

3.1.1 金丝雀发布(Canary Release)

金丝雀发布,也称灰度发布,是一种增量式发布策略,是当前应用灰度发布的主流方式。其基本思路是先将一小部分实际流量引入新版本进行测试,待验证没问题后再逐步扩大范围,最终把所有流量都迁移到新版本。

在ASM中实现金丝雀发布非常简单,只需要通过定义流量规则,将一定比例的流量路由到新版本服务即可。例如,可以先让10%的流量访问新版本,其余90%流量访问旧版本,观察一段时间后,如果新版本运行平稳,再把新版本流量比例逐步调高到20%、50%、80%,直到100%。

ASM支持根据多种规则来划分流量,如按照百分比、请求内容、客户端版本等,可以灵活地控制金丝雀发布的范围和节奏,并在过程中随时调整流量规则。

金丝雀发布的优点是风险可控,用户影响小。一旦发现问题,可以快速切回旧版本,同时放量速度也比较敏捷。但其缺点是发布周期较长,而且新旧版本会长时间同时运行,资源消耗大。

3.1.2 蓝绿发布(Blue-Green Release)

蓝绿发布是一种非增量式的发布策略,又称红黑发布(Red-Black Release)。其实现方式是在生产环境中同时部署两个版本:旧版本(称为蓝色版)和新版本(称为绿色版),两个版本都有自己的服务和数据库等资源。在切换流量时,先将旧版本的流量逐步切到新版本,直到新版本承载100%流量,再下线旧版本。

蓝绿发布的切换过程非常快,对用户是透明的。新版本一旦就绪,所有用户都可以快速升级,因此适合对系统可用性要求高的场景。

在ASM中实现蓝绿发布,需要先把新版本的服务部署到与旧版本并行的生产环境中,再通过ASM的VirtualService定义流量规则,将指向旧版本的流量逐步切换到新版本。一旦切换完成,就可以下线旧版本,回收资源。

蓝绿发布的优点是用户切换快,系统停机时间短,回滚也比较方便。但其缺点是需要两倍以上的资源,而且数据库切换比较复杂,通常需要单独处理。此外,蓝绿发布不能分批验证,一旦新版本有问题,影响范围会比较大。

3.1.3 AB测试

AB测试是一种对比实验式的发布策略,主要用于评估两个版本的效果差异。与金丝雀发布和蓝绿发布不同,AB测试的重点不是安全地发布新版本,而是通过科学的实验设计和统计分析,来比较两个版本在关键指标上的表现,从而指导产品优化和决策。

在AB测试中,需要将用户流量分成两个或多个对等分组,每组用户访问不同的版本,收集一段时间的数据后,通过统计检验等方法分析各版本的效果差异,验证优化假设。

ASM可以方便地实现AB测试。首先,同时部署多个版本的服务;然后,通过定义流量规则,按照某种策略(如随机、权重、用户特征等)将流量分配到不同版本;最后,对各版本的关键指标进行采集和分析,得出优化结论。

例如,一个电商网站优化了推荐算法,想评估新算法的效果。可以使用ASM按 90%:10% 的比例将流量随机分配到新旧两个算法,观察一周后,分析比较两组用户的转化率、客单价等指标,若新算法效果显著更优,则可以全量上线新版本。

AB测试的优点是可以在线上环境进行受控实验,获得真实用户反馈,降低决策风险。但其缺点是实验周期较长,而且需要较大流量才能得到统计显著的结论,因此更适合大流量应用。

综上,金丝雀发布、蓝绿发布和AB测试是ASM支持的三种主要灰度策略,各有特点和适用场景。在实际的系统升级和优化中,可以根据需求灵活选择,也可以将它们组合使用,以达到安全、高效、可控地发布和验证新版本的目的。

下一节,我们将进一步介绍ASM灰度发布的流量规则,即如何根据不同的请求属性来划分和路由流量。

3.2 ASM灰度发布的流量规则

ASM的一大优势是支持多种灵活的流量划分规则,可以根据不同的请求属性将流量路由到不同版本的服务。常见的灰度规则包括基于HTTP Header、Cookie、操作系统和浏览器、源IP等。下面我们来分别介绍这几类规则。

3.2.1 基于HTTP Header的灰度规则

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用户试用等场景。

3.2.2 基于Cookie的灰度规则

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的安全性,防止被恶意篡改。

3.2.3 基于操作系统和浏览器的灰度规则

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等)来划分流量。

3.2.4 基于源IP的灰度规则

在某些场景下,我们可能想根据请求的来源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让灰度发布变得更加可控和安全,大大降低了服务升级的风险。

3.3 灰度发布的优势

ASM为灰度发布提供了一套完整的解决方案,相比传统的灰度发布方式,具有以下几个显著优势:

3.3.1 无侵入

传统的灰度发布通常需要在应用程序中嵌入SDK或者代理,与业务逻辑耦合,侵入性强。而ASM采用Sidecar模式,将灰度逻辑移入独立的网络代理中,与应用容器解耦,实现了无侵入的灰度发布。

应用程序不需要感知灰度发布的存在,也不需要为适配灰度规则而修改代码。这极大地降低了灰度发布的实施成本,使开发人员可以专注于业务逻辑的开发。

3.3.2 灰度版本独立部署

ASM支持为新老版本的服务独立部署和扩缩容,新版本服务可以与旧版本服务部署在不同的资源池或者集群中,实现物理隔离。这避免了新老版本服务相互影响,提高了灰度发布的稳定性。

例如,我们可以先在一个小规模的集群中部署新版本服务,对其进行充分的测试和验证。等新版本服务稳定后,再逐步扩大集群规模,并将流量切换过去。这种方式可以降低变更风险,即使新版本出现问题,也不会影响旧版本服务的可用性。

3.3.3 灰度流量切换便捷

ASM提供了细粒度的流量控制能力,可以通过简单的配置(如VirtualService)来动态调整新老版本服务的流量比例。这使得灰度流量的切换变得非常便捷。

例如,我们可以先将5%的流量导入新版本服务,观察一段时间后,如果新版本运行稳定,再逐步提高流量比例到10%、20%、50%,直到完全切换到新版本。整个过程不需要重新部署服务,只需要修改流量规则即可。

而且,ASM还支持根据灰度效果自动调整流量。例如,我们可以设置一个策略,当新版本服务的错误率超过某个阈值时,自动将流量切回旧版本,避免影响用户体验。这种自动化的流量控制方式,进一步降低了灰度发布的运维成本。

3.3.4 灰度效果实时监控

ASM提供了丰富的监控指标和可视化工具,可以实时观测灰度发布的效果。通过收集新老版本服务的请求量、响应时间、错误率等指标,我们可以全面评估灰度发布的进展和风险。

例如,在Istio中,我们可以使用Prometheus和Grafana来监控服务的关键指标,当发现新版本服务的响应时间显著增加时,可以及时中断灰度,避免问题扩大。

同时,ASM还提供了分布式追踪和日志收集的能力,可以在请求层面分析新版本服务的异常行为,快速定位和解决问题。

综上,ASM为灰度发布提供了一套安全、高效、可靠的技术方案。它通过将灰度逻辑下沉到基础设施层,实现了业务代码与灰度机制的解耦,并提供了灵活的流量控制和实时监控能力,使得灰度发布变得更加简单和可控。这极大地降低了服务升级的风险,提高了发布效率,为持续交付和微服务演进提供了有力的支撑。

4. 华为云ASM服务

华为云应用服务网格(ASM)是一款全托管的服务网格产品,提供了一整套灰度发布、流量管理、服务治理、安全防护的解决方案。它基于Istio开源项目,并针对华为云环境做了增强和优化,使得用户可以便捷地在华为云上构建和管理现代化微服务应用。

接下来,我们将重点介绍华为云ASM的几大核心功能。

4.1 连接

华为云ASM在服务连接方面提供了以下关键能力:

服务注册与发现:ASM集成了华为云服务注册中心(CSE),可以自动将部署在华为云容器引擎(CCE)中的微服务实例注册到ASM,并提供DNS、Kubernetes原生等多种服务发现机制,方便服务之间的相互调用。
负载均衡:ASM提供了灵活的负载均衡策略,包括轮询、最少连接、一致性哈希等,可以根据服务的特点选择合适的负载均衡算法。同时,ASM还支持locality load balancing,可以优先将请求转发到同一个可用区或者地域的服务实例,减少网络时延。
熔断与重试:为了提高服务的容错性,ASM内置了熔断和重试机制。当某个服务实例出现故障时,ASM会自动将其隔离,避免故障扩散;同时,ASM会自动重试失败的请求,减少业务失败率。用户还可以通过配置来自定义熔断和重试的策略,如熔断触发条件、重试次数等。

4.2 安全

华为云ASM提供了全方位的安全防护能力,包括:

认证与鉴权:ASM支持多种身份认证方式,如JWT、OIDC、mTLS等,可以对服务的访问进行身份验证。同时,ASM还支持细粒度的授权和权限控制(RBAC),可以限制服务的访问范围,提高系统安全性。
加密通信:ASM默认为服务之间的通信提供mTLS加密,可以防止通信内容被窃听或篡改。用户还可以灵活地配置TLS策略,如加密算法、密钥强度等。
安全策略:ASM允许用户定义各种安全策略,如白名单、黑名单、限流、API管控等,对服务的访问进行精细化控制。通过这些策略,可以有效防范各种恶意攻击,如DDoS、SQL注入、XSS等。

4.3 控制

华为云ASM提供了强大的流量控制和管理能力,主要体现在以下几个方面:

灰度发布:ASM支持多种灰度发布策略,可以按照流量比例、HTTP头、Cookie等规则将请求流量逐步导入新版本服务。通过灰度发布,可以控制新版本对用户的影响范围,及时发现和解决问题,平滑完成业务升级。
流量镜像:ASM可以将实时流量拷贝一份到镜像服务,用于在线调试和测试。这种机制可以在不影响线上业务的情况下,对新版本服务进行真实流量验证,从而降低发布风险。
故障注入:ASM支持故障注入机制,可以人为模拟服务故障,如延迟、异常、abort等,以验证系统的容错和恢复能力。通过故障注入,可以在生产环境下进行混沌工程实践,提高系统的稳定性和可靠性。
流量管控:ASM可以对服务间的流量进行精细化管控,如按照调用关系拓扑、服务API、消费者标签等多维度定义流量策略。通过这些策略,可以实现租户隔离、分级授权、计费限流等业务场景,满足企业级用户的管控需求。
弹性伸缩:ASM与华为云弹性伸缩服务(AOS)深度集成,可以根据服务的流量状况自动调整后端实例数量。当流量增大时,ASM会触发AOS扩容服务实例;当流量减小时,ASM会触发AOS缩容实例,实现服务的自动弹性。

以上控制能力使得ASM成为一个全方位的服务流量管控平台,可以有效提升云原生应用的交付质量和效率。

4.4 遥测

华为云ASM提供了开箱即用的遥测和可观测性能力,支持多种维度的监控指标采集、分布式追踪、日志收集等,帮助用户实时洞察服务运行状态,快速定位和诊断问题。

监控指标:ASM自动收集服务网格的流量指标(如QPS、成功率、延迟等)、资源指标(如CPU、内存、网络等)和服务指标(如熔断状态、限流触发次数等),并与云监控服务无缝集成,提供实时监控大盘和告警通知。用户可以通过灵活的PromQL查询语句,对指标数据进行多维分析和聚合。分布式追踪:ASM与华为云分布式追踪服务(CTS)集成,可以自动为每个请求生成一个全局唯一的TraceID,记录请求经过的每个服务节点,并将链路信息异步发送到CTS。用户可以通过CTS UI直观地查看请求的端到端调用链,快速定位性能瓶颈和异常服务。调用拓扑:ASM可以自动生成服务间的依赖拓扑图,实时展示服务的调用关系和流量状况。通过拓扑图,用户可以直观地了解服务架构,发现异常调用和潜在风险,并进行有针对性的优化。日志收集:ASM支持采集服务的业务日志和Sidecar代理日志,并将其发送到云日志服务(LTS)进行存储和分析。用户可以通过LTS的检索和告警功能,快速查询关键日志,发现错误堆栈,并设置异常日志告警,实现问题的快速响应和处理。服务依赖分析:ASM可以分析服务之间的依赖关系,生成服务依赖矩阵。通过这个矩阵,用户可以了解服务之间的调用频率、延迟、错误率等关键指标,评估服务的重要性和影响范围,合理规划容量和优化服务。多维度排查:ASM提供了tags机制,可以对请求进行多维度标记,如应用、版本、环境、租户等。在排查问题时,用户可以根据这些tags快速过滤和定位异常请求,缩小排查范围,提高诊断效率。总之,华为云ASM的遥测和可观测性能力,可以帮助用户全方位地监控服务网格,实时掌握业务和系统的健康状态,并在出现问题时快速定位和诊断,最大限度地提高服务可用性和稳定性,减少运维成本。

4.5 ASM在容器化服务流量治理中的应用

随着微服务架构和容器化技术的普及,越来越多的应用采用了基于Kubernetes等容器编排平台的部署方式。然而,原生的Kubernetes只提供了基本的服务发现和负载均衡能力,在复杂的企业级生产环境中,仍然面临服务管理、流量治理、安全认证等挑战。

ASM作为一种先进的服务网格解决方案,可以与容器编排平台无缝集成,提供强大的流量治理和管控能力,帮助用户应对大规模容器集群的服务治理难题。下面我们就来看看ASM在容器化服务流量治理中的几个典型应用场景。

4.5.1 集群内部服务间流量管控

在Kubernetes集群内部,Pod之间的流量是直接互通的,缺乏有效的流量管控手段。ASM通过在每个Pod中注入一个Sidecar代理,接管Pod的入口和出口流量,从而实现对服务间流量的细粒度管控。

例如,ASM可以根据服务的身份(Service Account)和命名空间(Namespace)来制定流量策略,限制服务之间的访问权限。只允许特定服务访问另一些服务,禁止其他未授权的访问。这种基于身份的准入控制,可以有效提高集群的安全隔离性。

此外,ASM还可以对服务间的流量进行负载均衡、限流熔断、故障注入等治理操作。通过在Sidecar代理上执行这些流量治理规则,可以在不修改服务代码的情况下,实现对服务行为的动态控制和优化。

4.5.2 集群入口流量管控

除了集群内部的服务间流量,ASM还可以对进入集群的外部流量进行管控。通过在集群入口部署一个Ingress Gateway(如Istio Gateway),ASM可以拦截所有进入集群的流量,并根据预设的路由规则将请求转发到内部服务。

ASM支持丰富的入口流量治理特性,包括:

多协议支持:支持HTTP、HTTPS、HTTP/2、gRPC等多种应用层协议。灵活的路由规则:支持基于URI、Header、权重等多种条件的流量路由。安全防护:支持HTTPS加密通信,并可对请求进行身份认证、授权。监控指标:提供丰富的流量指标,如QPS、成功率、延迟等,可与Prometheus等监控系统集成。
通过在入口处统一管控流量,ASM可以简化集群的对外暴露和服务访问,提高服务的安全性和可观测性。

4.5.3 多集群服务间流量管控

在实际生产环境中,企业通常会部署多个Kubernetes集群,跨集群的服务调用十分常见。但Kubernetes原生并不支持跨集群服务发现和通信,给运维带来了挑战。

ASM提供了一套跨集群服务网格解决方案,可以将多个Kubernetes集群连接成一个统一的服务网格,实现跨集群的服务注册、发现和流量管控。

具体来说,ASM通过在每个集群中部署一个控制平面(如Istio控制平面),并让这些控制平面相互连通,形成一个统一的跨集群控制平面。这个控制平面维护了所有集群的服务注册表,可以实现跨集群的服务发现。

同时,ASM在每个集群的出口处部署一个Egress Gateway,用于拦截出口流量。当一个服务要访问另一个集群的服务时,流量会先到达本集群的Egress Gateway,然后由控制平面查询到目标服务的实际地址,再由EgressGateway将请求转发到目标集群的Ingress Gateway,最后到达目标服务。

这种跨集群流量转发机制,将服务间的通信从 N*N 的复杂度降低到了N的复杂度,大大简化了跨集群服务调用的实现。同时,由于流量都要经过Gateway,ASM可以在Gateway上实施全局的流量治理策略,如负载均衡、访问控制、流量镜像等,实现跨集群的一致化管理。

4.5.4 容器化服务的灰度发布

当容器化服务需要升级时,如何平滑地发布新版本,并尽可能减少对用户的影响,是一个关键的挑战。ASM提供了强大的灰度发布能力,可以帮助用户安全、可控地完成服务升级。

ASM支持多种灰度发布策略,包括:

基于权重的流量切分:可以为新老版本配置流量权重,如10%的流量到新版本,90%到老版本。基于请求内容的流量切分:可以根据请求的Header、URI等内容,将流量导向不同版本。基于用户属性的流量切分:可以根据用户的身份、所在地域等属性,将流量导向不同版本。
通过这些灰度策略,可以将一部分用户流量逐步导入到新版本服务,进行小规模验证。同时,ASM提供了详细的监控指标和分布式追踪能力,可以实时观察新版本的运行状况,及时发现和解决问题。当新版本稳定后,再逐步扩大流量比例,最终完全替换老版本。

ASM还提供了一键回滚机制,当新版本出现重大问题时,可以快速将全部流量切回老版本,最大限度地降低服务中断的影响。

4.5.5 小结

ASM为容器化服务的流量治理提供了一套完整的解决方案,覆盖了集群内部、集群入口、多集群、灰度发布等多个关键场景。通过将流量管控能力下沉到基础设施层,ASM可以在不侵入应用程序的前提下,实现对服务流量的细粒度管控、监测和优化,大大简化了服务网格的运维难度。

随着ASM的不断发展和成熟,其必将成为容器化环境下流量治理的关键基础设施,帮助企业构建起高可用、高性能、安全可控的现代化服务网格,加速微服务架构的落地和推广。

#以上关于运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91599.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月22日 下午6:43
下一篇 2024年6月22日 下午7:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注