三种常见的发布方式
应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。而最为常见三种发布方式分别为:蓝绿发布,灰度发布和滚动发布。
三种发布方式的最终目的都是为了减小或避免对应用项目更新时,对客户使用的影响。
蓝绿发布
首先将所有的应用服务集群为蓝绿两组,首先将绿组的集群从负载均衡中移除,蓝组则继续对用户提供服务。此时移除的绿组进行服务的升级,等升级完毕后,再从新将绿组接入到负载均衡中为用户提供服务。
再把蓝组进行移除,进行服务升级,升级完毕后再接入到负载均衡的集群中。此时整个项目集群得进行升级完毕,我们将此称为蓝绿发布
蓝绿发布的特点:
1.一旦出现问题,问题的影响范围很大
2.发布策略简单
3.基于现在的云计算和微服务,用户无感知。
缺点:
在发布升级的过程之中,只有一部分集群在对外提供服务,可能会是集群的负载能力下降,相应变慢,需要注意给集群增加负载能力(一般来说没什么特殊需要)
短时间内可能会浪费一定的资源成本
金丝雀发布(灰度发布):
先发布一个试用版(测试服)
deployment控制器创建的服务,才可以使用这种发布方式,滚动更新,暂停。发布的过程中,只有一部分的pod先升级,其他的pod还是处于老的版本。只有一部分用户可以访问新的版本,绝大多数用户还是在老版本。确定问题之后,再把剩下的老版本,升级成新版本,把暂停取消,继续发布。如果有问题可以立即回滚。暂停不是回滚,一旦取消暂停只能全部升级完毕之后,再回滚。
灰度发布 特点:
1.自动化要求比较高,对运维人员的要求很高。
2.方便发现问题及时解决。影响范围比较小
3.用户无感知,可以实现一个平滑过渡。比较节约资源。
4.发布策略比较复杂。
5.不易回滚,必须等到全部发布成功之后才能回滚。
滚动更新
滚动发布就是刚刚我们在k8s中使用的项目服务更新方式。滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级新版本。
特点
-
用户无感知,平滑过渡;
-
节约资源。
缺点
-
部署时间慢,取决于每阶段更新时间;
-
发布策略较复杂;
-
无法确定OK的环境,不易回滚。
三种方式的对比总结
-
蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚。
-
灰度发布:根据比例将老版本升级,例如80%用户访问是老版本,20%用户访问是新版本。
-
滚动发布:按批次停止老版本实例,启动新版本实例。
灰度发布演示
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
kubectl expose deployment nginx --port=8000 --target-port=80 --name=nginx-service --type=NodePort #先创建资源并创建3个副本
kubectl set image deployment nginx nginx=nginx:1.16 && kubectl rollout pause deployment nginx #更新并暂停
kubectl rollout status deployment nginx #观察更新状态