• 13 | k8s的部署策略


    1 recreate(重建)模式

    一次性终止所有的旧版本后并一次性发布新版本
    定义的部署将终止所有正在运行的实例,然后使用较新的版本重新创建它们,最适合开发环境的发布
    优点:应用状态完全更新
    缺点:停机时间取决于应用程序的关闭和启动持续时间

    2 ramped(滚动)模式

    以滚动更新的方式发布新版本,成功创建一个新pod后再终止一个旧版本的Pod。
    渐变部署以滚动更新方式更新 pod,使用应用程序的新版本创建辅助ReplicaSet,然后减少旧版本的副本数,并增加新版本,直到达到正确的副本数。

    优点:版本会在实例之间缓慢发布
    对于可以处理数据重新平衡的有状态应用程序很方便
    缺点:推出/回滚可能需要一些时间
    支持多个API很难
    无法控制流量

    3 重建模式和滚动模式的区别

    重新创建更新类似于前文中 ReplicaSet的第一种更新方式,即首先删除现有的Pod对象,而后由 控制器基于新模板重新创建出新版本资源对象.通常,只应该在应用的新旧版本不兼容( 如依赖的后端数据库的schema不同且无法兼容)时运行时才会使用recreate策略,因为它会导致应用替换期间暂时不可用,好处在于它不存在中间状态,用户访问到的要么是应用的 新版本,要么是旧版本。

    滚动升级是默认的更新策略,它在删除一部分旧版本Pod资源的同时,补充创建一部分 新版本的Pod对象进行应用升级,其优势是升级期间,容器中应用提供的服务不会中断,但要求应用程序能够应对新旧版本同时工作的情形,例如新旧版本兼容同一个 数据库方案等.不过更新操作期间,不同客户端得到的响应内容可能会来自不同版本的 应用Deployment控制器的滚动更新操作并非在同一个ReplicaSet控制器对象下删除并 创建Pod资源,而是将它们分置于两个不同的控制器之下:旧控制器的Pod对象数量 不断减少的同时,新控制器的Pod对象数量不断增加,直到旧控制器不再拥有Pod对象。

    4 blue/green(蓝色/绿色)模式

    与旧版本一起发布新版本,然后切换流量。
    蓝色/绿色部署与渐变部署不同,因为应用程序的“绿色”版本与“蓝色”版本同时部署.在测试新版本满足要求之后,我们更新Kubernetes Service对象。

    该对象扮演负载平衡器的角色,通过替换选择器字段中的版本标签将流量发送到新版本。

    优点:

    • 即时部署/回滚。
    • 避免版本问题,一次性更改整个群集状态。

    缺点:

    • 需要两倍的资源。
    • 在正式发布之前,应该对整个平台进行适当的测试。
    • 处理有状态的应用程序可能很困难。

    5 canary(金丝雀)模式

    向一部分用户发布新版本,然后进行全面部署
    金丝雀部署将用户的子集路由到新功能.在k8s中,可以使用两个具有通用Pod标签的部署来完成金丝雀部署.新版本的一个副本与旧版本一起发布

    在一段时间后,如果未检测到错误,请按比例增加新版本的副本数量并删除旧的部署

    优点:

    • 为部分用户发布的版本。
    • 方便出错率和性能监控。
    • 快速回滚。

    缺点:

    • 缓慢推出。
    • 精细调整的流量分配可能会很昂贵(99%A / 1%B = 99个Pod A,1个Pod B)。

    6 a/b testing(a/b测试)模式

    A/B测试实际上是一种基于统计信息而不是部署策略制定业务决策的技术.但是,它是相关的,可以使用canary部署来实现

          以精确的方式(HTTP标头,cookie,权重等)向一部分用户发布新版本.A / B测试实际上是一种基于统计信息做出业务决策的技术
    
          除了根据权重在各个版本之间分配流量外,还可以基于一些参数(cookie,用户代理等)精确定位给定的用户群.此技术被广泛用于测试给定功能的转换
    
          并且仅推出转换最多的版本,最适合部分用户的功能测试
    
         优点:
              需要智能负载均衡器
             多个版本并行运行
             完全控制流量分配
        缺点:
            难以解决给定会话的错误,因此必须进行分布式跟踪
           不简单,您需要设置其他工具
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7 shadow(影子部署)模式

    和旧版本一起发布新的版本 把旧版本接收到的所有流量全部镜像到新版本用来测试新版本的稳定性 但是新版本并不会对流量进行任何响应。

    8 Deployment实现应用部署

    8.1 实现水平扩展/收缩

    水平扩展/收缩非常容易实现,Deployment Controller只需要修改它所控制的ReplicaSet的Pod副本个数就可以了
    把值从3改成4那么Deployment所对应的ReplicaSet,就会根据修改后的值自动创建一个新的 Pod.这就是“水平扩展”了.“水平收缩”则反之。

    kubectl scale deployment nginx-deployment --replicas=4

    8.2 实现滚动更新

    在这里插入图片描述

    READY 表示当前处于Running状态的Pod个数,但容器的镜像版本不一定是最新的。
    UP-TO-DATE 表示当前处于最新版本的Pod的个数 最新版本指的是Pod的Spec字段和Deployment里Pod模板中定义的完全一致。
    AVAILABLE 表示当前已经可用的Pod的个数 即是Running状态又是最新版本并且容器已经Ready状态的Pod个数,描述的是用户期望的最终状态的个数。

    8.2.1 滚动更新流程

    1.当修改了Deployment里的Pod定义之后,Deployment Controller会使用这个修改后的Pod模板创建一个新的ReplicaSet.这个新的 ReplicaSet 的初始Pod副本数是0
    2.然后Deployment Controller 开始将这个新的ReplicaSet 所控制的Pod副本数从0个变成1个.即:“水平扩展”出一个副本
    3.Deployment Controller又将旧的ReplicaSet所控制的旧Pod 副本数减少一个.即:“水平收缩”成两个副本
    4.如此交替进行,新ReplicaSet管理的Pod副本数,从0个变成1个,再变成 2个,最后变成 3个.而旧的ReplicaSet管理的Pod副本数则从3个变成 2个,再变成 1个,最后变成 0个.这样就完成了这一组 Pod 的版本升级过程。将一个集群中正在运行的多个Pod版本 交替地逐一升级的过程,就是“滚动更新”。

    在升级刚开始的时候,集群里只有1个新版本的 Pod.如果这时新版本Pod有问题启动不起来,那么“滚动更新”就会停止.而在这个过程中,由于应用本身还有两个旧版本的Pod在线,所以服务并不会受到太大的影响。

    Deployment Controller还会确保在任何时间窗口内,只有指定比例的Pod处于离线状态.同时它也会确保,在任何时间窗口内只有指定比例的新Pod被创建出来.这两个比例的值都是可以配置的默认都是DESIRED值的25%。

    在RollingUpdateStrategy 的配置中:
    maxSurge=1指定的是除了DESIRED数量之外在一次“滚动”中,Deployment 控制器还可以创建多少个新Pod。
    maxSurge=50%指的是我们最多可以一次创建 “50%*DESIRED 数量” 个新版本 Pod。
    maxUnavailable=1指的是在一次“滚动”中,Deployment控制器可以删除多少个旧Pod。
    maxUnavailable=50%指的是我们最多可以一次删除 “50%*DESIRED 数量” 个旧版本 Pod。

  • 相关阅读:
    C++基础知识(十六)--- stack&queue&list
    【腾讯云Cloud Studio实战训练营】戏说cloud studio
    HTC手机如何进行官方解锁Unlock
    java: idea中代码自动布局优化、注释、复用等快捷键为
    垃圾回收 - 复制算法
    第33节——useRef
    火狐浏览器翻译页面功能如何设置
    英语——语法——从句——定语从句——笔记
    Mac 搭建本地服务器
    新电脑必备的4款宝藏软件,绿色、安全、无捆绑,提高工作效率
  • 原文地址:https://blog.csdn.net/u013916029/article/details/127786171