文档首页/ 部署 CodeArts Deploy/ 最佳实践/ 在流水线使用Istio金丝雀灰度发布
更新时间:2026-10-16 GMT+08:00

在流水线使用Istio金丝雀灰度发布

应用场景

服务发布过程中,通常会面临以下问题:

  • 测试环境虽与生产环境尽量保持一致,但受资源配置、网络环境等因素影响,两类环境仍存在客观差异,无法依靠测试环境完成全部业务场景的验证。
  • 若直接在生产环境执行发布后再开展测试,会存在较高业务风险,极易对线上用户造成影响。

方案架构

如何在规避业务风险的前提下,完成现网环境的发布与验证?可通过灰度发布实现。

灰度发布即在生产环境创建与当前线上服务完全一致的工作负载,仅更新该负载的程序包版本,包括业务代码及配置。新创建的灰度负载默认不接入现网流量,不会对线上用户业务造成影响,支持直接在生产环境开展功能验证。待灰度验证通过后,逐步将线上真实业务流量切换至灰度负载;当全部流量完成切换,灰度负载承接全部现网流量、原有线上负载不再处理业务请求,即可安全下线旧工作负载,保留新负载,完成整体发布流程。

灰度发布可根据流量引流方式分为多种模式,例如可一次性完成 100% 流量切换的蓝绿发布,以及依据流量占比或请求内容进行流量导流的金丝雀发布。不同灰度发布模式对集群资源、技术能力要求各不相同,部分模式还要求集群预先安装插件或 Agent 组件。

金丝雀发布具备以下能力:

  • 在生产环境开展无风险的灰度验证;
  • 支持新旧工作负载之间快速完成流量切换;
  • 验证过程中如发现异常,可快速回滚,将线上服务恢复至发布前状态;
  • 支持在流水线界面执行灰度发布操作。

用户在进行系统升级时,常会面临停服部署、无法开展灰度验证等问题。本实践介绍如何在流水线中配置发布策略,在不中断业务运行的前提下,实现系统平滑升级。

前提条件

  • 已有可用项目,如果没有,请先新建项目。
  • 具有创建应用的权限,参考权限管理。
  • 已创建可用流水线,如果没有,请先新建流水线。
  • 服务包含以下资源,并定义为当前版本:
    • 已有CCE集群/Kubernetes集群,示例:cce-demo;
    • 在集群中已完成服务初次上线:集群中已创建无状态工作负载Deployment和服务Service,示例:deployment-demo、service-demo;
    • Deployment和Service资源的相关说明,可参考Deployments说明、Service说明;
    • Service需要配置为关联至Deployment,并检查Service的spec.selector是否仅配置了应用程序的公共标签,如app标签,且该选择器配置值与Deployment的spec.selector.matchLabels.app配置值一致;
      图1 示例Service的spec.selector配置
      图2 示例Deployment的spec.selector配置
    • 集群中已安装和配置Istio;
    • 确定集群已启用自动注入Sidecar代理,且执行部署的命名空间以及负载的的每个Pod都注入了Istio Sidecar代理;
    • 已配置正确的Istio资源VirtualService和DestinationRule,示例:service-demo-virtual-service和service-demo-destination-rule;
    • 支持Istio金丝雀发布的Service服务限制说明可参考手动修复项和自动修复项下的全部内容。

