灰度发布
服务升级机制
在项目敏捷开发的过程中,不可避免需要快速、安全的更新应用,目前比较流行的几种部署方案有: 滚动发布、灰度发布/金丝雀发布和蓝绿部署。
-
滚动发布(目前中信银行内部生产环境交易系统的发布方式):
一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。
这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的20%进行升级。
这种方式也有很多缺点,例如:
-
没有一个确定OK的环境。使用蓝绿部署,我们能够清晰地知道老版本是OK的,而使用滚动发布,我们无法确定。
-
修改了现有的环境。
-
如果需要回滚,比较麻烦。举个例子,在某一次发布中,我们需要更新100个实例,每次更新10个实例,每次部署需要5分钟。当滚动发布到第80个实例时,才发现问题,需要回滚。此时,脾气不好的运维人员很可能想掀桌子,因为回滚是一个痛苦,并且漫长的过程。
-
有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
并不是说滚动发布不好,滚动发布也有它非常合适的场景。
-
-
灰度发布(又名金丝雀发布)
是指在黑与白之间,能够平滑过渡的一种发布方式。 在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。–维基百科
灰度发布中,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。不同版本应用共存,经常与A/B测试一起使用,用于测试选择多种方案。这里举一个灰度发布比较典型的例子:
我们希望上线一个PLMP系统的新的功能,需要修改dlp-personal服务,但是只有我们自己的用户liweiwu验证通过后才能给所有用户使用。
-
线上正在运行服务 dlp-personal-A,新部署一个服务 dlp-personal-B,使用新版本的Image和ConfigMap
-
去负载均衡器页面修改转发规则,新增 header 转发规则将 token=liweiwu 的流量分配给 dlp-personal-B,剩余流量给 dlp-personal-A
-
登录 liweiwu 用户进行相关测试,发现问题进行修改并更新 dlp-personal-B 的Image和ConfigMap,直至验证通过
-
修改 dlp-personal-A 的Image和ConfigMap与 dlp-personal-B 一致
-
删除负载均衡器上的转发规则,所有流量指向服务 dlp-personal-A
-
删除服务 dlp-personal-B
-
-
Blue/Green Deployment(蓝绿部署)
蓝绿部署无需停机,并且风险较小。
-
旧版本的应用(一开始的状态)
所有外部请求的流量都打到这个版本上。
-
部署新版的应用
新版本的Image或ConfigMap和旧版本不同
-
将流量全部从旧切换到新版本上。
-
测试
如新版本测试正常,就删除旧版本正在使用的资源(例如实例),从此正式用新版本。
从过程不难发现,在部署的过程中,我们的应用始终在线。并且,新版本上线的过程中,并没有修改老版本的任何内容,在部署期间,老版本的状态不受影响。这样风险很小,并且,只要老版本的资源不被删除,理论上,我们可以在任何时间回滚到老版本。但是需要指出的是,这种方式会占有更多的资源。
-
我司的灰度发布
发布策略的设定由规则和权重分配组成。具体功能描述如下:
图 1 灰度发布的策略和规则
规则集:
-
转发规则和服务分离
-
每个 policy 分为两部分,第一部分为匹配规则集合部分,第二部分为权重部分,每个请求当满足第一部分的匹配规则后按照第二部分的权重将流量转发到多个服务,如果权重部分只有一个服务则百分之百转发到一个服务。
-
一条 policy 中可以有多个规则,规则之间是 and 关系
-
不同 policy 之间存在优先级,请求匹配了第一个 policy 则不会再匹配第二个 policy
我司的蓝绿发布
蓝绿部署可以作为灰度发布权重规则的一种特殊形式,通过调整两个服务的请求量比例来控制线上是蓝版本还是绿版本。通过设置权重 X 为 100 或者 0 来达到蓝绿切换。
目前支持的策略集合
-
域名分配:
域名值可以是单个域名或者一个域名列表
-
权重分配:
A 服务分配 X% 流量,B 服务分配剩余 (1-X)% 流量
-
URL 分配:
URL 值可以是一个单独字符串,或者一个字符串列表,或者正则表达式
-
IP 分配:
源 IP 属于某一指定 IP 集合的流量分配给服务 A,其余流量分配给服务 B,可以为单个 IP,IP 列表或者 IP 范围
-
URL param 分配:
根据 url 某一个参数值的范围进行分配,例如 url 包含参数 uid=1 的流量分配给服务 A,其余流量分配给服务 B,param 值可以为单个值或者字符串列表
-
Header 分配:
根据某一 header 值的范围进行分配,例如 header 包含 agent=chrome 流量分配给服务 A,其余流量分配给服务 B,header 值可以为单个值或者字符串列表
客户场景的灰度发布
说明:
- 应用管理员提交自己应用的灰度发布 双人复核工单。
- 复核人员,审批通过。
- 应用管理员在工单列表里找到审批通过的工单,页面中点击继续,进入应用更新的页面,提交后立即更新应用。回到双人复核工单页面。
- 应用管理员在工单列表里找到刚刚操作的工单,页面中点击继续,进入ALB的设置页面,提交修改后,马上更新ALB。
- 测试新的应用(项目组一起确认,由复核人员确认是否无误)
- 如确认版本无误,由应用管理员在双人复核工单列表里找到刚刚操作的工单,页面中点击继续,最后一次更新应用;如版本有误,由应用管理员在双人复核工单列表里找到刚刚操作的工单,页面中点击继续,回到第3步。
- 删除ALB的转发规则
- 结束流程。
相关阅读
IRON MAIDEN与ONKYO 联合发布联名款耳机ED-PH0N3S
由SteveHarris专为摇滚与金属乐迷精心设计与调音的耳罩式头戴耳机全新内置IRONMAIDEN乐队定制EQ设定的全新配套智能手机app于12月
9月23日,以“开启8.0咖啡新零售时代 揭秘2017骚动box”为主题的2017咖啡零点吧战略产品发布会在北京798杨国际会议中心
0x00 概述2018年1月4日,Jann Horn等安全研究者披露了"Meltdown"(CVE-2017-5754)和"Spectre"(CVE-2017-5753 & CVE-2017-5715)两组C
2019年7月26日,莞城曜日当空、热情似火。这一天,VIVO长安文体中心人浪如潮、盛况非凡!微领地网络2019夏季新品发布会在这里华彩落幕,
备受瞩目的360手机新品将在8月21日的新品发布会上正式亮相,在前期宣传上,360手机可谓做足了功夫。先是360手机总裁李开新在微博上为