Kubernetes从入门到实践
上QQ阅读APP看书,第一时间看更新

开发过程大致经历了3个阶段——瀑布式开发、敏捷式开发和DevOps(在每个阶段发布产品的周期及反馈循环的快慢各不相同)。本节会结合容器技术介绍开发过程的发展。

瀑布模型是一种广泛采用的项目开发过程。瀑布模型由各个阶段组成,从上一个阶段流向下一个阶段,各个阶段都会产生反馈,从系统需求分析阶段开始,然后一直流向产品发布和维护阶段。其核心思想在于,按照一定的工序让问题变得有迹可循,将软件开发过程划分为需求分析、需求定义、概要设计、详细设计、编码、系统测试、验收测试、维护这8个阶段。各个阶段自上而下,互相衔接,就像是瀑布流水一样(见图1-1)。

图1-1 瀑布式开发

瀑布式开发的缺点是显而易见的。

(1)由于阶段的划分比较独立,因此各个阶段的衔接会存在脱节情况,即上一个阶段的成果未必适合下一个阶段。

(2)计划非常死板。任何一个环节出现延误,都会像滚雪球一般影响后续阶段。瀑布式开发通过强制的完成日期来跟踪各个项目阶段,毫无弹性。

(3)交付周期太长,过程风险难以控制且不能及时响应变化。

(4)反馈回路太长,几乎到最后阶段才能发现瀑布式开发是否适用。

容器技术在这一代开发过程中没有发挥太大作用,即使使用,也局限于最后一两个阶段。有容器固然很好,但由于瀑布模型的先天劣势,容器对它帮助不大,收效甚微。

敏捷式开发是一种以用户需求为核心,通过迭代、循序渐进完成软件开发的方法。它的核心在于,整个项目被拆分为多个拥有联系但相对独立的子项目。这些子项目通常在一个迭代周期(通常为2~4周)发布一次,而每次迭代都经历了完备的开发流程,并通过了各项测试,因此这些子项目可以作为单独的产品使用。

这种方法也非常适合一开始没有或不能完整确定需求和范围的项目,或者经常变化的项目。相对于瀑布式开发,敏捷式开发明显更具有弹性,对风险更可控。敏捷式开发的交付周期适中,反馈回路相对较短,可执行原型和部分实现的可运行系统是了解用户需求与反馈的有效媒介。每次迭代完成后,都可以基于用户反馈或总结,持续优化下一次迭代(见图1-2)。

图1-2 敏捷式开发

敏捷式开发的交付周期适中,反馈回路适中,很多开发团队会使用持续集成时间贯穿整个过程。容器技术开始在这一开发过程中显示出一定的作用。有效利用它会带来可见的良性改观,但容器技术并未起决定性作用。

很多人在讨论DevOps的时候,会把Kubernetes等同于DevOps,其实他们并未理解DevOps的精髓。简单地将DevOps理解为自动化部署,其实是很不科学的。

DevOps一词来自Development和Operation的组合,突出了软件开发人员和运维人员的沟通合作,通过自动化流程来使软件构建、测试与发布更加快捷、频繁和可靠。然而,这只是文字上的定义。

前两节已经介绍过瀑布式开发和敏捷式开发,请注意这些过程的关键点。开发过程的发展趋势如下。

(1)越来越快速、越来越频繁的交付,交付周期越来越短。

(2)更迅捷的反馈回路,反馈周期明显变短。

很多业内人士依然使用瀑布模型,一个月甚至更长时间交付一次,然后再对某些小环节实施自动化,并把它当作DevOps。这种对DevOps的理解并未上升到软件工程的高度,这样的自动化也并非DevOps。

作为第3代开发过程,DevOps比敏捷式开发拥有更短的交付周期,更快的反馈回路。从需求分析到发布产品再到生产环境,敏捷式开发大约一个迭代周期中(2~3周)有一次交付,而DevOps呢?最快的DevOps只有几分钟,常见的有一小时、半天等。

DevOps是怎么做到的呢?这里必须要理解一个概念,即“最小原子产品”。每一个“最小原子产品”都是一个单独发布的产品(这个产品也许只是某个特征,甚至有的只需要几分钟就可以完成编码)。伴随着全链路监控,DevOps能够真正做到更快捷的持续交付,并拥有更短的反馈回路。相对于敏捷式开发,DevOps响应变化的速度更快,对风险更可控,如图1-3(a)与(b)所示。发布频率越高,项目中的变化就越小,也越能灵活响应。

图1-3 敏捷式开发与DevOps的风险

对于这种方式,必须理解一个要点,如果敏捷式开发每两周做一次交付,那么DevOps在两周里会有10多次的交付。也就是说,执行从需求到部署这一系列过程(比如,需求测试、回归测试、本地部署、生产环境部署),DevOps会比敏捷式开发多执行10次以上。如果在一个低效、不增效环节较多的组织中实现DevOps,简直就是噩梦。

不增效环节并不是只靠自动化就可以解决的,比如在有些组织中轮转每个过程时,需要填写各种毫无意义的单据,审批增加的等待时间,由于项目粒度太大而导致代码冲突很多,测试人员和部署人员隔墙丢包等。这些并非仅靠自动化就可以解决,要真正实现DevOps,要在公司上下对这些毫无价值的额外环节进行不断优化,然后再讨论自动化。然而,自动化也是必不可少的。

作为自动化部署的一大利器,Kubernetes高效的部署、卓越的集群管理、强大的反馈监控等,能够给DevOps打下坚实的基础(如果测试人员、运维人员需要频繁部署,并且每次都卡在部署环节中的环境问题上或部署低效,则DevOps在两周内可能比敏捷式开发多走几十次流程,简直让人崩溃)。而Kubernetes本身并不是DevOps,而DevOps也不是Kubernetes。它们是相辅相成的,Kubernetes这样的平台会真正在DevOps这种开发过程中尽其所能,大放异彩。另外,Kubernetes也是DevOps中不可或缺的一环。