
# 发布概述
#### 应用现状
应用程序升级面临最大挑战是新旧业务切换，将软件从测试的最后阶段带到生产环境，同时要保证系统不间断提供服务。如果直接将某版本上线发布给全部用户，一旦遇到线上事故（或BUG），对用户的影响极大，解决问题周期较长，甚至有时不得不回滚到前一版本，严重影响了用户体验。
#### 解决方案
长期以来，业务升级逐渐形成了几个发布策略：灰度发布、蓝绿发布、A/B测试、滚动升级以及分批暂停发布，尽可能避免因发布导致的流量丢失或服务不可用问题。
本文着重介绍灰度发布和蓝绿发布的原理及实践案例。
- 灰度发布，又称金丝雀发布，是版本升级平滑过渡的一种方式，当版本升级时，使部分用户使用新版本，其他用户继续使用老版本，待新版本稳定后，逐步扩大范围把所有用户流量都迁移到新版本上面来。这样可以最大限度地控制新版本发布带来的业务风险，降低故障带来的影响面，同时支持快速回滚。 以下示意图可描述灰度发布的大致流程：先切分20%的流量到新版本，若表现正常，逐步增加流量占比，继续测试新版本表现。若新版本一直很稳定，那么将所有流量都切分到新版本，并下线老版本。
  ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001214475863.gif "点击放大")
  切分20%的流量到新版本后，新版本出现异常，则快速将流量切回老版本。
  ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001214717329.gif "点击放大")
  
- 蓝绿发布提供了一种零宕机的部署方式，是一种以可预测的方式发布应用的技术，目的是减少发布过程中服务停止的时间。在保留老版本的同时部署新版本，将两个版本同时在线，新版本和老版本相互热备，通过切换路由权重的方式（非0即100）实现应用的不同版本上线或者下线，如果有问题可以快速地回滚到老版本。 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001169315996.gif "点击放大")
  
 
#### 灰度发布或蓝绿发布实现方式
利用Kubernetes原生的特性可以实现简单的灰度发布或蓝绿发布，比如：通过修改Service的selector中决定服务版本的label的值来改变Service后端对应的Pod，实现让服务从一个版本直接切换到另一个版本，从而实现蓝绿发布。如果您的灰度或蓝绿发布需求较复杂，可以向集群额外部署其他开源工具，例如Nginx Ingress、Traefik，或将业务部署至应用服务网格（Application Service Mesh，简称ASM），利用开源工具和服务网格的能力实现。这三种方式分别对应本文如下内容：
- [使用Service实现简单的灰度发布和蓝绿发布](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10002.html)
- [使用Nginx Ingress实现灰度发布和蓝绿发布](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10003.html)
- [使用ASM实现灰度发布和蓝绿发布](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10004.html)
表1实现方式对比 
| 实现方式          | 适用场景           | 特点                                                                                                                                                                                                                                                                                                                                                                                                                                 | 缺点                           |
|:---|:---|:---|:---|
| Service       | 发布需求简单，小规模测试场景 | 无需引入过多插件或复杂的用法                                                                                                                                                                                                                                                                                                                                                                                                                     | 纯手工操作，自动化程度差                 |
| Nginx Ingress | 无特殊要求          | - 配置Nginx Ingress所支持的Annotation即可实现灰度发布或蓝绿发布，无需关注内部原理  - 支持基于Header、Cookie和服务权重三种流量切分的策略                                                                                                                              | 集群需要安装nginx-ingress插件，存在资源消耗 |
| ASM           | 商用场景           | - 无需修改应用的服务代码，非侵入式治理  - 界面可视化，灰度发布或蓝绿发布过程中的流量变化可通过拓扑图、曲线图等直观查看  - 可配置的灰度策略更全面，包括基于流量比例、基于请求内容（Header、Cookie、操作系统、浏览器）   | 需要为集群启用Istio，占用额外资源          |
   
Service和Nginx Ingress方式均利用Kubernetes开源能力实现灰度发布和蓝绿发布，在这个过程中，CCE也提供了很多便捷性，例如：
- 所有资源的创建、查看、修改均可以在管理控制台实现，相比kubectl命令行工具更为直观。
- LoadBalancer类型的Service由ELB服务实现，在创建Service时，可以使用已有ELB实例，也可以新建一个ELB实例。
- 支持一键式安装nginx-ingress插件，并且在安装过程中实现ELB的创建与对接。
 
