# 在流水线使用Istio金丝雀灰度发布
#### 应用场景
服务发布过程中，通常会面临以下问题：
- 测试环境虽与生产环境尽量保持一致，但受资源配置、网络环境等因素影响，两类环境仍存在客观差异，无法依靠测试环境完成全部业务场景的验证。
- 若直接在生产环境执行发布后再开展测试，会存在较高业务风险，极易对线上用户造成影响。
 
#### 方案架构
如何在规避业务风险的前提下，完成现网环境的发布与验证？可通过灰度发布实现。
灰度发布即在生产环境创建与当前线上服务完全一致的工作负载，仅更新该负载的程序包版本，包括业务代码及配置。新创建的灰度负载默认不接入现网流量，不会对线上用户业务造成影响，支持直接在生产环境开展功能验证。待灰度验证通过后，逐步将线上真实业务流量切换至灰度负载；当全部流量完成切换，灰度负载承接全部现网流量、原有线上负载不再处理业务请求，即可安全下线旧工作负载，保留新负载，完成整体发布流程。
灰度发布可根据流量引流方式分为多种模式，例如可一次性完成 100% 流量切换的蓝绿发布，以及依据流量占比或请求内容进行流量导流的金丝雀发布。不同灰度发布模式对集群资源、技术能力要求各不相同，部分模式还要求集群预先安装插件或 Agent 组件。
金丝雀发布具备以下能力：
- 在生产环境开展无风险的灰度验证；
- 支持新旧工作负载之间快速完成流量切换；
- 验证过程中如发现异常，可快速回滚，将线上服务恢复至发布前状态；
- 支持在流水线界面执行灰度发布操作。
用户在进行系统升级时，常会面临停服部署、无法开展灰度验证等问题。本实践介绍如何在流水线中配置发布策略，在不中断业务运行的前提下，实现系统平滑升级。
#### 前提条件
- 已有可用项目，如果没有，请先[新建项目](https://support.huaweicloud.com/usermanual-projectman/projectman_ug_2001.html)。
- 具有创建应用的权限，参考[权限管理](https://support.huaweicloud.com/usermanual-deployman/deployman_hlp_0035.html)。
- 已创建可用流水线，如果没有，请先[新建流水线](https://support.huaweicloud.com/usermanual-pipeline/pipeline_01_0068.html)。
- 服务包含以下资源，并定义为当前版本：
  - 已有CCE集群/Kubernetes集群，示例：cce-demo；
  
  - 在集群中已完成服务初次上线：集群中已创建无状态工作负载Deployment和服务Service，示例：deployment-demo、service-demo；
  
  - Deployment和Service资源的相关说明，可参考[Deployments说明](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/)、[Service说明](https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/)；
  
  - Service需要配置为关联至Deployment，并检查Service的spec.selector是否仅配置了应用程序的公共标签，如app标签，且该选择器配置值与Deployment的spec.selector.matchLabels.app配置值一致；
    图1示例Service的spec.selector配置   
    ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002660135719.png "点击放大")
    图2示例Deployment的spec.selector配置   
    ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002630017030.png "点击放大") 
  
  - 集群中已安装和配置Istio；
  
  - 确定集群已启用自动注入Sidecar代理，且执行部署的命名空间以及负载的的每个Pod都注入了Istio Sidecar代理；
  
  - 已配置正确的Istio资源VirtualService和DestinationRule，示例：service-demo-virtual-service和service-demo-destination-rule；
  
  - 支持Istio金丝雀发布的Service服务限制说明可参考[手动修复项](https://support.huaweicloud.com/usermanual-asm/asm_01_0061.html)和[自动修复项](https://support.huaweicloud.com/usermanual-asm/asm_01_0066.html)下的全部内容。
   
 
 #### 步骤一：流水线创建新阶段应用
1. 进入CodeArts首页，单击目标项目名称进入项目。
2. 单击**"持续交付 \> 流水线"** ，单击流水线操作"**编辑** "，进入**"任务编排"**页面。
3. 单击**"新建阶段"**，创建新阶段。
4. 创建灰度发布任务，如[图3]所示。
   
   图3创建灰度发布任务   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002736499969.png)
   
   1. 单击"**新建任务 \> 从空任务新建** "，参照下图搜索"**灰度起负载** ",单击"**添加** "，输入参数后单击"**确认** "关闭，参数如[表1]所示。
      图4搜索"灰度起负载"   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743043545.png "点击放大")
      图5灰度起负载   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002706740882.png "点击放大")
      
       表1灰度起负载参数说明 
      | 参数项     | 说明                                                                                                                                                                                                                                                                                                                                                                            | 示例           |
      |:---|:---|:---|
      | 名称     | 显示在流水线任务步骤的名称                                                                                                                                                                                                                                                                                                                                                                 | 默认           |
      | 步骤名称    | 步骤名称                                                                                                                                                                                                                                                                                                                                                                           | 默认             |
      | CCE   | 选择已有CCE集群                                                                                                                                                                                                                                                                                                                                                                        | cce          |
      | 命名空间    | 选择CCE云容器引擎中K8S集群/用户自定义Kubernetes中K8S集群的命名空间。                                                                                                                                                                                                                                                                                                                                   | 默认             |
      | 服务名称    | 选择CCE云容器引擎中/用户自定义Kubernetes中创建的服务名称                                                                                                                                                                                                                                                                                                                                           | service-demo |
      | 灰度版本号类型 | 灰度版本号类型： - 自定义：用户自行输入灰度版本号  - 任务执行时间戳：按照执行时间生成的时间戳  - 随机数： 随机生成的数字   | 默认           |
      | 灰度版本  | 灰度版本号类型选择为"自定义"时，手动输入灰度版本号                                                                                                                                                                                                                                                                                                                                                      | v2          |
      | 镜像地址 | 配置需要部署的镜像拉取地址                                                                                                                                                                                                                                                                                                                                                                   | 默认           |
         
      
   
   2. 单击上一步创建的任务下的"**+** "，选择"**从空任务新建** "，参照下图搜索"**人工审核** ",单击"**添加** "，输入参数后单击"**确认** "关闭，参数如[表2]所示。
      图6搜索"人工审核"   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002713204620.png "点击放大")
      图7人工审核   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002736499973.png "点击放大")
       表2人工审核参数说明 
      | 参数项    | 说明                                                                                                                                                                                                                                                                                                        | 示例       |
      |:---|:---|:---|
      | 名称    | 显示在流水线任务步骤的名称                                                                                                                                                                                                                                                                                           | 默认        |
      | 审核来源    | 审核来源： - 项目成员：流水线所在项目的成员  - 项目角色：流水线所在项目配置的角色                                         | 默认     |
      | 审核人     | 审核来源选择为项目成员时，需配置的审核人员，可多选                                                                                                                                                                                                                                                                               | -      |
      | 审核模式    | 审核来源选择为项目成员时，需配置多个审核人的审核模式： - 全部人审核：多人全部审核通过后即为审核通过  - 任一人审核：多人中任意一人审核通过即为审核通过   | 默认      |
      | 审核角色 | 审核来源选择为项目角色时，需配置的审核角色。注：使用通用权限设置的角色并集进行审批，任一人审批即可通过。（IPD项目中项目创建者不会作为项目经理角色参与审批）                                                                                                                                                                                                                          | -        |
      | 超时处理   | 审核超时处理： - 审核失败，流水线终止执行  - 忽略结果，流水线继续执行                                              | 默认    |
      | 审核时长   | 可配置审核等待时长：审核时长不能超过3天                                                                                                                                                                                                                                                                                     | 01:00:00 |
      | 审核说明    | 审核结果补充说明                                                                                                                                                                                                                                                                                                 | -       |
         
      
   
   3. 单击上一步创建的任务下的"**+** "，选择"**从空任务新建** "，参照下图搜索"**灰度引流** ",单击"**添加** "，输入参数后单击"**确认** "关闭，参数如[表3]所示（其中，引流类型选择为"**Istio金丝雀发布** "，流量接管选择为"**灰度引流** "）。
      ![](https://support.huaweicloud.com/bestpractice-deployman/public_sys-resources/note_3.0-zh-cn.png)
      该步骤支持多次添加，分别配置不同的权重。
      图8搜索"灰度引流"   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743043547.png "点击放大")
      图9灰度引流   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002706740884.png "点击放大")
       表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灰度引流   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002736499975.png "点击放大")
      
      
   
   6. 单击上一步创建的任务下的"**+** "，选择"**从空任务新建** "，搜索"**人工审核** ",单击"**添加** "，输入参数后单击"**确认** "关闭 。参数如[表2]所示。
   
   7. 单击上一步创建的任务下的"**+** "，选择"**从空任务新建** "，搜索"**灰度下线** ",单击"**添加** "，输入参数后单击"**确认** "关闭。参数如[表4]所示。
      图11搜索"灰度下线"   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002713204624.png "点击放大")
      图12灰度下线   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002706740886.png "点击放大")
       表4灰度下线参数说明 
      | 参数项  | 说明         | 示例 |
      |:---|:---|:---|
      | 名称     | 显示在流水线任务步骤的名称 | 默认    |
      | 步骤名称 | 步骤名称       | 默认    |
         
      
   
   8. 单击右上角"**保存并退出**"，完成金丝雀引流流水线任务创建。
    
   
   
 
