【Cloud Native】08 k8s发布
0 文档
reference:
1 灰度发布
概念:灰度发布是指在 黑和白(0和1)之间,能够平滑过渡的一种发布方式
2 发布策略
- 蓝绿发布:发布时需要两套一模一样的系统,两倍资源
- 金丝雀发布(灰度发布):侧重小范围(用户、流量)的测试和验证。
- 滚动发布:侧重服务端(应用/服务器)的分批更新。
2.1 蓝绿发布
2套完全一样的系统,不一样的一套系统接受流量,一套不接受,流量是全量切换的。
优点:自动化程度高 缺点:适用复杂程度不高的系统,复杂程度高,那么数据的同步会是一个很大的问题
2.2 金丝雀发布
核心在于流量切分。
可以用服务器维度切,也可以用流量权重维度切。
优点:资源耗费小,比如架构有300台web服务器,是不可能用蓝绿发布的。 缺点:需要人工操作
2.3 滚动发布
滚动发布,是在金丝雀发布的基础上,进行的优化, 一次滚动发布,由若干个批次组成,比如第一批是金丝雀的1台,第二批是10%,30%。
一般每个批次都会有观察间隔,通过手工验证没问题后,再切换下一批次。 但是一般间隔是逐步减少的,第一次10分钟,后续2分钟等
3 测试策略
- A/B测试:侧重验证新功能的有效性,A组用户老版本、B组用户新版本,比较新老版本数据差异。
3.1 AB test
AB test就是一种灰度发布方式,指为产品已发布A版本,在发布B版本时,在同一时间维度,让一部分用户继续用A版本,一部分用户开始用B版本,如果用户对B版本没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B版本上面来。灰度发布可以保证整体系统的稳定,在初始灰度发布时就可以发现及调整问题,以保证其影响度。
4 发布方案
spring cloud 网关
- gateway
- discover
云原生网关
- APISIX
- Istio
- Envoy
kubernetes中的灰度策略
滚动更新:rollingUpdate(默认)
strategy: type: rollingUpdate rollingUpdate: maxsurge: 最大可超期望的节点数,百分比 10% 或者绝对数值 5。一次可以添加多少个Pod maxUnavailable: 最大不可用节点数,百分比或者绝对数值。滚动更新期间最大多少个Pod不可用
步骤:
- v1版本 3个pod
- v2版本 deployment, type rollingupdate, apply it
kubectl apply -f app-v2-rolling.yaml
- 会在新的pod创建好之后,再停止旧的
- 异常,
- 暂停:
kubectl rollout pause deploy my-app
- 继续:
kubectl rollout resume deploy my-app
- 回滚:
kubectl rollout undo deploy my-app
- 暂停:
总结:2 deployment(old + new),新的成功停老的
金丝雀发布:canary
更新部分容器,没问题后逐步替换,直到全部切完。
步骤概览: 按pod数量进行流量分配
- 线上v1版本 2个 pod
- 启动v2版本 1个 pod,这样,30%的流量新版本
kubectl apply -f app-v2-canary.yaml
while sleep 1; do curl http://192.168.49.2:30808 | egrep VERSION; done
- 修改v2版本 2个 pod,这样,50%的流量新版本
kubectl scale --replicas=2 deploy my-app-v2
- 关闭v1版本 2个 pod,这样,100%的流量新版本
另外,可以结合ingress的annotation,来实现更方便的金丝雀发布。 可以基于:
- Header
- Cookie
- 流量比例 缺点:
- 只支持2个版本
- 老版本不能停,完全停旧版本需要手动
文档:
总结:手动、2*ingress annotation
蓝绿部署:blue/green
步骤概览
- 老版本:
- deploy label: v1
- service, label selector: v1
- 部署新版本deployment: label: v2
- 修改 service, label selector: v2
- patch命令:
kubectl patch service my-app -p'{"spec":{"selector":{"version":"v2.0.0"}}}
- lens 界面化工具
- patch命令:
- 发现有问题,修改 service, label selector: v1
总结:1 service + 2 deployment,切换label selector