什么是 DevOps?

在传统的软件开发模式中,开发人员为新功能、产品、错误修复等编写大量代码,然后将他们的工作交给运营团队进行部署,通常是通过自动票务系统进行部署。运营团队在其队列中收到该请求,测试代码并准备投入生产--这一过程可能需要数天、数周或数月。在这种传统模式下,如果运营部门在部署过程中遇到任何问题,团队就会向开发人员发回一张票据,告诉他们该如何修复。最终,在这种反反复复的情况得到解决后, 工作负载 被推入生产。

这种模式使软件交付成为一个漫长而分散的过程。开发人员常常把运营视为拦路虎,拖慢了他们的项目进度,而运营团队则觉得自己是开发问题的垃圾场。

DevOps 通过在整个软件交付流程中联合开发和运营团队来解决这些问题,使他们能够更早地发现和修复问题,自动进行测试和部署,并缩短上市时间。

为了更好地理解什么是 DevOps,我们先来了解一下 DevOps 不是什么。

 

DevOps 不是

  • 开发团队和运行团队的组合:仍然有两个团队,他们只是以一种沟通、协作的方式开展工作。
  • 它有自己独立的团队:没有所谓的 "DevOps 工程师"。尽管有些公司在尝试过渡到 DevOps 文化时,可能会任命一个 DevOps 团队作为试点,但 DevOps 指的是一种开发人员、测试人员和运营人员在整个软件交付生命周期中通力合作的文化。
  • 一种工具或一套工具:虽然有一些工具可以很好地与 DevOps 模式配合使用,或有助于促进 DevOps 文化,但 DevOps 归根结底是一种策略,而不是一种工具。
  • 自动化:虽然自动化对 DevOps 文化非常重要,但它本身并不能定义 DevOps。

 

定义 DevOps

在 DevOps 模式中,开发人员不是先编写庞大的功能集,然后再盲目地交给运营部门进行部署,而是经常交付少量代码进行持续测试。开发和运营团队不再通过票务系统沟通问题和请求,而是定期会面、共享分析结果并共同负责端到端的项目。

 

CI/CD 管道

DevOps 是一个持续集成和持续交付(或持续部署)的循环,又称 CI/CD 管道。CI/CD 管道将开发和运营团队整合在一起,通过实现基础架构和工作流程自动化以及持续测量应用程序性能来提高工作效率。看起来是这样的

CI/CD 管道的阶段和 DevOps 工作流程
图 1:CI/CD 管道的阶段和 DevOps 工作流程
  • 持续集成 要求开发人员每天多次将代码集成到存储库中,以便进行自动测试。每次签入都由自动构建进行验证,使团队能够及早发现问题。
  • 持续交付(不要与持续部署混淆)是指 CI 管道是自动化的,但代码在生产中实施之前必须经过人工技术检查。
  • 持续部署 让持续交付更进一步。代码不需要人工检查,而是通过自动测试并自动部署,让客户即时获得新功能。

 

DevOps 与安全

DevOps 存在的一个问题是,安全问题经常被忽视。开发人员行动迅速,工作流程自动化。安全小组是一个独立的团队,开发人员不想因为安全检查和请求而放慢速度。因此,许多开发人员在部署时没有通过适当的安全渠道,难免会犯下有害的安全错误。

 

为了解决这个问题,组织正在采用 DevSecOps。DevSecOps 采用了 DevOps 背后的理念,即开发人员和 IT 小组应在整个软件交付过程中密切合作,而不是各自为政,并将其扩展到安全领域,将自动检查集成到整个 CI/CD 管道中。这就解决了安全似乎是外力的问题,使开发人员能够在不影响数据安全的情况下保持速度。

 

DevOps 常见问题