步骤一:流水线创建新阶段应用

  1. 进入CodeArts首页,单击目标项目名称进入项目。
  2. 单击“持续交付 > 流水线”,单击流水线操作“编辑”,进入“任务编排”页面。
  3. 单击“新建阶段”,创建新阶段。
  4. 创建灰度发布任务,如图3所示。

    图3 创建灰度发布任务

    1. 单击“新建任务 > 从空任务新建”,参照下图搜索“灰度起负载”,单击“添加”,输入参数后单击“确认”关闭,参数如表1所示。
      图4 搜索“灰度起负载”
      图5 灰度起负载

      表1 灰度起负载参数说明

      参数项

      说明

      示例

      名称

      显示在流水线任务步骤的名称

      默认

      步骤名称

      步骤名称

      默认

      CCE

      选择已有CCE集群

      cce

      命名空间

      选择CCE云容器引擎中K8S集群/用户自定义Kubernetes中K8S集群的命名空间。

      默认

      服务名称

      选择CCE云容器引擎中/用户自定义Kubernetes中创建的服务名称

      service-demo

      灰度版本号类型

      灰度版本号类型:

      • 自定义:用户自行输入灰度版本号
      • 任务执行时间戳:按照执行时间生成的时间戳
      • 随机数: 随机生成的数字

      默认

      灰度版本

      灰度版本号类型选择为“自定义”时,手动输入灰度版本号

      v2

      镜像地址

      配置需要部署的镜像拉取地址

      默认

    2. 单击上一步创建的任务下的“+”,选择“从空任务新建”,参照下图搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭,参数如表2所示。
      图6 搜索“人工审核”
      图7 人工审核
      表2 人工审核参数说明

      参数项

      说明

      示例

      名称

      显示在流水线任务步骤的名称

      默认

      审核来源

      审核来源:

      • 项目成员:流水线所在项目的成员
      • 项目角色:流水线所在项目配置的角色

      默认

      审核人

      审核来源选择为项目成员时,需配置的审核人员,可多选

      -

      审核模式

      审核来源选择为项目成员时,需配置多个审核人的审核模式:

      • 全部人审核:多人全部审核通过后即为审核通过
      • 任一人审核:多人中任意一人审核通过即为审核通过

      默认

      审核角色

      审核来源选择为项目角色时,需配置的审核角色。注:使用通用权限设置的角色并集进行审批,任一人审批即可通过。(IPD项目中项目创建者不会作为项目经理角色参与审批)

      -

      超时处理

      审核超时处理:

      • 审核失败,流水线终止执行
      • 忽略结果,流水线继续执行

      默认

      审核时长

      可配置审核等待时长:审核时长不能超过3天

      01:00:00

      审核说明

      审核结果补充说明

      -

    3. 单击上一步创建的任务下的“+”,选择“从空任务新建”,参照下图搜索“灰度引流”,单击“添加”,输入参数后单击“确认”关闭,参数如表3所示(其中,引流类型选择为“Istio金丝雀发布”,流量接管选择为“灰度引流”)。

      该步骤支持多次添加,分别配置不同的权重。

      图8 搜索“灰度引流”
      图9 灰度引流
      表3 灰度引流参数说明

      参数项

      说明

      示例

      名称

      显示在流水线任务步骤的名称

      默认

      步骤名称

      步骤名称

      默认

      引流类型

      引流类型:

      • Service蓝绿引流
      • Istio金丝雀发布

      当使用Istio金丝雀发布时,引流类型必选为“Istio金丝雀发布”

      Istio金丝雀发布

      流量接管

      流量接管:

      • 灰度引流
      • 正式发布

      当使用Istio金丝雀发布时,非最后一个灰度引流任务的流量接管类型必选为“灰度引流”,最后一个灰度引流任务的流量接管类型必选为“正式发布”。

      默认

      VirtualService名称

      应用的Istio资源VirtualService名称

      service-demo-virtual-service

      DestinationRule名称

      应用的Istio资源DestinationRule名称

      service-demo-destination-rule

      灰度策略

      流量接管选择为“灰度引流”需配置的灰度引流策略:

      • 基于流量比例: 根据请求流量占比引流到灰度边
      • 基于请求内容-Cookie:根据请求的Cookie内容引流到灰度边
      • 基于请求内容-Header:根据请求的请求头引流到灰度边

      基于流量比例

      灰度版本流量配比(%)

      灰度策略选择为“基于流量比例”时,配置引流到灰度边的流量比例

      20

      Cookie内容

      灰度策略选择为“基于请求内容-Cookie”时,配置引流到灰度边的Cookie内容

      -

      自定义Header

      灰度策略选择为“基于请求内容-Header”时,配置引流到灰度边的请求头内容

      -

    4. 单击上一步中创建的任务下的“+”,选择“从空任务新建”,搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭 。参数如表2所示。
    5. 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“灰度引流”,单击“添加”,输入参数后单击“确认”关闭,参数如表3所示(其中,引流类型选择为“Istio金丝雀发布”,流量接管选择为“正式发布”)。
      图10 灰度引流

    6. 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭 。参数如表2所示。
    7. 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“灰度下线”,单击“添加”,输入参数后单击“确认”关闭。参数如表4所示。
      图11 搜索“灰度下线”
      图12 灰度下线
      表4 灰度下线参数说明

      参数项

      说明

      示例

      名称

      显示在流水线任务步骤的名称

      默认

      步骤名称

      步骤名称

      默认

    8. 单击右上角“保存并退出”,完成金丝雀引流流水线任务创建。

