1.2.4 DevOps
DevOps是一套将软件开发(Development,Dev)和系统运维(Operations,Ops)相结合的实践,旨在缩短应用系统开发生命周期,提供高质量的持续交付。
——维基百科“DevOps”
线上的任何操作及变更都可能产生不可预知的风险,因此一直以来,绝大部分企业对于IT系统执行严格的线上管控。线上系统的运维管理,经历了“PE、AppOps、DevOps、AIOps、NoOps”的不同发展阶段。从字面上来理解DevOps只是Dev(开发人员)+Ops(运维人员),实际上,它是一组用于促进开发人员和运维人员协作的过程、方法和系统的统称,如图1-5所示。
▲图1-5 IT部门内的DevOps协作
DevOps提倡通过一系列的技术和工具减少开发和运维之间的隔阂,实现从开发、构建到最终部署的全流程自动化,从而达到开发运维一体化。DevOps是一套实践方法,在保证高质量的前提下缩短系统变更从提交到部署至生产环境的时间。DevOps概念从2009年首次提出发展到现在,内容非常丰富,有理论,也有实践,包括组织文化、自动化、精益、反馈和分享等方面。
(1)组织架构、企业文化与理念等需要自上而下设计,用于促进开发部门、运维部门和质量保障部门之间的沟通、协作与整合。简单而言,组织形式类似于系统分层设计。
(2)自动化是指所有的操作都不需要人工参与,全部依赖系统自动完成,比如上述的持续交付过程必须自动化才有可能完成快速迭代。
(3)DevOps的出现,得益于软件行业日益清晰地认识到,为了按时交付软件产品和服务,开发部门和运维部门必须紧密合作。
质量很重要,而保障交付软件质量的办法,一方面是各种测试,从最细粒度的单元测试一直到最接近用户感受的集成测试;另一方面是递进式的发布,逐渐扩大变更影响到的用户范围,及时发现,及时止损。将DevOps的理念引入整个系统的开发过程中,能够显著提升软件的开发效率,缩短软件交付的周期,更加适应当今快速发展的云原生时代。DevOps强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。图1-6所展示的是和DevOps相关的一些技术和工具。
▲图1-6 与DevOps相关的技术及工具(图片来自网络)
说到DevOps,就必然会提到持续集成。持续集成是指在软件开发过程中,软件开发人员持续不断地将开发出来的代码和其他开发人员的代码进行合并,每次合并后自动进行编译、构建,并运行自动化测试进行验证,而不是等到最后各自开发完成后才合并在一起。持续集成能从根本上提高一个团队的软件开发效率。在软件开发过程中引入持续集成,可以帮助团队及时发现系统中的问题,并快速做出修复。这样不仅可以缩短软件开发的时间,而且可以交付更高质量的系统。
一个DevOps开发环境需要满足以下8点要求。
(1)环境一致性:在本地开发出来的功能,无论在什么环境下进行部署,都应该能得到一致的结果。
(2)代码自动检查:每次代码提交后,系统都应该自动对代码进行检查,以便及早发现潜在的问题,并运行自动化测试。
(3)持续集成:每次代码提交后,系统可以自动进行代码的编译和打包,无须运维人员手动进行。
(4)持续部署:代码集成完毕后,系统可以自动将运行环境中的旧版本应用更新成新版本应用,并且整个过程中不会让系统不可用。
(5)持续反馈:在代码自动检查、持续集成、持续部署的过程中,一旦出现问题,要能及时将问题反馈给开发人员和运维人员。开发人员和运维人员收到反馈后对问题及时进行修复。
(6)快速回滚:当发现本次部署的版本出现问题时,系统应能快速回退到上一个可用版本。
(7)弹性伸缩:当某个服务访问量增大时,系统应可以对这个服务快速进行扩容,保证用户的访问。当访问量回归正常时,系统能将扩容的资源释放回去,从而实现根据访问情况对系统进行弹性伸缩。
(8)可视化运维:提供可视化的页面,可实时监控应用、集群、硬件的各种状态。
为了满足以上8点要求,设计出的DevOps开发环境如图1-7所示。
▲图1-7 DevOps开发环境
整个环境主要由以下6个部分组成。
(1)代码仓库 GitLab。
(2)容器技术Docker。
(3)持续集成工具Jenkins。
(4)代码质量检测平台SonarQube。
(5)镜像仓库Harbor。
(6)容器集群管理系统Kubernetes。
整个环境的运行流程主要分为以下6步。
(1)开发人员在本地开发并验证完功能后,将代码提交到代码仓库。
(2)通过事先配置好的Webhook通知方式,当开发人员提交完代码后,部署在云端的持续集成工具Jenkins会实时感知,并从代码仓库中获取最新的代码。
(3)获取到最新代码后,Jenkins会启动测试平台SonarQube对最新的代码进行检查以及执行单元测试,执行完成后在SonarQube平台上生成测试报告。如果测试未通过,则以发送电子邮件的方式通知研发人员进行修改,终止整个流程;如果测试通过,则将结果反馈给Jenkins并执行下一步。
(4)代码检查以及单元测试通过后,Jenkins会将代码发送到持续集成服务器中,在服务器上对代码进行编译、构建,然后打包成能在容器环境中运行的镜像文件。如果中间有步骤出现问题,则通过发送电子邮件的方式通知开发人员和运维人员进行处理,并终止整个流程。
(5)将镜像文件上传到私有镜像仓库Harbor中保存。
(6)镜像上传完成后,Jenkins会启动持续交付服务器,对云环境中运行的应用进行版本更新,整个更新过程中会确保对服务的访问不中断。持续交付服务器会将最新的镜像文件拉取到Kubernetes集群中,并采用逐步替换容器的方式对应用进行更新,在服务不中断的前提下完成更新。
通过上述几步,我们就可以简单实现一个DevOps开发环境,实现代码从提交到最终部署的全流程自动化。通过一系列工具和自动化的技术来降低运维的难度,促进研发运维一体化。一般来说,DevOps会要求研发人员负责更多的业务运维或应用运维的工作。在平台类软件维护的场景中,极端情况下会将传统运维的工作拆分为两部分——应用运维和平台运维。应用运维是指包括应用本身的可用性、容量、业务正确性、监控与告警在内的所有与业务相关的应用本身的运维。平台运维是指包括底层IaaS层以及支撑应用运维的系统本身的维护。研发人员负责应用运维,可以在不借助其他团队的支持且资源充足的情况下,自行完成应用的全生命周期的管理。
DevOps的完整执行需要企业内部组织流程的配合和改造。图1-8所示为某大型互联网公司内部研发体系与工作流程,不同岗位角色的人参与整个产品生命周期的不同阶段:市场→需求→视觉交互→demo原型→开发测试→集成部署→上线发布→评测反馈的完整的持续交付过程。DevOps鼓励小团队协作,因为小团队维护少量的服务,可以快速决策、快速发布,充分利用DevOps的能力。