一、蓝绿发布
项目逻辑上分为AB组,在项目升级时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。A组升级完成上线,B组从负载均衡中摘除。
特点:
- 策略简单
- 升级/回滚速度快
- 用户无感知,平滑过渡
缺点:
- 需要两倍以上服务器资源
- 短时间内浪费一定资源成本
- 有问题影响范围大
二、滚动发布
每次升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程。直到集群中的全部旧版本升级新版本。
kubernetes的默认策略是发布策略。
特点:
- 用户无感知,平滑过渡
缺点:
- 部署周期长
- 发布策略叫复杂
- 不易回滚
- 有影响范围较大
三、灰度发布(金丝雀发布)
只升级部分服务,即让一部分用户继续用老版本,一部分用户开始使用新版本,如果用户对新版本没有什么意见,那么逐步推广大范围,把所有用户都迁移到新版本上。
特点:
- 保证整体系统稳定性
- 用户无感知,平滑过渡
缺点:
- 自动化要求高
四、A/B Test
灰度发布的一种方式,主要对特定用户采样后,对手机到的反馈数据做相关对比。然后根据比对结果做出决策。用来测试应用功能表现的方法,侧重应用的可用性,欢迎程度等,最后决定是否升级。
五、灰度发布示例-部署Bookinfo为服务项目
项目位置:istio-1.20.0/samples/bookinfo
Bookinfo是官方提供一个图书评测系统微服务项目示例,分为:
服务 | 说明 | 调用服务 |
productpage | 主页 | reviews,details |
reviews | 评论内容 | ratings |
details | 详细内容 | |
ratings | 评分 |
5.1 创建命名空间及自动注入的标签:
# kubectl create ns bookinfo
# kubectl label namespace bookinfo istio-injection=enabled
5.2 创建命名空间
# kubectl apply -f platform/kube/bookinfo.yaml -n bookinfo
# kubectl get pod,svc -n bookinfo
reviews微服务部署3个版本,用于测试灰度发布效果:
- v1版本不会调用ratings服务
- v2版本会调用ratings服务,并使用5个黑色五角星显示评分信息
- v3版本会调用ratings服务,并使用5个红色五角星来显示评分信息
5.3 创建ingress网关
# kubectl apply -f networking/bookinfo-gateway.yaml -n bookinfo
5.4 确认网关和访问地址,访问应用页面
# kubectl get pods,svc -n istio-system
http://192.168.2.60:32040/productpage
5.6 灰度发布:基于权重的路由
操作流程:
- 流量全部发送到review v1版本(不带五角星)
- 将90%的流量发送到reviews v1版本,另外10%的流量发送到reviews v2版本(5个黑色五角星),最后完全切换到v2版本
- 将50%的流量发送到v2版本,另外50%的流量发送到v3版本(5个红色五角星)
## 全部流量导入 reviews v1版本
# kubectl apply -f networking/virtual-service-all-v1.yaml -n bookinfo
# kubectl apply -f networking/destination-rule-all.yaml -n bookinfo
## 将90%的流量发送到reviews v1版本,另外10%的流量发送到reviews v2版本(5个黑色五角星)
# kubectl apply -f networking/virtual-service-reviews-90-10.yaml -n bookinfo
##将50%的流量发送到v2版本,另外50%的流量发送到v3版本(5个红色五角星)
# kubectl apply -f networking/virtual-service-reviews-v2-v3.yaml -n bookinfo
5.7 恢复发布:基于请求内容的路由
将特定用户的请求发送到reviews v2版本(5个黑色五角星),其他用户则不受影响(v3)
# kubectl apply -f networking/virtual-service-reviews-jason-v2-v3.yaml -n bookinfo
5.8 灰度发布:工作流程
5.8 在实际业务中的使用流程
- 将部署应用的deployment里pod标签增加一个version:v1
- 部署deployment接入到istio
- 目标规则关联访问版本标签
- 虚拟服务实现灰度发布