步骤二:(可选)配置回滚能力

如需配置回滚能力,可按照下面步骤配置回滚插件,完整配置如图所示。

图13 配置回滚插件

可配置回滚能力的场景:

  • 发布步骤全部执行成功时需回滚至部署前状态

  • 任一发布步骤执行失败时需回滚至部署前状态

  • 任一发布步骤执行成功后需回滚至部署状态

  1. 编辑步骤一:流水线创建新阶段应用中创建的流水线。
  2. 单击“灰度下线”下的“+”,选择“从空任务新建”,搜索“人工审核”,单击“添加”。
  3. 输入参数后单击“任务配置”,如图14;“执行条件”选择“始终执行(需运行前置任务)”,如图15;单击“确认”关闭 。参数如表2所示。

    图14 任务配置
    图15 人工审核

  4. 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“灰度回滚”,单击“添加”。

    图16 灰度回滚

  5. 输入参数后单击“任务配置”,如图17;“执行条件”选择“前置任务成功时执行”,如图18;单击“确认”关闭。

    图17 任务配置
    图18 执行条件

步骤三:执行流水线

  1. 执行灰度起负载

    单击流水线操作的按钮,选中创建的所有的串行任务,单击“确定”,开始执行灰度部署,执行过程中可根据每个步骤自行验证。

    1. 灰度起负载步骤成功后,可查看命名空间下是否生成新的负载。
      图19 无状态负载
    2. 步骤执行完成后,该命名空间下将生成新旧两组工作负载。切换至 CCE 服务页面,找到目标服务(示例:service‑demo),单击服务操作列的关联实例,在实例列表中确认同时存在新旧工作负载对应的实例。
      图20 服务

  2. 审核通过后,执行灰度引流操作。

    1. 可结合配置的引流策略,在现网验证流量是否按预期分别转发至新版本与旧版本工作负载。
    2. 步骤执行完成后,请检查DestinationRule与VirtualService的 YAML 配置内容,确认与下图保持一致。若同一接口的 v1、v2 版本在返回结果或日志输出上存在差异,可调用服务访问地址发起请求,通过接口返回值或日志信息,校验流量分配是否符合配置的比例要求。
      图21 DestinationRule yaml示例
      图22 VirtualService yaml示例

  3. 发布灰度版本

    1. 按照策略进行引流后,待审核通过,正式发布灰度版本,此时用户到现网查看流量是否全部引流到升级后的最新版本。
    2. 步骤执行完成后,检查DestinationRule 和VirtualService的 YAML 配置,确认与下图内容一致。若同一接口的 v1、v2 版本返回结果或日志输出存在差异,可访问服务访问地址,通过接口返回值或日志信息,确认流量已全部切换至新建的工作负载。
      图23 DestinationRule yaml示例
      图24 VirtualService yaml示例

  4. 执行旧版下线

    1. 正式发布并审核通过后,执行旧版本下线操作。可在现网环境校验业务系统是否已更新为目标新版本。
      图25 工作负载
      图26 服务
    2. 步骤执行后,查看命名空间下是否只有最新的负载保留,旧负载已删除。

步骤四:(可选)执行回滚

步骤三:执行流水线中任一步骤执行成功或失败时,均可回滚。

  1. 流水线步骤跳到回滚插件的上一个人工审核,如图27所示。

    图27 人工审核

  2. 如需回滚,将“审核操作”选择为“通过”,系统将自动运行回滚插件;如不需进行回滚操作,则将“审核操作”选择为“驳回”。
  3. 回滚插件执行完成后,查看目标命名空间,确认仅保留原始工作负载。
  4. 访问服务地址进行验证,确认流量已全部切换回原始工作负载。