通过SAE提供的全链路灰度功能,您可以轻松实现全面的流量控制,而无需更改您的业务代码。本文主要介绍如何配置使用MSE云原生网关配置基于K8s Service的全链路灰度,并实现端到端的灰度部署。
此功能目前处于邀约测试阶段。如果您想使用此功能,请在钉钉群(群号:32874633)联系相关技术人员开通。
名词解释
K8s Service:在Kubernetes(K8s)中的Service是一个核心抽象概念,用于网络和服务发现。Service通过标签选择器(Label Selector)来确定要访问的Pod集合(在SAE中,是确定访问应用的实例),并为这些Pod提供了一个稳定的网络地址和负载均衡机制。
MSE云原生网关:MSE云原生网关是兼容K8s Ingress标准的下一代网关产品,支持ACK容器和Nacos等多种服务发现方式,支持多种认证登录方式快速构建安全防线。
泳道:为相同版本应用定义的一套隔离环境。只有满足了流控路由规则的请求流量才会路由到对应泳道里的打标应用。一个应用可以属于多个泳道,一个泳道可以包含多个应用,应用和泳道是多对多的关系。
泳道组:泳道的集合。泳道组的作用主要是为了区分不同团队或不同场景。
基线环境:未打标的应用属于基线环境,是其他环境的兜底环境。
基于K8s Service实现的服务访问和全链路灰度功能有什么区别?
SAE基于K8s Service提供了以下两种能力,其主要功能和使用场景如下所示:
基于K8s Service实现服务访问:主要用于应用间访问,后端仅包括基线应用的实例。
基于K8s Service实现全链路灰度:主要用于全链路灰度,后端不仅包括基线应用的实例,还包括了该基线应用的所有灰度应用实例,网关会根据实例的灰度标签进行流量路由。
场景示例
本文通过模拟真实的调用链路为您演示使用MSE云原生网关配置基于K8s Service的全链路灰度功能。您无需修改任何业务代码,只需要给入口应用设置流量规则,该流量的标签会通过链路透传到下一个应用中。在每个应用的调用过程中,符合规则的流量会优先调用到对应的灰度应用,如果没有对应的灰度应用则会自动切换回基线应用。
各测试应用如下所示:
测试应用:全链路灰度演示程序.zip,其中包含A、B和C三个后端应用,这三个后端应用既可以用作基线应用的部署,也可以用作灰度应用的部署。
后端应用 | 基线应用 | 灰度应用 | 应用的端口 | 灰度应用上的标签 |
A | sae-a | sae-a-a1 | 20001 | alicloud.service.tag:g1 |
sae-a-a2 | alicloud.service.tag:g2 | |||
B | sae-b | sae-b-b2 | 20002 | alicloud.service.tag:g2 |
C | sae-c | sae-c-c1 | 20003 | alicloud.service.tag:g1 |
sae-c-c2 | alicloud.service.tag:g2 |
流量分发示意图如下所示:
正常流量调用链路:
MSE云原生网关 -> 应用sae-a -> 应用sae-b -> 应用sae-c。
标签流量调用链路:
t=g1流量:云原生API网关 -> 应用sae-a-a1 -> 应用sae-b -> 应用sae-c-c1。
t=g2流量:云原生API网关 -> 应用sae-a-a2 -> 应用sae-b-b2 -> 应用sae-c-c2。
前提条件
开通MSE微服务治理专业版或企业版。
使用限制
全链路灰度仅适用于2023年11月08日起新建的微服务应用。
全链路灰度功能仅支持在新版控制台使用。
由于全链路灰度功能整合了标签路由功能(此处指的是MSE微服务治理的标签路由,与MSE云原生网关的标签路由无关),因此不推荐已经加入全链路灰度的应用配置金丝雀发布和标签路由规则。
1. 部署基线应用并为其开启相关功能
1.1 部署基线应用并开启微服务治理功能
创建sae-a、sae-b和sae-c三个基线应用。本文只介绍创建应用的关键步骤。
登录SAE控制台,在左侧导航栏选择 ,然后选择目标地域和目标命名空间,最后单击创建应用。
在应用基础信息向导页,在基础信息设置区域和容量设置区域配置相关信息,单击下一步:高级设置。
在高级设置向导页,找到并展开微服务治理区域,开启微服务治理功能。
说明本示例中,选择通过上传代码包的形式部署sae-a、sae-b和sae-c三个基线应用。
更多高级功能配置,请参见高级配置。
基于K8s Service的全链路灰度功能适用SAE控制台提供的所有服务注册发现机制。本示例中,注册中心选择的是SAE内置Nacos。
链路中所涉及的基线应用均需开启微服务治理功能。
单击创建应用。
1.2 为基线应用开启基于K8s Service的全链路灰度功能
基于K8s Service的全链路灰度功能依赖于微服务治理功能的支持。在开启该功能前,请确保基线应用已开通微服务治理功能。如未开通,全链路灰度功能将无法使用。
为流量流入MSE云原生网关后的一个基线应用开启基于K8s Service的全链路灰度功能。本示例中,是为sae-a应用开启基于K8s Service的全链路灰度功能。具体步骤,如下所示。
在目标基线应用的基础信息页面,单击部署应用。
在部署应用页面的服务注册中心区域开启基于K8s Service的全链路灰度的功能。
若基线应用以代码包形式部署,请在基础信息设置区域修改应用的版本号。若以镜像形式部署,则无需修改版本号。本示例中,基线应用是通过代码包部署的,因此需要修改版本号。
如果您需要修改其他的参数配置,请参见高级配置。
如果您需要设置发布策略,请参见设置发布策略。
说明开启基于K8s Service配置全链路灰度的功能后,需要配置端口(自定义)、容器端口和协议。本示例中,容器端口请参见场景示例,协议选择为TCP。
单击确定。
2. 部署灰度应用
基于基线应用部署灰度应用:
其中基线应用sae-a部署两个灰度应用,分别为sae-a-a1应用和sae-a-a2应用。
其中基线应用sae-b部署一个灰度应用,为sae-b-b1。
其中基线应用sae-c部署两个灰度应用,分别为sae-c-c1应用和sae-c-c2应用。
具体操作步骤,如下所示。
在应用列表页面,单击基线应用右侧的
图标,然后单击创建灰度应用。
说明如果您没有开启基线应用的微服务治理功能,则无法创建灰度应用。
在应用基本信息向导页,配置以下信息,然后单击下一步:高级设置。
在基础信息设置区域,设置灰度应用名称并选择以镜像或代码包的方式部署灰度应用。
说明灰度应用的命名空间配置会自动继承基线应用的相关配置,因此您无需对其进行额外修改。
应用部署方式也会自动继承基线应用的部署方式。在本示例中,您无需重新上传代码包进行部署,但在实际的生产环境中,请根据需要进行相应的配置调整。
在灰度标签区域,设置标签值。本示例灰度应用标签的配置,请参见场景示例。
在容量设置区域,配置单实例规格和实例数。
在高级设置向导页,按需配置高级功能。
灰度应用会继承基线应用的Nacos注册中心和K8s Service注册发现的配置,您无需进行修改。
单击创建应用。
3. 创建MSE云原生网关和网关路由
3.1 创建MSE云原生网关实例
网关实例创建完成后,会代购一个NLB实例,此实例提供的DNS名称将作为访问端点使用。
登录MSE管理控制台,在左侧导航栏 ,然后单击创建网关。
重要MSE云原生网关实例和基线应用可以使用同一个VPC,也可以使用不同的VPC。如果这些实例不在同一个VPC中,您需要自行配置网络,确保它们之间能够互相通信,例如,您可以使用阿里云的云企业网或其他网络连接产品来实现跨VPC通信。
单击目标实例操作列的路由配置,然后单击创建路由。
3.2 创建域名、来源、服务和路由
创建域名
单击域名页签,然后单击创建域名。
在创建域名面板,选择协议(HTTP或HTTPS协议)并填写完整域名,然后单击确定。
本示例使用的是HTTP协议和测试域名。如果您选择的是HTTPS协议,需要配置证书和高级设置。具体操作,请参见创建域名。
创建来源
单击来源页签,然后单击创建来源。
服务来源支持SAE内置注册中心类型、MSE Nacos和SAE Kubernetes服务三种类型。本示例以SAE Kubernetes服务为例进行演示说明。
在创建来源面板,来源类型选择为SAE Kubernetes服务,命名空间选择为基线应用所在的命名空间,然后单击确定。
创建服务
单击服务页签,然后单击创建服务。
支持以下三种服务来源。本示例以SAE注册中心为例进行演示说明。
SAE Kubernetes服务
服务来源选择SAE Kubernetes服务。
命名空间会自动匹配,您无需进行额外选择。
在服务列表区域选择后端服务,格式为
基线应用名称-gray-命名空间ID
。说明如果您的基线应用是基于K8s Service来实现服务访问的,则在服务名称对应的下拉框中存在两个服务名称,服务名称应选择全链路灰度服务名称前缀。其区别如下:
应用访问服务名称前缀:格式为
基线应用名称-命名空间ID
,如sae-a-test
。全链路灰度服务名称前缀:格式为
基线应用名称-gray-命名空间ID
,如sae-a-gray-test
。
单击确定。
SAE注册中心
服务来源选择SAE注册中心。
命名空间会自动匹配,您无需进行额外选择。
在服务列表区域选择流量流入MSE云原生网关后的一个基线。本示例中为sc-A。
单击确定。
MSE Nacos
服务来源选择MSE Nacos。
勾选指定Nacos实例。
在nacos来源列表中选择关联了基线应用的Nacos实例。
命名空间选择关联了基线应用的Nacos实例命名空间。
public为Nacos实例的默认命名空间,此命名空间无法在SAE侧使用,所以此处不能选择public命名空间。
在服务列表区域选择所有的基线应用。
单击确定。
服务创建完成后,需要注意服务的健康检查状态是否为健康。
健康检查如果未通过,请将鼠标悬停在异常上,然后根据异常提示进行排查。
创建路由
单击路由页签,然后单击创建路由。本文只介绍关键步骤。
说明本文中的配置仅适用于本示例。在生产环境中,请根据实际需求进行相应的配置调整。
自定义路由名称。
路径(Path)选择为前缀是
/
。路由指向选择为单服务。
选择后端服务的服务名称、服务协议和服务端口。
单击保存。
路由创建完成后,单击路由名称,单击概览页签的发布,然后在弹出的发布对话框单击确定。
4. 创建泳道组和泳道
4.1 创建泳道组
云原生API网关及路由创建成功后,返回SAE控制台,在左侧导航栏选择 ,在全链路灰度页面选择目标命名空间,然后单击创建泳道组及泳道。
在弹出的创建泳道组面板,配置以下参数信息,然后单击确定。
自定义泳道组名称。
入口类型选择MSE云原生网关。
泳道组流量入口选择在前提条件中创建的云原生API网关实例。
泳道组涉及应用选择所有的基线应用。
4.2 创建泳道
在整个泳道组内,支持创建基于按内容灰度的泳道和基于按比例灰度的泳道。然而,一旦第一个泳道创建成功,后续创建的泳道将无法更改灰度模式。
以下表格中的示例均为本文场景的配置示例。在实际的生产环境中,请根据具体需求进行相应的调整。
创建基于按内容灰度的泳道
按照以下说明创建两个泳道。
在全链路灰度页面,单击点击创建第一个分流泳道。
重要第一个泳道创建完成后,单击创建泳道来创建第二个泳道。
在弹出的创建泳道面板,配置以下参数信息,然后单击确定。
配置项
示例
说明
泳道名称
第一个泳道名称:test-1
第二个泳道名称:test-2
自定义泳道名称,每条泳道名称不能重复。
泳道标签
第一个泳道的标签:g1
第二个泳道的标签:g2
在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。
泳道状态
两个泳道的状态均为开启。
泳道状态是默认开启的。
灰度模式
两个泳道的灰度模式均选择按内容灰度。
选择按内容灰度,此模式的具体说明,请参见控制台。
灰度条件
第一个泳道的灰度条件:
以下条件同时满足
参数类型:
Header
参数:
t
条件:
==
值:
g1
第二个泳道的灰度条件:
以下条件同时满足
参数类型:
Header
参数:
t
条件:
==
值:
g2
当请求满足所配置的灰度条件时,会被打上前面指定的泳道标签。
支持以下两种筛选条件:
以下条件同时满足:当请求都满足下面的条件时,才会被打上灰度标签。
以下条件任意满足:当请求满足下面的任意一个条件时,都会被打上灰度标签。
支持通过以下几个参数字段进行条件筛选:
参数类型:支持Header、Cookie和Parameter。
参数:支持自定义。
条件:支持
==
、!=
、in
、百分比、正则匹配和前缀匹配。值:支持自定义。
创建基于按比例灰度的泳道
按照以下说明创建两个泳道。
在全链路灰度页面,单击点击创建第一个分流泳道。
重要第一个泳道创建完成后,单击创建泳道来创建第二条泳道。
在弹出的创建泳道面板,配置以下参数信息,然后单击确定。
配置项
示例
说明
泳道名称
第一个泳道名称:test-1
第二个泳道名称:test-2
自定义泳道名称,每条泳道名称不能重复。
泳道标签
第一个泳道的标签:g1
第二个泳道的标签:g2
在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。
泳道状态
两个泳道的状态均为开启。
泳道状态是默认开启的。
灰度模式
两个泳道的灰度模式均选择按比例灰度。
选择按比例灰度,此模式的具体说明,请参见控制台。
流量比例
第一个泳道的流量比例:50%
第二个泳道的流量比例:50%
为所选路由或Path设置流量比例,在默认情况下,泳道内所有的路由或Path都将使用统一的流量比例。
5. 结果验证
5.1 访问验证
返回MSE管理控制台,在左侧导航栏选择 ,然后在网关列表页面单击目标实例ID。
在目标实例的基本概览页面,单击接入点页签。
复制NLB实例入口地址列的DNS名称,在浏览器进行访问测试。
本示例中使用域名访问的URL格式为:
http://<DNS名称>/<访问路径>
。如:http://nlb-******.cn-hangzhou.nlb.aliyuncssl.com/a
。重要在生产环境中,建议您使用自有域名,通过CNAME解析的方式将自有域名指向NLB实例提供的DNS名称。
5.2 灰度流量验证
您可以通过NLB实例暴露出的弹性公网IP地址进行访问验证。
按内容灰度流量验证
使用curl命令测试基线流量:
#测试命令 curl 8.130.XX.XX/a # 测试结果 A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
使用curl命令测试灰度流量,以参数类型选择Header为例:
# 测试命令 curl 8.130.XX.XX/a -H "tag: ${tag}" # 测试结果 A${tag}[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C${tag}[192.168.XX.XX]
说明当参数带上
tag: ${tag}
时,会命中灰度标签,并向后透传。
按比例灰度流量验证
使用curl
命令进行验证。
#测试命令
curl 8.130.XX.XX/a
# 测试结果
A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
A${tag}[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C${tag}[192.168.XX.XX]
5.3 微服务治理可观测
在SAE控制台的全链路灰度页面,在泳道组及涉及的应用区域单击目标应用,在应用QPS监控区域,可查看对应泳道基线版本和灰度版本的流量情况。选择回放时间,展示所选时间对应的指标数据。
您也可以在应用QPS监控区域单击流量详情,查看更为详细的信息。