#### 步骤二：（可选）配置回滚能力
如需配置回滚能力，可按照下面步骤配置回滚插件，完整配置如图所示。
图13配置回滚插件   
![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743043551.png)
可配置回滚能力的场景：
- 发布步骤全部执行成功时需回滚至部署前状态 ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002696283191.png "点击放大")
  
  
- 任一发布步骤执行失败时需回滚至部署前状态 ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002666444130.png "点击放大")
  
  
- 任一发布步骤执行成功后需回滚至部署状态 ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002666444326.png "点击放大")
  
  
1. 编辑[步骤一：流水线创建新阶段应用]中创建的流水线。
2. 单击"**灰度下线** "下的"**+** "，选择"**从空任务新建** "，搜索"**人工审核** ",单击"**添加**"。
3. 输入参数后单击"**任务配置** "，如[图14]；"**执行条件** "选择"**始终执行（需运行前置任务）** "，如[图15]；单击"**确认** "关闭 。参数如[表2]所示。
   
   图14任务配置   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002763076841.png "点击放大")
   图15人工审核   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002733362196.png "点击放大")
   
   
   
4. 单击上一步创建的任务下的"**+** "，选择"**从空任务新建** "，搜索"**灰度回滚** ",单击"**添加** "。
   
   图16灰度回滚   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743042199.png "点击放大")
   
   
