基于K8s Service实现全链路灰度

通过SAE提供的全链路灰度功能,您可以轻松实现全面的流量控制,而无需更改您的业务代码。本文主要介绍如何使用云原生API网关配置基于K8s Service的全链路灰度,并实现端到端的灰度部署。

名词解释

  • K8s Service:Kubernetes(K8s)中的Service是一个核心抽象概念,用于网络和服务发现。Service通过标签选择器(Label Selector)来确定要访问的Pod集合(在SAE中,是确定访问应用的实例),并为这些Pod提供了一个稳定的网络地址和负载均衡机制。具体介绍,请参见Service管理

  • 云原生API网关:云原生API网关是兼容K8s Ingress标准的下一代网关产品,将传统的API网关、流量网关、微服务网关、安全网关功能合并,支持ACK容器服务和Nacos等多种服务发现方式,支持多种认证登录方式快速构建安全防线。具体介绍,请参见什么是云原生API网关

  • 泳道:为相同版本应用定义的一套隔离环境。只有满足了流控路由规则的请求流量才会路由到对应泳道里的打标应用。一个应用可以属于多个泳道,一个泳道可以包含多个应用,应用和泳道是多对多的关系。

  • 泳道组:泳道的集合。泳道组的作用主要是为了区分不同团队或不同场景。

  • 基线环境:未打标的应用属于基线环境,是其他环境的兜底环境。

基于K8s Service实现的服务访问和全链路灰度功能有什么区别?

SAE基于K8s Service提供了以下两种能力,其主要功能和使用场景如下所示:

  • 基于K8s Service实现服务访问:主要用于应用间访问,后端仅包括基线应用的实例。

  • 基于K8s Service实现全链路灰度:主要用于全链路灰度,后端不仅包括基线应用的实例,还包括了该基线应用的所有灰度应用实例,网关会根据实例的灰度标签进行流量路由。

场景示例

本文通过模拟真实的调用链路为您演示基于K8s Service以实现全链路灰度功能。您无需修改任何业务代码,只需要给入口应用设置流量规则,该流量的标签会通过链路透传到下一个应用中。在每个应用的调用过程中,符合规则的流量会优先调用到对应的灰度应用,如果没有对应的灰度应用则会自动切换回基线应用。

各测试应用如下所示:

测试应用:全链路灰度演示程序.zip,其中包含A、BC三个后端应用,这三个后端应用既可以用作基线应用的部署,也可以用作灰度应用的部署。

后端应用

基线应用

灰度应用

应用的端口

灰度应用上的标签

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

流量分发示意图如下所示:

image

正常流量调用链路:

云原生API网关 -> 应用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。

前提条件

重要

云原生API网关实例和基线应用可以使用同一个VPC,也可以使用不同的VPC。如果这些实例不在同一个VPC中,您需要自行配置网络,确保它们之间能够互相通信,例如,您可以使用阿里云的云企业网或其他网络连接产品来实现跨VPC通信。

使用限制

  • 全链路灰度仅适用于20231108日起新建的微服务应用。

  • 全链路灰度功能仅支持在新版控制台使用。

  • 由于全链路灰度功能整合了标签路由功能(此处指的是MSE微服务治理的标签路由,与MSE云原生网关的标签路由无关),因此不推荐已经加入全链路灰度的应用配置金丝雀发布和标签路由规则。

    限制项与限制值

    限制项

    限制值

    备注

    网关服务来源类型

    MSE NacosK8s Service

    基于云原生API网关的全链路灰度目前只支持MSE NacosK8s Service两种来源。

    云原生API网关版本

    大于等于2.0.1版本

    对于2.0.1以下的版本,需要在云原生API网关控制台实例页面手动升级引擎版本。

    Spring Cloud版本

    Spring Cloud Edgware及以上版本

    无。

    Dubbo版本

    2.5.3~2.7.8

    Dubbo 3.0及以上版本当前处于灰度中,如有场景需求,请提工单联系MSE技术支持。

    客户端类型

    • Resttemplate

    • Spring Cloud OpenFeign

    无。

    Java应用JDK版本

    目前支持JDK 6、7、8版本应用接入

    JDK 11版本当前处于灰度中,如有场景需求,请提工单联系MSE技术支持。

    负载均衡类型

    • Ribbon 2.0.x及以上版本

    • LoadBalancer 3.0.x及以上版本

    无。

    Spring Cloud Gateway版本

    Spring Cloud Gateway 2.1.0.RELEASE及以上版本

    无。

