从色彩角度讲,灰度指不饱和的黑色,我们把黑色定为基准色,每个灰度对象是从白色(0%)到黑色(100%)的中间值,这中间的98%都是灰。
1,概念
1)蓝绿部署
两套环境,一套正在提供服务(旧版),标记为绿色;一套是准备发布的系统(新版),标记为蓝色。用户流量接到蓝色系统上,经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统, 切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。
优缺点
蓝绿部署的目的是减少发布时的中断时间、能够快速撤回发布。两套系统没有耦合的时候才能百分百保证不干扰。
2)金丝雀部署(版本试错)
大部分用户使用旧版功能,选定小部分用户试用新版本的,这个影响范围可控的发布版本就是金丝雀部署的版本。在测试过程中持续观测被测试的服务各个维度的状态,验证新版本的健壮性、可用性、稳定性等。
场景:发布新版本时,确保这个版本即使发生问题也只会影响很少的或者可控范围内的用户。如果运行稳定,那么逐步扩大范围把用户全部迁移至此版本。有效降低风险。
优点
- 零下线时间与快速回滚:
在一系列的相关验证和测试之后,如果新版本的软件被认为不合适,则很容易回滚和控制影响范围。 - 真实场景下的测试:
由于是直接将新版本部署到生产环境进行测试,所以能够通过真实流量对新版本进行针对性的验证。当然,需要对流量和用户进行限制,来控制验证的范围和影响面。 - 较低的基础设施成本:
因为金丝雀部署策略是通过一定规则,按规则对的请求进行要求的分流或路由(例如:用户名、地区、年龄、随机等),所以只需要少量额外的基础设施,就可以达到验证的效果。对比蓝绿部署策略,需要准备与生产环境同样的一套基础设施,部署成本显然会高很多。 - 灵活的按需进行验证相关版本、功能的正确性。
可以根据不同的特征和标识,对请求的流量进行多个维度分流和路由,以达到不同粒度不同特征的灵活验证。
3)灰度发布(版本平稳过渡)
类似金丝雀部署,两者关注点不同:金丝雀部署重点是确认选取的10%流量的金丝雀版本是否安全;而灰度发布是平滑地从10%慢慢向更大的流量进行扩展直至完成。两者实现方式和过程基本类似:比如通过流量切换的方式。
灰度发布渐进式完成新版本应用的全量上线,最大限制地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚。
灰度期:
灰度发布开始到结束期间的这一段时间
2,关键技术
1)网络流量分流
灰度规则:给出灰度名单进行流量分流。通过用户行为分析引导用户进入不同的页面,逐步放量。(甚至是用户id)
具体的实现就是通过负载均衡策略来实现。
2)分流策略管理
每次放量都需要调整灰度值。
3)多应用间分流传递策略
4)数据兼容性处理
灰度要处理的三个维度:
- 微服务
- 前端
- 数据
数据包括db、kafka、redis等数据的处理。如果不兼容曾经的版本,那么灰度回滚将会是一件很麻烦的事情。
3,实现方案
1)基础设施实现(IaaS)
比如通过阿里云 MDS 工具实现。
2)平台实现(PaaS)
通过 K8S 的 Ingress 组件或 Istio 来实现。
3)通过 Nginx 等中间件实现
直接在 Nginx 中通过脚本控制流量转发规则(使用ngx+lua)。或者在网关层来实现(Spring-cloud-zuul)
4)Ingress-Nginx、Ambassador、Rancher、Spinnaker