全部产品
云市场

在容器服务 K8s 集群中灰度发布 Spring Cloud 应用

更新时间:2019-09-12 09:33:27

如需升级部署在容器服务 Kubernetes 集群中的 Spring Cloud 应用,可以使用灰度发布进行小规模验证,验证通过后再全量升级。

使用限制

在容器服务 K8s 集群中灰度发布 Spring Cloud 应用有以下使用限制:

  • 目前仅支持单应用在发布过程中的的灰度流量控制。

  • 入口应用(承接外部流量的第一个应用节点)暂不支持灰度。

    入口应用直接承接外部流量,由于暂不支持对这种流量进行截获和路由,因此对入口应用暂不能提供流量灰度控制。一种理想的模式是搭建微服务网关来作为承接外部流量的“入口应用”,这样所有业务应用都在网关之后,就可以实现流量灰度控制了。

  • 如果应用包含以下原生功能或配置,请勿使用灰度发布,否则发布后该原生功能将出现异常:

    • HPA
    • Rancher
    • Istio
    • 依赖 Deployment.Metadata.Name 或 Deployment.Metadata.Uid 的功能与配置

前提条件:在应用程序中添加支持灰度的依赖

Spring Cloud 应用不具备灰度路由功能,需要在灰度应用上游应用pom.xml文件中添加支持灰度特性的依赖。

  1. <dependency>
  2. <groupId>com.alibaba.edas</groupId>
  3. <artifactId>edas-sc-gray-starter</artifactId>
  4. <version>1.0.0</version>
  5. </dependency>

添加依赖后,路由规则将由 EDAS 管控,客户端(应用)无法定制路由规则。当灰度发布结束后,如果应用需要定制路由规则,可以通过配置管理配置spring.cloud.edas.gray.enabled=false取消灰度特性。

这里的上游应用可能是您自己在微服务环境内搭建的微服务网关(API Gateway)类型应用,例如 Zuul 或者 Spring Cloud Gateway。为了帮助您更好的识别灰度应用和上游应用,下面以示例方式说明:

注意:目前依赖对 Spring Cloud Gateway 的支持还不完善,暂不能提供流量灰度控制。

  • 微服务架构中不包含微服务网关(API Gateway)

    服务拓扑关系为:microservice1 > microservice2 > microservice3

    • 如果要灰度发布 microservice3:为 microservice3 和 microservice2 添加依赖。
    • 如果要灰度发布 microservice2:为 microservice2 和 microservice1 添加依赖。
    • 暂不支持灰度发布 microservice1。
  • 微服务架构中包含微服务网关(API Gateway)

    • 服务拓扑关系为:Zuul > microservice1 > microservice2

      • 如果要灰度发布 microservice2:为 microservice2 和 microservice1 添加依赖。
      • 如果要灰度发布 microservice1:为 microservice1 和 zuul 添加依赖。
    • 服务拓扑关系为:

      1. zuul
      2. microservice1 microservice2
      • 如果要灰度发布 microservice2:为 microservice2、microservice1 和 zuul 添加依赖
      • 如果要灰度发布 microservice1:为 microservice1 和 zuul 添加依赖。

示例场景说明

一个应用包含 10 个应用实例,部署了 Ver.1 版本,现在要将应用升级为 Ver.2 版本。在其中 2 个实例中进行灰度发布,验证 Ver.2 版本,验证通过后,再将剩余 8 个实例分批部署 Ver.2 版本,完成整个应用的升级。

灰度发布流程

  1. 确认当前应用状态

    确认应用的实例数和版本。

  2. 灰度发布

    设置新版本、灰度策略、灰度规则,然后启动灰度发布。

    说明:灰度路由只针对第 1 批发布(灰度发布)有效。如果在变更详情中单击了开始下一批或者回滚,则灰度规则会被清理,失效。

  3. 验证新版本

  4. 分批发布剩余实例

步骤一:确认当前应用状态

确认当前应用的实例数和版本,以决定灰度实例数和之后分批发布的批次。

  1. 登录 EDAS 控制台

  2. 在左侧导航栏中选择应用管理->应用列表,在应用列表页面中单击需要灰度发布的应用名称。

  3. 在应用详情页查看应用现在的版本和实例数。

     应用现状

步骤二:灰度发布