1. 部署基线应用并为其开启相关功能

1.1 部署基线应用

创建sae-a、sae-bsae-c三个基线应用。本文只介绍关键步骤,具体的操作步骤,请参见应用部署

  1. 登录SAE控制台,在左侧导航栏选择应用管理 > 应用列表,然后选择目标地域和目标命名空间,最后单击创建应用

    xxQdc1LHvq

  2. 应用基础信息向导页,在基础信息设置区域和容量设置区域配置相关信息,单击一键创建应用

    说明
    • 本示例中,选择通过上传代码包的形式部署sae-a、sae-bsae-c三个基线应用。

    • 如果您需要配置高级设置,单击下一步:高级设置,配置完成后单击创建应用。配置高级设置的具体信息,请参见高级配置

    • 基于K8s Service的全链路灰度功能适用SAE控制台提供的所有服务注册发现机制。本示例中,注册中心选择的是SAE内置Nacos

1.2 为基线应用开通微服务治理功能

重要

全链路灰度为MSE微服务治理专业版功能,链路中所有涉及的应用均需开启微服务治理功能才能使用。

应用列表页面,单击应用名称,在左侧导航栏选择微服务治理 > 应用概览,单击开启微服务治理

说明
  • 应用开通的微服务治理功能的版本与MSE版本保持一致。

  • 如果您的应用未接入MSE商业版,请参见一键升级微服务治理功能文档一键升级微服务治理功能。

  • 开启过程应用的所有实例将触发一次重启,请在业务低峰期进行操作。

3JVeLD4e3p

开启过程需要1~2分钟,请您耐心等待。

1.3 为基线应用开启基于K8s Service的全链路灰度功能

重要

基于K8s Service的全链路灰度功能依赖于微服务治理功能的支持。在开启该功能前,请确保基线应用已开通微服务治理功能。如未开通,全链路灰度功能将无法使用。开启微服务治理功能的详细步骤,请参见为基线应用开通微服务治理功能

为流量流入API网关后的第一个基线应用开启基于K8s Service的全链路灰度功能。本示例中,是为sae-a应用开启基于K8s Service的全链路灰度功能。具体步骤,如下所示。

  1. 在目标基线应用的基础信息页面,单击部署应用

  2. 部署应用页面的服务注册中心区域开启基于K8s Service的全链路灰度的功能。

    若基线应用以代码包形式部署,请在基础信息设置区域修改应用的版本号。若以镜像形式部署,则无需修改版本号。本示例中,基线应用是通过代码包部署的,因此需要修改版本号。
    如果您需要修改其他的参数配置,请参见高级配置
    如果您需要设置发布策略,请参见设置发布策略

    lrzRa17LJA

    说明

    开启基于K8s Service配置全链路灰度的功能后,需要配置端口协议。本示例中,应用端口请参见场景示例协议选择为TCP

  3. 单击确定

2. 部署灰度应用

基于基线应用部署灰度应用:

  • 其中基线应用sae-a部署两个灰度应用,分别为sae-a-a1应用和sae-a-a2应用。

  • 其中基线应用sae-b部署一个灰度应用,为sae-b-b1。

  • 其中基线应用sae-c部署两个灰度应用,分别为sae-c-c1应用和sae-c-c2应用。

具体操作步骤,如下所示。

  1. 应用列表页面,单击基线应用右侧的CBDwvZhrJR图标,然后单击创建灰度应用

    说明

    如果您没有开启基线应用的微服务治理功能,则无法创建灰度应用。开启步骤,请参见为基线应用开通微服务治理功能

  2. 应用基本信息向导页,配置以下信息,然后单击下一步:高级设置

    1. 基础信息设置区域,设置灰度应用名称并选择以镜像或代码包的方式部署灰度应用。具体操作,请参见应用部署

      说明
      • 灰度应用的命名空间配置会自动继承基线应用的相关配置,因此您无需对其进行额外修改。

      • 应用部署方式也会自动继承基线应用的部署方式。在本示例中,您无需重新上传代码包进行部署,但在实际的生产环境中,请根据需要进行相应的配置调整。

    2. 灰度标签区域,设置标签。本示例灰度应用标签的配置,请参见场景示例

      cpMNLt6IRK

    3. 容量设置区域,配置单实例规格实例数

  3. 高级设置向导页,按需配置高级设置。具体操作,请参见高级配置

    灰度应用会继承基线应用的Nacos注册中心和K8s Service注册发现的配置,您无需进行修改。
  4. 单击创建应用

