黄 静,陈秋燕,姚东烽
(1.中国移动通信集团广东有限公司,广东 广州 510640;2.浪潮世科(山东)信息技术有限公司,山东 济南 250000)
随着业界IT技术的不断发展以及企业园区信息化应用系统不断增多,且各应用系统采用的技术架构及开发平台差异较大,对于这些应用系统的持续优化、扩容及维护都要花费较大的投资和成本。通过在微服务PaaS平台构建DevOps流水线,能够实现敏捷开发及自动化部署、运维一体化的流程,实现从多个角度对业务系统进行自动化运维监控,从而实现信息化应用的全生命周期无缝管理及自动化的高可用保证。
DevOps源于“Development(开发)”和“Operation(运维)”两个词的缩写,软件开发和IT运维的结合被称为DevOps。DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。[1]
从定义中可以看出,可以明确DevOps这个过程参与的人员主要是开发团队和运维团队,而DevOps的目的是在两个团队之间,建立良好的沟通和协作,更快速、更可靠的创建高质量软件。
瀑布模式是最早出现的软件开发模型,由于这种模型的线性过程太理想化,在现代业界的软件开发中,瀑布模式几乎不复存在。而同样作为传统模式的迭代式开发和螺旋开发,是在瀑布模式的基础作出调整和改良的软件开发模式,在现时某些特地场景有其一定的适用性。
现代最流行的是敏捷管理模式,敏捷开发不追求前期完美的设计、完美编码,而是力求在短期内开发出产品的核心功能,尽早发布出可用的版本,然后在后续的生产周期内按照新需求不断迭代升级,完善产品。
DevOps是最新近才出现的,它是将运维纳入产品开发过程的思维方式,是敏捷的有效补充,它通过消除资源浪费和简化部署等方式来实现这一目标,从而实现更快,更持续的生产部署。
瀑布模式 敏捷模式 DevOps相似点 三者都有软件开发、测试和部署这三个阶段。但前者严格按照线性方式进行,而后两者追求快速开发软件,适合经常变化的项目。不同点1、将软件生存周期的各项活动规定为按固定顺序而连接的若干阶段工作,阶段之间产生大量的文档,不适应用户需求的变化。2、由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险;1、简化了传统开发管理的繁琐流程和文档,假设和拥抱不确定性,认为需求变更是客户需求的一部分,强调适应性和团队中的高度协作;2、敏捷方法在运维方面没有敏捷实践的速度,开发和运维之间缺乏协作仍然会减慢开发过程和发布;3、敏捷流程在三个阶段之后会终止。1、DevOps几乎拥有敏捷开发模式的一切优点;2、DevOps方法是基于对更好的协作和更快的交付的需求而产生的;3、D e v O p s包 括 后续持续的运维,即DevOps会持续的监控软件运行情况和进行持续的开发。
二者的区别主要在于开发和运维的模式上,如下所述:
传统方式 DevOps 1.传统上在软件开发中(无论是瀑布模型还是敏捷方式,敏捷也比较传统),都由“开发团队”来构建软件。2.开发团队需要与运维团队进行了大规模的“交接”。运维团队负责执行一系列“部署”活动,将软件代码移至生产环境,并负责维护后续的系统稳定运行。3.生产环境的基础设施与开发或测试不同。4.需要有额外检查和平衡,以确保它一切功能正常。DevOps打破了开发和部署之间的界限,实现开发运维一体化:1. 支持持续集成(CI),开发人员提交了新代码之后,立刻自动的进行构建、(单元)测试。2. 支持持续部署(CD),当交付的代码通过评审之后,自动部署到生产环境中。3.自动化了所有测试用例,所有的配置管理、环境管理和发布管理,可以直接launch。
一般来说,DevOps由多个阶段组成:持续开发、持续测试、持续集成、持续监控、持续部署,这些阶段统称为DevOps生命周期。这五个阶段能体现DevOps从”需求提出->生产->完整交付”的整个开发流程,下面对DevOps生命周期的阶段性进行分析。[3]
DevOps生命周期的第一个阶段是编码和构建。开发应用程序源代码的第一步是从不同的编程语言中进行选择,诸如JavaScript,C / C ++和Python等。而维护代码的过程称为源代码管理(SCM),可使用Git和SVN等工具来维护不同版本的代码,以及使用Gradle,Maven等类似工具来构建/打包代码到可执行文件中。
与瀑布模式不同的是,软件可交付成果被分解为短开发周期的多个任务节点,在很短的时间内开发并交付。这是DevOps生命周期中一个不断进行软件开发的阶段。
在这个阶段,对开发的软件进行持续的Bug测试。TestNG,Selenium和JUnit是常用于自动化测试的一些DevOps工具,这些工具允许质量管理系统完全并行地测试多个代码库,以确保功能中没有缺陷。通过自动化测试,可节省开发人员手动测试浪费的时间和精力。在这个阶段,使用Docker容器实时模拟测试环境。一旦代码测试通过,它就会被重新发送到持续集成阶段以更新源代码。
这是支持新功能的代码与现有代码集成的阶段,是整个DevOps生命周期的核心。软件在不断地开发,源代码在频繁地更改,更新后的代码需要不断地集成,并顺利地与系统集成,以反映对最终用户的需求更改。更改后的代码,还应该确保运行时环境中没有错误,允许我们测试更改并检查它如何与其他更改发生反应。
Jenkins是被广泛应用的可靠的持续集成工具,用于获取更新的源代码,并生成一个构建,最终可以部署到测试或生产环境。 这些转换是无缝进行的,更新的代码将打包并进入下一阶段,即测试或生产服务器。
在此阶段,最终确定的应用程序代码将被部署到生产环境。配置管理是这一阶段的关键过程,它将应用程序代代码发布到服务器,为所有服务器安排更新,确保应用程序性能和功能条件在整个生产过程中保持一致。Puppet,Chef,SaltStack和Ansible是用于配置管理的一些有效的DevOps工具,用于执行新代码的快速和连续部署。
需要注意的是,如果添加了任何功能或引入了新功能,我们应该准备好迎接更多的网站流量。
容器化工具在部署阶段也发挥着重要作用。 Docker和Vagrant是流行的容器化工具,这些工具有助于在开发,测试,登台和生产环境中实现一致性。 同时,它们还可以处理连续部署的可伸缩性。
这是DevOps生命周期中非常关键的阶段,持续监控旨在保持应用程序中服务的可用性。在此阶段,IT运维团队比开发团队的参与程度更高,他们监视用户活动、检查系统是否有异常行为以及跟踪错误的存在。一些常见系统错误如“服务器无法访问”或“内存不足”可以在这个阶段被发现和解决,它还能确认重复出现的系统错误的威胁和根本原因。
这也可以通过使用专用监控工具来实现,Splunk,ELK Stack,Nagios,NewRelic和Sensu是用于持续监控的关键DevOps工具。这些工具可帮助密切监视应用程序和服务器,主动检查系统的运行状况。在这些工具的帮助下,可以提高生产率和应用程序的可靠性,从而降低IT支持成本。当在此阶段检测到重大问题时,可以向开发团队报告,以便可以在持续开发阶段进行修复。
这些DevOps阶段连续循环进行,直到达到所需的产品质量。下图显示了在DevOps生命周期的各个阶段所使用的工具。
DevOps的实施往往需要在一个完整的DevOps过程支撑平台基础之上,将研发过程管理、持续交付和技术运营全部融合到一起,同时底层开发基于微服务开发框架,组件运行依托在容器化PaaS平台上,形成一个完整的整体。[4]PaaS平台+DevOps是使用微服务架构在 PaaS上建立应用程序使得开发人员与运营之间的协作更加无缝。PaaS产品充分利用了容器,提供了正确的标准化以简化部署管道,当这一点与构建和部署微服务的小团队协作优势相结合时,就能够实现DevOps利益最大化。
微服务、容器、PaaS和DevOps的组合具有巨大潜力,能够将大型企业信息技术进行转型,能够协助企业进行研发管理过程的规范化和流程化,再进一步实现自动化。
微服务PaaS平台构建DevOps流水线,通过采用敏捷开发模式,能够明显提升开发的效率,支持适度的需求变更,支持持续的CI/CD,更好地提升软件系统的易用性及友好性,同时提升运维效率。