在流水线使用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服务限制说明可参考手动修复项和自动修复项下的全部内容。
步骤一:流水线创建新阶段应用
- 进入CodeArts首页,单击目标项目名称进入项目。
- 单击“持续交付 > 流水线”,单击流水线操作“编辑”,进入“任务编排”页面。
- 单击“新建阶段”,创建新阶段。
- 创建灰度发布任务,如图3所示。
- 单击“新建任务 > 从空任务新建”,参照下图搜索“灰度起负载”,单击“添加”,输入参数后单击“确认”关闭,参数如表1所示。 图4 搜索“灰度起负载”
图5 灰度起负载
表1 灰度起负载参数说明 参数项
说明
示例
名称
显示在流水线任务步骤的名称
默认
步骤名称
步骤名称
默认
CCE
选择已有CCE集群
cce
命名空间
选择CCE云容器引擎中K8S集群/用户自定义Kubernetes中K8S集群的命名空间。
默认
服务名称
选择CCE云容器引擎中/用户自定义Kubernetes中创建的服务名称
service-demo
灰度版本号类型
灰度版本号类型:
- 自定义:用户自行输入灰度版本号
- 任务执行时间戳:按照执行时间生成的时间戳
- 随机数: 随机生成的数字
默认
灰度版本
灰度版本号类型选择为“自定义”时,手动输入灰度版本号
v2
镜像地址
配置需要部署的镜像拉取地址
默认
- 单击上一步创建的任务下的“+”,选择“从空任务新建”,参照下图搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭,参数如表2所示。 图6 搜索“人工审核”
图7 人工审核
表2 人工审核参数说明 参数项
说明
示例
名称
显示在流水线任务步骤的名称
默认
审核来源
审核来源:
- 项目成员:流水线所在项目的成员
- 项目角色:流水线所在项目配置的角色
默认
审核人
审核来源选择为项目成员时,需配置的审核人员,可多选
-
审核模式
审核来源选择为项目成员时,需配置多个审核人的审核模式:
- 全部人审核:多人全部审核通过后即为审核通过
- 任一人审核:多人中任意一人审核通过即为审核通过
默认
审核角色
审核来源选择为项目角色时,需配置的审核角色。注:使用通用权限设置的角色并集进行审批,任一人审批即可通过。(IPD项目中项目创建者不会作为项目经理角色参与审批)
-
超时处理
审核超时处理:
- 审核失败,流水线终止执行
- 忽略结果,流水线继续执行
默认
审核时长
可配置审核等待时长:审核时长不能超过3天
01:00:00
审核说明
审核结果补充说明
-
- 单击上一步创建的任务下的“+”,选择“从空任务新建”,参照下图搜索“灰度引流”,单击“添加”,输入参数后单击“确认”关闭,参数如表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”时,配置引流到灰度边的请求头内容
-
- 单击上一步中创建的任务下的“+”,选择“从空任务新建”,搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭 。参数如表2所示。
- 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“灰度引流”,单击“添加”,输入参数后单击“确认”关闭,参数如表3所示(其中,引流类型选择为“Istio金丝雀发布”,流量接管选择为“正式发布”)。 图10 灰度引流
- 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“人工审核”,单击“添加”,输入参数后单击“确认”关闭 。参数如表2所示。
- 单击上一步创建的任务下的“+”,选择“从空任务新建”,搜索“灰度下线”,单击“添加”,输入参数后单击“确认”关闭。参数如表4所示。 图11 搜索“灰度下线”
图12 灰度下线
- 单击右上角“保存并退出”,完成金丝雀引流流水线任务创建。
- 单击“新建任务 > 从空任务新建”,参照下图搜索“灰度起负载”,单击“添加”,输入参数后单击“确认”关闭,参数如表1所示。
步骤二:(可选)配置回滚能力
如需配置回滚能力,可按照下面步骤配置回滚插件,完整配置如图所示。
可配置回滚能力的场景:
步骤三:执行流水线
- 执行灰度起负载
单击流水线操作的
按钮,选中创建的所有的串行任务,单击“确定”,开始执行灰度部署,执行过程中可根据每个步骤自行验证。- 灰度起负载步骤成功后,可查看命名空间下是否生成新的负载。 图19 无状态负载
- 步骤执行完成后,该命名空间下将生成新旧两组工作负载。切换至 CCE 服务页面,找到目标服务(示例:service‑demo),单击服务操作列的关联实例,在实例列表中确认同时存在新旧工作负载对应的实例。 图20 服务

- 灰度起负载步骤成功后,可查看命名空间下是否生成新的负载。
- 审核通过后,执行灰度引流操作。
- 可结合配置的引流策略,在现网验证流量是否按预期分别转发至新版本与旧版本工作负载。
- 步骤执行完成后,请检查DestinationRule与VirtualService的 YAML 配置内容,确认与下图保持一致。若同一接口的 v1、v2 版本在返回结果或日志输出上存在差异,可调用服务访问地址发起请求,通过接口返回值或日志信息,校验流量分配是否符合配置的比例要求。 图21 DestinationRule yaml示例
图22 VirtualService yaml示例
- 发布灰度版本
- 按照策略进行引流后,待审核通过,正式发布灰度版本,此时用户到现网查看流量是否全部引流到升级后的最新版本。
- 步骤执行完成后,检查DestinationRule 和VirtualService的 YAML 配置,确认与下图内容一致。若同一接口的 v1、v2 版本返回结果或日志输出存在差异,可访问服务访问地址,通过接口返回值或日志信息,确认流量已全部切换至新建的工作负载。 图23 DestinationRule yaml示例
图24 VirtualService yaml示例
- 执行旧版下线
- 正式发布并审核通过后,执行旧版本下线操作。可在现网环境校验业务系统是否已更新为目标新版本。 图25 工作负载
图26 服务
- 步骤执行后,查看命名空间下是否只有最新的负载保留,旧负载已删除。
- 正式发布并审核通过后,执行旧版本下线操作。可在现网环境校验业务系统是否已更新为目标新版本。