3. 创建云原生API网关路由

3.1 创建云原生API网关路由

  1. 灰度应用创建完成后,返回应用列表页面,单击左侧导航栏的命名空间,然后在命名空间页面,单击基线应用和灰度应用所在的命名空间名称。

  2. 进入目标命名空间后,在左侧导航栏单击网关路由,然后单击创建网关路由

  3. 创建路由页面创建云原生API网关路由。本文只介绍关键步骤,详细配置说明,请参见为应用设置路由规则(API网关)

    说明

    本文中的配置仅适用于本示例。在生产环境中,请根据实际需求进行相应的配置调整。

    1. 选择网关类型云原生API网关

    2. 网关实例选择在前提条件中已创建的网关实例。

    3. 路径(Path)选择为前缀是/

    4. 服务来源选择K8S Service

      fXbRO9BXgJ

    5. 使用场景选择单服务场景。

    6. 后端服务应用名称选择为sae-a,服务名称选择为sae-a-****-gray服务协议HTTP,服务端口20001

      suOr8w4pqM

      说明

      如果您的基线应用是基于K8s Service来实现服务访问的,则在服务名称对应的下拉框中存在两个服务名称,服务名称应选择全链路灰度服务名称前缀。其区别如下:

      • 应用访问服务名称前缀:格式为基线应用名称-命名空间ID,如sae-a-beijing-test

      • 全链路灰度服务名称前缀:格式为基线应用名称-命名空间ID-gray,如sae-a-beijing-test-gray

  4. 单击保存

3.2 查看服务是否创建成功

云原生API网关路由创建成功后,会在前提条件中创建的云原生API网关实例中自动创建来源于SAE Kubernetes的服务。查询服务的具体方式,请参见查看服务

AIuuCARJi9

需要您注意以下几点:

  • 健康检查是否通过,如果未通过,请将鼠标悬停在异常上,然后根据异常提示进行排查。

  • 服务地址为已关联的基线应用和灰度应用的实例IP地址。

  • 服务来源为SAE Kubernetes服务。

4. 创建泳道组及泳道

4.1 创建泳道组

  1. 云原生API网关创建成功后,返回命名空间页面,在左侧导航栏选择微服务治理 > 全链路灰度,在全链路灰度页面选择目标命名空间,然后单击创建泳道组及泳道

    wCisG7DnY9

  2. 在弹出的创建泳道组面板,配置以下参数信息,然后单击确定

    1. 自定义泳道组名称

    2. 入口类型选择云原生API网关

    3. 泳道组流量入口选择在前提条件中创建的云原生API网关实例。

    4. 泳道组涉及应用选择所有的基线应用。

    8IxrzCljwr

4.2 创建泳道

在整个泳道组内,支持创建基于按内容灰度的泳道和基于按比例灰度的泳道。然而,一旦第一个泳道创建成功,后续创建的泳道将无法更改灰度模式。

以下表格中的示例均为本文场景的配置示例。在实际的生产环境中,请根据具体需求进行相应的调整。

创建基于按内容灰度的泳道