5. 输入参数后单击"**任务配置** "，如[图17]；"**执行条件** "选择"**前置任务成功时执行** "，如[图18]；单击"**确认** "关闭。
   
   图17任务配置   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743162169.png "点击放大")
   图18执行条件   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002713203290.png "点击放大")
   
   
 
 #### 步骤三：执行流水线
1. **执行灰度起负载**
   
   单击流水线操作的![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002583759700.png)按钮，选中创建的所有的串行任务，单击"**确定**"，开始执行灰度部署，执行过程中可根据每个步骤自行验证。
   1. 灰度起负载步骤成功后，可查看命名空间下是否生成新的负载。
      图19无状态负载   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743042203.png "点击放大") 
   
   2. 步骤执行完成后，该命名空间下将生成新旧两组工作负载。切换至 CCE 服务页面，找到目标服务（示例：service‑demo），单击服务操作列的关联实例，在实例列表中确认同时存在新旧工作负载对应的实例。
      图20服务
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743037517.png "点击放大")
      
      
   
   
   
   
2. **审核通过后，执行灰度引流操作。**
   
   1. 可结合配置的引流策略，在现网验证流量是否按预期分别转发至新版本与旧版本工作负载。
   
   2. 步骤执行完成后，请检查DestinationRule与VirtualService的 YAML 配置内容，确认与下图保持一致。若同一接口的 v1、v2 版本在返回结果或日志输出上存在差异，可调用服务访问地址发起请求，通过接口返回值或日志信息，校验流量分配是否符合配置的比例要求。
      图21DestinationRule yaml示例   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002666607450.png)
      图22VirtualService yaml示例   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002696287367.png "点击放大") 
   
   
   
   
3. **发布灰度版本**
   
   1. 按照策略进行引流后，待审核通过，正式发布灰度版本，此时用户到现网查看流量是否全部引流到升级后的最新版本。
   
   2. 步骤执行完成后，检查DestinationRule 和VirtualService的 YAML 配置，确认与下图内容一致。若同一接口的 v1、v2 版本返回结果或日志输出存在差异，可访问服务访问地址，通过接口返回值或日志信息，确认流量已全部切换至新建的工作负载。
      图23DestinationRule yaml示例   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002629863358.png "点击放大")
      图24VirtualService yaml示例   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002630023372.png "点击放大") 
   
   
   
   
4. **执行旧版下线**
   
   1. 正式发布并审核通过后，执行旧版本下线操作。可在现网环境校验业务系统是否已更新为目标新版本。
      图25工作负载   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002713358494.png "点击放大")
      图26服务   
      ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002713198540.png "点击放大") 
   
   2. 步骤执行后，查看命名空间下是否只有最新的负载保留，旧负载已删除。
   
   
   
   
#### 步骤四：（可选）执行回滚
[步骤三：执行流水线]中任一步骤执行成功或失败时，均可回滚。
1. 流水线步骤跳到回滚插件的上一个**人工审核** ，如[图27]所示。
   
   图27人工审核   
   ![](https://support.huaweicloud.com/bestpractice-deployman/zh-cn_image_0000002743157021.png "点击放大")
   
   
2. 如需回滚，将"审核操作"选择为"通过"，系统将自动运行回滚插件；如不需进行回滚操作，则将"审核操作"选择为"驳回"。
3. 回滚插件执行完成后，查看目标命名空间，确认仅保留原始工作负载。
4. 访问服务地址进行验证，确认流量已全部切换回原始工作负载。
 