设置新版本、灰度策略、灰度规则,然后启动灰度发布。

  1. 在应用详情页右上角单击部署应用

  2. 部署模式选择页面灰度发布区域单击开始部署

    注意:容器服务 Kubernetes 集群中灰度发布的流量控制暂时只对非入口应用的 Spring Cloud 应用生效。

    部署模式选择

  3. 设置灰度发布的新版本。

    应用的部署方式由首次部署方式决定,根据首次部署方式设置对应的新版本。

    Spring Cloud 应用通常为 JAR 包或镜像,所以本文以 JAR 包或镜像为例。

    • JAR 包部署:上传新版本 JAR 包或者设置新版本 JAR 包的地址,并选择 Java 环境和版本。

      部署应用 JAR

    • 镜像:在镜像仓库中选择新版本的镜像。

  4. 发布策略区域配置发布策略参数。

    右侧的发布策略配置信息会根据配置显示灰度发布流程。

    发布策略

    发布策略参数说明:

    • 灰度数量:灰度发布的应用实例数量。右侧会显示应用当前实例数,为了保证应用稳定性,灰度实例数不能超过应用实例总数的 1/2。如示例中的实例总数为 10,则灰度数量不能大于 5。
    • 灰度后剩余批次:灰度发布后,剩余的应用实例按照设定的批次完成分批发布。
    • 分批间处理方式灰度后剩余批次设置为 2 批或 2 批以上时需要设置,包括自动和手动两种方式。

      • 自动:根据分批时间间隔自动分批发布。
      • 手动:手动触发下一个批次的发布。
    • 分批时间间隔分批间处理方式设置为自动时需要设置,即剩余批次间的发布时间间隔,单位为分钟。

    • 批次内部署间隔:每一批次内,如果应用实例数大于 1,应用实例间的部署时间间隔,单位为秒。

  5. 设置入口流量灰度规则。

    目前支持按内容灰度按比例灰度两种方式设置入口流量灰度规则。

    • 按内容灰度:将符合设置的灰度规则的流量分发到灰度实例上。
    • 按比例灰度:将流量按比例随机分发到灰度实例上。

    两种方式各自的设置步骤如下:

    • 按内容设置入口流量灰度规则

      1. Spring Cloud 灰度规则区域单击按内容灰度,然后单击创建新的入口流量规则

      2. 在规则区域设置参数。

        入口流量规则

        流量控制参数说明:

        • 场景规则:选择满足下列所有规则
        • 条件列表:包含 Cookie、Header 和 Parameter 3 种方式,根据实际需求选择。
          • 参数类型:包含 CookieHeader 值Parameter,根据实际需求选择。
          • 参数:输入参数。
          • 条件:包括 =!=><>=<=白名单按 100 取模
          • :输入参数值。
    • 按比例设置入口流量灰度规则

      1. Spring Cloud 灰度规则区域单击按比例灰度

      2. 在规则区域输入流量比例。格式为 1~100 的正整数,如 40

  6. 根据实际需求,如果需要,可以重新配置启动命令环境变量Hosts 绑定设置健康检查等高级选项。

  7. 设置完成后,单击确定,启动灰度发布。

    灰度发布开始后,控制台会自动跳转到变更详情页面,可以查看灰度发布的实时状态。

  8. 灰度发布启动后,在变更详情页面可以查看已部署实例数(灰度实例数)和总实例数,单击流量查看

  9. 流量监控对话框基于实例视角服务视角验证灰度流量是否分发到灰度实例中及监控数据。

    详情请参见监控灰度流量

步骤三:验证新版本

对灰度实例部署的新版本进行验证。

灰度发布成功后,开始验证新版本。您可以自主控制验证新版本的持续时间。

说明:灰度发布是应用升级的中间态,在未完成整个应用的升级前不能对应用进行如扩容、缩容、删除等生命周期管理操作。

  • 新版本验证通过,可以分批发布剩余实例。
  • 新版本验证未通过,可以回退应用的灰度实例到原有版本。

步骤四:分批发布剩余实例

将剩余实例按发布策略完成分批发布。

  1. 在应用详情页左侧导航栏单击变更记录,然后在变更记录页面灰度发布记录的操作列单击查看

    变更记录

  2. 变更详情页面单击开始下一批,在弹出的确认对话框中单击确定

    注意:灰度路由只针对第 1 批发布(灰度发布)有效。如果在变更详情中单击了开始下一批或者回滚,则灰度规则会被清理,失效。

    本示例中剩余实例会按发布策略分为 3 批,每批间隔 5 分钟,批次内实例间间隔 10 秒自动发布。可以通过变更详情查看发布过程。

    在分批发布过程中,如果发现新版本有问题,也可以在批次发布间隔回滚应用。

结果验证

灰度发布和分批发布后,进入基本信息页面,查看应用的版本和实例数。版本应该升级到 Ver.2 版本,运行实例数应该为 10。至此应用升级成功。

发布后状态