Post

【Cloud Native】08 k8s发布

【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

SpringCloud从入门到精通(超详细文档一)

云原生网关

  • 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 界面化工具
  • 发现有问题,修改 service, label selector: v1

总结:1 service + 2 deployment,切换label selector

重建:recreate

a/b测试发布

无损发布

This post is licensed under CC BY 4.0 by the author.