DevOps 是一套将软件开发(Development,Dev)和系统运维(Operations,Ops)相结合的实践,旨在缩短应用系统开发生命周期,提供高质量的持续交付。
—— 维基百科 DevOps
0、讲在前面
生产环境的任何操作和变更都有可能产生不可预知的风险,从软件开发出现至今,绝大部分企业对于应用系统都会执行严格的生产环境管控,甚至很多公司都有生产红线,比如我的前司阿里巴巴,就是这样一个对生产绝对敬畏的公司,这样的 DevOps 文化是我所遵循和尊敬的。
上周我部门的同学在一次交流中反馈说:思远负责的后端组感觉对生产出点问题都特别谨慎小心,甚至有点害怕。思远是一路跟随我从阿里到创业公司的兄弟,听到这样的反馈,吾心甚慰,这不是害怕,这也不是谨慎,这是对生产环境的敬畏之心,思远做的很棒,同时我也希望每一个程序员都可以像我的思远一样。
从我的从业经历看,生产系统的运维管理,经历了从 PE、AppOps、DevOps、AIOps、NoOps 的这样几个不同的发展阶段,其实这也是生产环境运维管理的发展阶段。而 DevOps 就是 Dev + Ops,是一组用于促进开发人员和运维人员协作的过程、方法和系统的统称。
1、DevOps 概述
随着云计算的普及和企业数字化转型的加速,云原生架构逐渐成为软件开发和运维的新标准。在这样的背景下,DevOps 作为一种文化和实践,重要性日益凸显。对于研发工程师、架构师来讲,理解并掌握云原生架构领域中的 DevOps 技术,不仅是提升个人技能的需要,也是适应行业发展的必然要求。
DevOps (Development and Operations)一词最早是由 James Turnbull 在 2009 年提出,当时是为了解决开发和运维之间的协作问题。随着云计算、容器技术、自动化工具的发展,DevOps 逐渐成为软件开发和运维的标配。它强调开发、测试、运维等环节和角色之间的紧密协作,目标是为了提高软件交付的效率和质量。简言之就是保证高质量的前提下缩短系统变更从提交到部署到生产环境的时间。
DevOps 作为一组过程、方法与系统的统称,是云原生概念的重要组成部分,是为了促进开发、技术运营和质量保障部门之间的沟通、协作与整合。DevOps 是非常重视软件开发人员(Dev)和运维技术人员(Ops)之间的沟通合作的文化、习惯和方式。其基本思想是打破开发(Dev) 和运维(Ops)之间的壁垒,实现开发、测试、运维等环节和角色的紧密协作以及自动化程度,目的是为了提高软件交付的效率和质量。
DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件系统。上图一张来自网络的图片,图中是与 DevOps 相关的技术和工具汇总。
一个 DevOps 开发环境需要满足以下要求:
- 环境一致性:在本地开发出来的功能,无论在什么环境下进行部署,都应该得到一致的结果
- 代码自动检查:每次代码提交后,系统都应该自动对代码进行检查,以便及早发现潜在的问题,并运行自动化测试
- 持续集成:每次代码提交后,系统可以自动进行代码的编译和打包,无需运维人员手动进行
- 持续部署:代码集成完毕后,系统可以自动降运行环境中的旧版本应用更新成新版本应用,并且整个过程中不会让系统不可用
- 持续反馈:在代码自动检查、持续集成、持续部署的过程中,一旦出现问题,要能及时将问题反馈给开发人员和运维人员,开发运维人员收到反馈后对问题及时进行修复
- 快速回滚:当发现本次部署的版本出现问题时,系统应该能够快速回滚到上一个可用版本
- 弹性伸缩:当某个服务的负载过大,系统应用可以对这个服务快速进行扩容,保证用户的访问。当负载正常后,可以将扩容的资源释放
- 可视化运维:有可视化的界面或者工具,实时监控应用、集群、硬件的各项状态指标
满足以上八点要求的 DevOps 环境究竟应该是什么样的呢?应该包括哪些部分呢?
- 代码仓库 GitLab,也可以使用阿里云 CodeUp
- 容器技术 Docker
- 持续集成工具 Jenkins,也可以使用阿里云云效流水线
- 代码质量检测平台 SonarQube,也可以使用阿里云自带服务
- 镜像仓库 Harbor,也可以使用阿里云仓库制品服务
- 容器集群管理系统 Kubernetes
云原生为 DevOps 效率的提高提供了更多的遍历,众多云原生技术的发展都是为了优化和完善 DevOps 实践而产生的,满足了云时代的系统复杂性和时效性要求,为 DevOps 实现质的提升提供了条件。
- 容器技术和 Kubernetes 服务编排技术的结合,解决了应用部署自动化、标准化、配置化的问题,使建设跨平台的应用成为可能,Kubernetes 成为事实上的云上应用运行平台的标准,极大地简化了多云部署
- 微服务技术降低了服务耦合,让开发和部署更加便捷,有效缩短开发周期,提高部署灵活性
- Service Mesh 技术使中间件的升级和应用系统的升级解耦,提升运维和管控的灵活性
- Serverless 技术让运维对开发透明,对应用所需的资源自动进行扩缩容
- FaaS 技术进一步简化开发和运维的过程,从开发到测试上线都可以在一个集成开发环境中完成
云原生技术促进了 DevOps 技术的演进,而 DevOps 又对容器技术的安全和效率提出了更高的要求,推动容器技术实现更多的创新和变革。
2、DevOps 原则
在现代软件开发和运维领域,DevOps 已经成为一种被广泛采纳的工作方法论,它已经不仅仅是一种技术和工具的集合,更是一种文化和理念的体现。DevOps 包括 CAMS 四个核心原则,分别是:文化(Culture)、自动化(Automation)、度量(Measurement)、共享(Sharing)。
文化
说到 DevOps,一般关注的都是技术和工具,但是实际上,DevOps 要解决的核心问题是人与业务、人与人的问题,即如何提高研发效率,加强跨团队的写作。如果每个人都能够更好地理解对方的目标和所关注的对象,那么彼此的协作质量必将明显提高。
DevOps 的文化原则强调的就是团队之间的协作、信任和共同责任,在传统的开发和运维模式种,开发和运维往往是两个独立的部门,彼此之间缺乏有效的沟通和合作。而在 DevOps 文化种,团队成员被鼓励跨部门合作,打破传统的组织壁垒,形成一个共同的目标和价值观。团队成员应该相互尊重、信任,并且愿意分享知识和经验,共同努力实现团队的使命和愿景。
自动化
对于持续集成,DevOps 的目标就是小步快跑、快速迭代、频繁发布。小点的系统这个相对比较容易,但是大型系统动则每次发布涉及到几十甚至几百人,要让这个流程顺畅,并不是一件容易的事情,这时就需要规范化和流程化,让可以自动化的实现自动化。
自动化是 DevOps 的核心特征之一。通过自动化减少软件交付流程中的重复性任务和人为错误,可以提高效率、降低成本,并确保交付的一致性和可靠性。自动化的范围包括构建、测试、部署、监控等方面。例如,使用持续集成和持续交付(CI/CD)工具自动构建和部署软件;利用配置管理工具自动配置和管理基础设施;采用自动化测试工具进行自动化测试和质量保证。
度量
度量可用于对各个活动和流程进行分析,找到工作种存在的瓶颈和漏洞,并在发生危机情况时及时报警等,从而根据分析结果调整整个协作团队的工作和系统,提升效率,形成一个完整的闭环。
度量是衡量和监控软件交付过程的关键。它包括度量团队的绩效、监控应用程序的健康状况、收集用户反馈等。通过度量,团队可以及时发现问题并采取相应的措施,持续改进软件交付流程。度量也是实现持续改进的基础,通过收集和分析数据,团队可以识别瓶颈和优化点,不断提高软件交付的效率和质量。
共享
要想实现真正的协作,团队还需要在知识层面达成一致。共享知识可以使得团队共同进步。共享是 DevOps 文化中的重要组成部分,团队应该共享知识、经验和工具,促进团队之间的合作和学习。共享还包括开源社区的参与,通过贡献和分享开源项目,推动行业的发展和创新,通过共享,团队可以避免重复工作,加速问题解决的速度,提高团队的生产力和创造力。从我这些年的经验来看,我觉得应该包括以下三个方面:
- 可见度:每个人都可以了解团队其他人的工作,了解某一项工作是否对其他工作产生影响,相互反馈可以使得问题尽早暴露并得到解决。
- 透明性:每个人都需要明白工作的共同目标,缺乏透明性将会导致工作安排失调。
- 知识共享:知识共享主要为了解决两个问题,一是避免某个人成为单点,避免因为该员工的休假或离职导致工作无法正常完成,二是提高团队的集体能力,团队的集体能力要高于团队中个人的能力。
DevOps 的 CAMS 原则是构建高效、协作、持续交付的文化的关键,通过培养良好的团队文化、实现自动化、度量团队绩效、促进知识共享,团队可以实现持续改进,提高软件交付的效率和质量,从而为企业的业务发展和创新提供支持。
3、DevOps 技术和工具
在实际的 DevOps 实践种,是涉及到很多技术和工具的,它们共同构建一个自动化、协作和高效的软件开发生态。
版本控制系统
在软件开发种,版本控制系统是不可或缺的工具,它能够帮助团队协作、管理代码版本、追踪变更记录等。常用的版本控制系统 Git 和 SVN,但是 Git 因为分布式特性和强大的功能已经成为主流,各家云服务提供商也提供了 Git 的云上托管产品能力。
持续集成和持续交付工具
持续集成和持续交付是 DevOps 中的重要实践,能够通过自动化流程,确保代码质量、快速部署和交付,常用的工具包括 Jenkins、GitLab CI/CD 等,我更倾向于阿里云的流水线产品,它们都提供了自动化构建、测试和部署的功能,可以帮助团队快速迭代和交付软件。
自动化部署和配置管理工具
这是实现持续交付的关键,能够帮助团队快速、可靠地部署和配置软件环境,常见的工具包括 Ansible(基于 SSH 的配置管理和自动化部署的工具,用于快速配置和管理服务器)、Puppet(基于模型驱动的配置管理工具,用于自动化服务器配置和软件部署)、Chef(基于 Ruby 的配置管理工具,用于自动化服务器配置和软件部署)等,此外就是各家云服务提供商的对应的产品,通过编排和管理服务器配置,实现了基础设施即代码的理念,提高了部署效率和可靠性。
容器化和容器编排平台
容器化和容器编排是现代软件开发的趋势,能够实现应用程序的快速部署、弹性扩展和管理。Docker 和 Kubernetes 是目前最流行的容器化和容器编排平台,它们提供了统一的容器运行环境和自动化管理功能,极大地简化了应用程序的部署和管理。
监控和日志管理工具
监控和日志管理对于保障系统稳定运行和故障排查至关重要。Prometheus 和 ELK Stack 是常用的监控和日志管理工具,它们能够实时收集、存储和分析系统指标和日志数据,帮助团队快速发现和解决问题。
云计算平台
云计算平台提供了弹性、可扩展的基础设施和服务,能够帮助团队快速构建和部署应用程序。AWS、Azure 等云计算平台提供了丰富的计算、存储、数据库等服务,能够满足不同规模和需求的项目需求。此外国内的项目我还是比较偏向于阿里云。
编程语言和框架
在开发过程中,选择合适的编程语言和框架也是至关重要的。Python、Java、Go 等常用编程语言以及 Spring Boot、Express.js、Flask 等开发框架能够帮助团队快速开发、部署和维护应用程序。
项目协作
项目协作工具在团队协作和沟通中扮演着重要角色,能够帮助团队成员协同工作、分享信息和跟踪任务进度。常见的项目协作工具包括 Jira、Confluence 等,依旧推荐阿里云的云效项目管理服务。
DevOps 相关技术和工具的应用能够帮助团队实现快速交付、高质量和可靠性的软件产品,提升团队的工作效率和竞争力。在实际项目中,团队可以根据需求和场景选择合适的技术和工具,并不断优化和改进工作流程,以实现持续创新和价值交付。