基础设施即代码(IaC)是指通过机器可读的定义文件来管理和配置 IT 基础设施。Terraform 和 AWS CloudFormation 等 IaC 平台可实现基础设施设置的自动化,从而实现一致且可重复的部署。通过将基础设施视为软件,组织可以将版本控制、测试和持续集成实践应用于基础设施变更,从而提高敏捷性和可靠性。
持续集成(CI)是一种开发实践,开发人员经常将代码变更合并到中央存储库,触发自动构建和测试。CI 能尽快发现集成错误,提高软件质量,缩短交付新更新的时间。它构成了向生产环境持续交付应用程序的基础。
持续交付(CD)是对持续集成的扩展,它在构建阶段结束后自动将所有代码变更部署到测试或生产环境中。CD 使开发人员能够确保他们的代码始终处于可部署状态,便于更无缝、更快速地交付给最终用户。它在开发和运营之间架起了一座桥梁,促进了更敏捷、反应更迅速的软件生命周期。
持续部署是将经过验证的变更自动发布到生产中,无需人工干预。它比持续交付更进一步,在持续交付中,通过生产管道所有阶段的每一个变更都会发布给客户。这种做法加快了反馈循环,提高了发布流程的效率和可靠性。
自动化通过执行预定义指令来管理任务,无需人工干预。在云安全方面,自动化工具可以部署策略、扫描漏洞并应对威胁,从而简化安全操作。它们与云 API 交互,利用脚本和工作流程配置资源、执行合规性并高效地协调复杂流程。
配置管理是指将系统保持在理想的一致状态。它可以跟踪软件和硬件的更改和配置,防止漂移和未经授权的更改。Ansible、Puppet 和 Chef 等工具可自动更改整个 IT 环境的配置,确保系统配置正确统一。
协调可实现跨多个系统和服务的复杂任务和工作流程的自动化管理。它将自动化任务协调为一个连贯的流程,管理相互依存关系,并对行动进行排序。在云环境中,Kubernetes 等编排工具可以管理容器化应用程序,处理部署、大规模扩展和网络,从而优化资源利用率并保持应用程序性能。
微服务 是一种设计方法,在这种方法中,应用程序由小型、独立的服务组成,这些服务通过定义明确的应用程序接口进行通信。每项服务都专注于单一业务能力,运行自己的流程,并可独立部署。这种架构增强了可扩展性,加快了开发周期,并提高了故障隔离能力。
监控和日志记录对于维护云环境的运行性能和安全性至关重要。监控功能可实时了解基础架构、应用程序和服务,从而对系统的健康状况和性能进行主动管理。日志记录事件和数据点,这对故障排除、取证分析和合规性审计至关重要。它们共同实现了对事件的快速检测和响应,确保了持续可用性和安全性。
版本控制系统跟踪并管理对代码、文档或其他信息集合的更改。它们可促进开发团队之间的协作,维护更改历史,并在需要时恢复到以前的版本。版本控制是管理代码库、减少冲突、确保部署一致性和可追溯性的基础。
常见的部署策略包括蓝绿部署,即并行运行两个相同的环境,其中一个作为实时环境,另一个托管新版本。金丝雀版本在大范围部署之前,会向一小部分用户增量推出更改。滚动更新会逐渐用新版本替换旧版本,从而减少停机时间和风险。
容器化将 应用程序及其依赖关系封装到一个容器中,该容器可在任何计算环境中运行。这种方法提供了虚拟机的轻量级替代方案,在开发、测试和生产环境中提供了效率和一致性。容器化简化了应用程序的部署、大规模扩展和管理,将应用程序与底层基础设施隔离开来。
Docker 通过使用容器来创建、部署和运行应用程序。它使开发人员能够将应用程序及其所有依赖项打包成一个标准化单元。Docker 提供了管理容器生命周期的工具和平台,包括构建容器映像、容器协调、大规模扩展和网络。
Kubernetes 负责协调容器化应用程序,管理其部署、大规模扩展和运行。它能确保应用程序的理想状态与云环境中的实际状态相匹配。Kubernetes 可自动实现负载平衡、监控应用程序健康状况,并通过重启或替换出现故障或无响应的容器来提供自愈功能。它还能处理服务发现,并将配置和敏感信息作为机密进行管理。
构建管道由一系列编译代码、运行测试和部署软件的自动化流程组成。它首先从版本控制中检索代码,然后构建可执行文件、运行自动测试并部署到各种环境中。该管道旨在在每个阶段提供反馈,确保代码质量,并简化从开发到生产的流程。
测试自动化加快了对软件功能、安全性和性能的验证。它无需人工即可进行重复和广泛的测试,提高了一致性和覆盖率。自动测试可同时在多个环境和设备上运行,为开发人员提供快速反馈,缩短新版本的上市时间。
代码存储库是代码及其相关文件的存储位置,便于进行版本控制和协作。它是存储、跟踪和管理代码库变更的中心枢纽。代码存储库支持分支和合并,允许开发人员在将更改整合到主代码之前,在隔离的环境中运行功能、修复或实验。
发布管理包括通过不同阶段和环境对软件构建进行规划、调度和控制。它包括管理发布管道、与利益相关者协调、确保合规性发布标准以及将软件部署到生产中。该流程旨在可靠、高效地交付新功能和修复程序,将对服务的干扰降至最低。
敏捷方法强调迭代开发、客户协作和对变化的响应能力。它主张小规模、渐进式发布、持续反馈和适应性规划。敏捷原则提倡跨职能团队协作、可持续发展步伐和反思性实践,以持续改进流程和产品。
无服务器架构允许开发人员构建和运行应用程序,而无需管理服务器基础设施。它将服务器抽象化,使开发人员只需专注于编写代码。云提供商管理执行环境,动态管理资源分配。无服务器架构可根据需求自动大规模扩展,用户只需为消耗的计算时间付费。
性能优化包括优化系统设置和代码,以提高响应时间、吞吐量和资源使用率等性能指标。它要求对应用程序进行剖析和监控,以找出瓶颈,然后调整配置、优化代码,并确保有效的资源分配,从而提高系统的整体效率。
通过设计容错系统,可在不中断服务的情况下处理故障并从故障中恢复,从而确保复原力和可靠性。实施冗余、故障转移机制、定期测试灾难恢复程序和实时监控,有助于建立稳健的系统架构。这些做法有助于在系统出现压力或意外问题时保持性能和可用性的一致性。