按照以下说明创建两个泳道。

  1. 全链路灰度页面,单击点击创建第一个分流泳道

    重要

    第一个泳道创建完成后,单击创建泳道来创建第二个泳道。

  2. 在弹出的创建泳道面板,配置以下参数信息,然后单击确定

    X34JYON2rm

    配置项

    示例

    说明

    泳道名称

    • 第一个泳道名称:test-1

    • 第二个泳道名称:test-2

    自定义泳道名称,每条泳道名称不能重复。

    泳道标签

    • 第一个泳道的标签:g1

    • 第二个泳道的标签:g2

    在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。

    泳道状态

    两个泳道的状态均为开启。

    泳道状态是默认开启的。

    灰度模式

    两个泳道的灰度模式均选择按内容灰度

    选择按内容灰度,此模式的具体说明,请参见控制台。

    灰度条件

    • 第一个泳道的灰度条件:

      • 以下条件同时满足

      • 参数类型:Header

      • 参数:t

      • 条件:==

      • 值:g1

    • 第二个泳道的灰度条件:

      • 以下条件同时满足

      • 参数类型:Header

      • 参数:t

      • 条件:==

      • 值:g2

    当请求满足所配置的灰度条件时,会被打上前面指定的泳道标签。

    • 支持以下两种筛选条件:

      • 以下条件同时满足:当请求都满足下面的条件时,才会被打上灰度标签。

      • 以下条件任意满足:当请求满足下面的任意一个条件时,都会被打上灰度标签。

    • 支持通过以下几个参数字段进行条件筛选:

      • 参数类型:支持HeaderCookieParameter

      • 参数:支持自定义。

      • 条件:支持==!=in、百分比、正则匹配和前缀匹配。

      • 值:支持自定义。

创建基于按比例灰度的泳道

按照以下说明创建两个泳道。

  1. 全链路灰度页面,单击点击创建第一个分流泳道

    重要

    第一个泳道创建完成后,单击创建泳道来创建第二条泳道。

  2. 在弹出的创建泳道面板,配置以下参数信息,然后单击确定

    8hiyAU8B9d

    配置项

    示例

    说明

    泳道名称

    • 第一个泳道名称:test-1

    • 第二个泳道名称:test-2

    自定义泳道名称,每条泳道名称不能重复。

    泳道标签

    • 第一个泳道的标签:g1

    • 第二个泳道的标签:g2

    在下拉列表中选择需要给请求打标的标签值,此标签为创建灰度应用时配置的标签。

    泳道状态

    两个泳道的状态均为开启。

    泳道状态是默认开启的。

    灰度模式

    两个泳道的灰度模式均选择按比例灰度

    选择按比例灰度,此模式的具体说明,请参见控制台。

    流量比例

    • 第一个泳道的流量比例:50%

    • 第二个泳道的流量比例:50%

    为所选路由或Path设置流量比例,在默认情况下,泳道内所有的路由或Path都将使用统一的流量比例。

5. 结果验证

5.1 访问测试

  1. 登录云原生API网关控制台,在左侧导航栏单击实例,在顶部菜单栏选择目标地域,然后单击您在前提条件中创建的API网关实例ID。

  2. API网关实例的概览页面,单击接入点页签,然后在访问域名及IP页签查看控制台免费提供的访问域名实例IP

    x70nyGpb1Q

    重要
    • 访问域名是网关实例的访问入口,在生产使用中,您需要将业务域名通过DNS服务CNAME至访问域名。直接通过访问域名访问每天有1000次访问限制,可用于测试,请勿直接用于生产。

    • 实例IP是网关对外提供服务的IP地址,但不建议您直接将业务域名映射到实例IP上。推荐您采用业务域名CNAME至访问域名的使用方式,访问域名会在多个IP间负载均衡,避免单IP单可用区故障。实例IP仅建议您在申请域名注册或配置IP黑白名单时使用。

  3. 复制访问域名或公网IP,在浏览器进行访问测试。

    本示例中使用域名访问的URL格式为:http://<访问域名>/<访问路径>。如:http://env-cu2c******/a
    本示例中使用公网IP访问的URL格式为:http://<公网:80>/<访问路径>,如:http://8.147.XX.XX:80/a

    wIcsfE5KT3

5.2 灰度流量验证

说明

您可以通过云原生API网关暴露出的公网IP地址进行访问验证。但是在生产环境中,不建议直接将业务域名映射到公网IP上,推荐将业务域名CNAME至访问域名进行使用。

按内容灰度流量验证

  1. 使用curl命令测试基线流量:

    #测试命令
    curl 8.130.XX.XX/a
    # 测试结果
    A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
  2. 使用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监控区域单击流量详情,查看更为详细的信息。

KBDJ5bDjLZ