一 兰绿发布、金丝雀发布、灰度发布、滚动发布
特性对比
(1)兰绿部署
重点: 兰绿部署是'两套'集群,在两套系统之间切换
① 定义
② 发布过程
③ 特点
④ 注意事项 了解
(2)灰度发布
① 矿井中的金丝雀
自己要掌握的:学会从'社会科学'的角度讲故事
② 定义
特点:同一时间有'多个版本'的服务'对外'提供服务,这些版本服务于'不同'的'受众群体'
重点:新特性经过浸润,流量从'老'版本'逐渐迁移'到'新'版本
场景:它能够'缓慢的'将修改推广到一小部分用户,验证没有问题后,再推广到全部用户,以降低生产环境引入新功能带来的风险。
A/B测试
③ 灰度发布/金丝雀发布组成
(3)滚动发布
说明: k8s一般是'滚动'更新
二 如何实现灰度发布
① 实现思路
1、在'代码'中做 --> "了解"
一套线上环境,代码中做'开关(falgs)',对于'不同的用户(特征)'走不同的逻辑
优点:'粒度细',一套代码(环境)'运维成本低'
++++++++++++++'分割线'++++++++++++++
2、在'接入层(业界常用)'做 -->根因是接入层是'无状态'的
多套('相互隔离的')线上环境,接入层'针对不同用户'转发到不同的环境中
优点:最少'侵入'服务代码实现灰度发布,风险小,'运维可靠性高'
'灵活'的灰度方案一般需要在'接入层'实现,具体就是'自定义负载均衡策略'实现
下面介绍在'接入层'使用的方式
1)第一是在'nginx层(无状态)'实现(使用ngx+lua)-->'openresty' -->'优选'
2)第二是在'网关层'实现(spring-cloud-zuul) -->'了解'
3)第三是'dubbo'的灰度,项目中如果使用dubbo,有可能会需要dubbo服务的灰度实现 -->'了解'
负载均衡又可分为'服务端'负载均衡和'客户端'负载均衡
1) 服务器端负载均衡
例如:在nginx服务端通过'负载均衡算法',在多个服务器之间'选择一个'进行访问;
2)客户端负载均衡
例如:ribbon或者dubbo,客户端会有一个'服务器地址列表',在发送请求前通过负载均衡算法'选择一个'服务器,然后进行访问
② ABTestingGateway
③ 节点引流
节点引流:
1)在一个'集群内(upstream)',用户标记'一个或多个蓝节点',然后通过定义'规则'
eg:只有特定'domain_id(可能是Token解析出来的)'或者'其它特征'才能访问这些'蓝节点'
2)引流的时候将'灰度请求(特定特征流量)'转到到已配置的'蓝色'节点,'非灰度请求'转发到其它节点
④ 集群引流
集群引流:
1)用户指定一个'蓝集群'(同一'组件'的另外一个upstream);是不同'版本'的两套集群
2)灰度引流的时候将'灰度请求'轮询转发到到'蓝色'集群后端
灰度请求:是经过'灰度策略'匹配的请求
灰度暂停效果:灰度节点'暂时闲置',非灰度节点正常'承载所有'业务
④ 灰度策略
灰度策略:
1)即'满足'什么条件,流量'会走到'灰度节点或者灰度集群上
2)其它'不满足条件'的则正常走到'非灰度'
触发条件:是'用户'定义的,比如说'什么特定的'请求会发送到'哪个'节点
附加: 灰度策略是'谁(重点)访问'哪个'server_name'下的'location'才触发的
重点:怎么识别'目标特征流量',进而进行'灰度'路由
条件:来源策略
1) 基于'用户(友好用户、内部用户) -->uid、租户等级(v1、v5)' --> 进行'特征'识别
3)基于'ip段'分流
4)基于'地域'分流
'实现'方式:nginx+lua
1)url传递的特殊请求参数'args' -->'集群引流'
2)发送请求时内部携带'特殊'请求头'Request Header' -->'Token'、'X-GRAY'等内部'约定俗成'的 -->'二者都可能有'
3)Cookie头中特定的'key' -->'集群引流'
4) X-Real-IP、x_forwarded_for、$remote_addr -->'集群和节点二者都可能有'
⑤ 节点引流的原理
1)管理员根据'租户id、租户等级、ip'等'预设'灰度策略,然后写入'DB数据库'持久化
备注:这里已经对集群进行'兰绿节点'的划分
2)'openresty(nginx+lua)'通过'redis'定时读取策略信息,放到'nginx本地内存'中
3) 当有'用户请求到达'的时候,openresty发现是'gray灰度'的时候,进行策略匹配,得到'引流'的ip地址
绿色:稳定'旧'环境
蓝色:'新'版本环境
后续: upstrem { balance_by_lua_* } + redis 来实现 -->'比较复杂'
'不建议'的方式: 将一个集群的'蓝绿节点'拆分成两个集群'蓝'集群 + '绿'集群
⑥ 集群引流的几种实现方式
1)请求头
map $http_gray $upstream {
default upstream_1;
gray upstream_2;
}
2)请求参数
说明: 通过'map'或者location中的'if'判断
通过: $args或者$query_string --> '$args或者$query_string'
map $args $upstream {
~(^|&)version=1$ upstream_1;
~(^|&)version=2$ upstream_2;
}
备注:由于不知道version是开始还是中间,所以'使用(^|&)'
3)Cookie请求头的key
map $COOKIE_flag $upstream {
default upstream_1;
1 upstream_2;
}
然后 proxy_pass https://${upstream};
++++++++++ 可以在不同的颗粒度-->'server'或者'location'中进行逻辑判断 ++++++++++
set $group "default";
if ($http_cookie ~* "version=V1"){
set $group hilinux_01;
}
if ($http_cookie ~* "version=V2"){
set $group hilinux_02;
}
4)节点引流
1)变相的'节点'或'集群'引流
细节点: 通过proxy_pass $arg_upstream -->可以是'ip'或者'upstream_id'
场景: 引流方式完全由用户'主动'来控制、节点'几千台'
⑦ 灰度流量百分比
'取模' -->'遗留'