DevOps / 云计算方向 · 共 15 问 · 内容来自 roadmap.sh
DevOps 是一种文化与协作理念,强调开发团队与运维团队之间的沟通、协作、整合与自动化,从而实现更快、更可靠的软件交付。
DevOps 并不是一个具体的职位头衔或角色,而是一套可以应用于软件开发和 IT 运维中多种角色的原则与实践。任何参与软件开发和交付过程的人——包括开发者、测试人员、运维工程师、产品经理等——都可以在工作中采纳 DevOps 思维并践行 DevOps 实践。
虽然 DevOps 不是具体的职位头衔或角色,但组织通常会招聘“DevOps 工程师”这一职位。DevOps 工程师是一类软件工程师,专注于掌握支撑软件持续交付的最佳实践和工具。
DevOps 工程师(通常隶属于更大的 DevOps 团队)负责弥合开发团队与运维团队之间的鸿沟。他们与开发者、测试人员和运维人员密切协作,监督代码发布,并提供必要的工具来自动化并加速团队的上市进程,同时确保交付物的质量。
DevOps 工程师通过促进开发与运维团队之间的协作来简化软件开发生命周期,在其中扮演着关键角色。换句话说,就是推动 DevOps 方法的落地。
归根结底,这些工程师始终致力于提升软件交付的速度、效率和可靠性:通过自动化任务、引入持续集成与持续部署(CI/CD)来简化代码晋级流程、简化基础设施管理,以及最后但绝对不容忽视的一环——配置监控与告警规则。
他们与开发者协作,确保代码被高效地构建、测试和部署,同时维护底层基础设施,保障应用平稳运行。这通常涉及配置云环境、落实安全最佳实践、优化部署流水线,以及搭建可观测性工具来监控性能。
最终,DevOps 工程师帮助企业构建并维护可扩展、高弹性的系统,同时减少人工流程,助力将停机时间降至最低。
要成为 DevOps 工程师,你需要具备开发、自动化、容器化、云计算、CI/CD 流水线等方面的技术技能。虽然几乎不可能在所有领域都做到精通,但实际情况往往是不同的 DevOps 工程师会在 DevOps 文化的不同方面各有所长。
值得学习的 DevOps 工具和技术示例包括:用于编写脚本的 Python 或 JavaScript 等编程语言、AWS、用于配置管理的 Ansible、用于基础设施即代码的 Terraform、Docker、Kubernetes、Jenkins、用于源码控制的 Git,以及监控和日志工具。
可以从参与 DevOps 项目起步,逐步积累经验、培养 DevOps 思维、考取相关认证,然后在简历中突出自己的技能与经验,申请 DevOps 工程师职位。
通过动手完成一些 DevOps 项目,开启你的 DevOps 工程师职业之路。
DevOps 工程师通常会写代码,不仅如此,他们往往还具备出色的编码能力。毕竟,他们的工作几乎处处离不开代码。
不过要注意,他们并不总是像软件开发者那样编写应用程序代码(这本来也不是他们的职责),而是经常使用 Python、Bash、Go 或 Ruby 等语言编写脚本来自动化各类任务。
DevOps 工程师还会使用 Terraform 或 CloudFormation 等工具编写基础设施即代码(IaC),用脚本语言搭建 CI/CD 流水线,并用 Ansible、Chef 或 Puppet 自动化系统配置。现有的 DevOps 工具 种类相当丰富,其中大多数都需要一定的编码能力。
虽然并非总是如此,但在某些情况下,他们在排查部署问题或优化性能时,也可能需要理解并修改应用程序代码(这类工作也可以与开发团队协作完成)。
简而言之,编码是 DevOps 工程师技能库的重要组成部分,但重点在于自动化、效率和系统可靠性,而非纯粹的应用程序开发。
DevOps 工程师与开发者各不相同,但在软件开发中,两者的角色相辅相成。开发者专注于编写应用代码、实现功能和优化性能,而 DevOps 工程师则通过管理部署流水线、自动化基础设施和维护系统可靠性,确保软件在生产环境中平稳运行。
一个关键区别在于:开发者主要负责构建和改进应用程序,而 DevOps 工程师则负责支撑持续集成、自动化测试 和高效部署的流程与工具。如果你想了解更详细的对比,这篇关于 DevOps 与开发者的指南 有更深入的剖析。同样,如果你想知道 DevOps 与全栈开发的对比情况,这份资源 也提供了很有参考价值的视角。
虽然两种角色都需要编码能力,但 DevOps 更侧重于自动化、可扩展性和系统稳定性,从而让开发者能够更快地交付代码,同时减少问题的发生。
准备 DevOps 面试的一个好方法是动手做 DevOps 实战项目,展示你在自动化、CI/CD、云基础设施和监控方面的技能。搭建一个家庭实验环境(home lab),在其中自由尝试新技术,或使用 Docker、Kubernetes、Terraform 和 Jenkins 等 DevOps 工具部署应用,有助于证明你的实践经验,让你在与其他候选人的竞争中占据优势。
除此之外,另一个好办法是复习 常见的 DevOps 面试题。这能帮你发现知识上的薄弱环节。基础设施即代码(IaC)、容器编排、日志与监控以及安全最佳实践等话题在面试中经常出现。
另一个实用的步骤是阅读 DevOps 工程师的职位描述,了解业界的实际要求。这能让你更清楚地知道雇主看重什么,并据此调整自己的学习计划。
最后,软技能同样重要——要准备好谈论你如何与开发者协作、如何处理故障事件以及如何优化部署流程。DevOps 既关乎技术能力,也关乎文化和团队协作,因此展现出解决问题的思维方式和对 DevOps 原则 的理解,会让你在面试中脱颖而出。
DevOps 生命周期是一系列帮助组织更快速、更可靠地交付软件的实践和流程。DevOps 生命周期通常包括规划、开发、测试、部署、监控和反馈。
生命周期从规划开始,团队在这一阶段确定目标、梳理功能,并制定开发路线图。敏捷方法论以及 Jira 等工具有助于推进这一过程。在开发阶段,开发者使用 Git 等版本控制系统编写并提交代码。这一阶段也会涉及测试(尽管并非重点),通常借助 Jasmine 或 JUnit 等单元测试套件来完成。
代码完成后进入测试阶段,通过自动化和人工测试验证功能、安全性和性能,确保应用在部署前保持稳定。接下来是部署阶段,CI/CD 流水线将发布流程自动化,让更新能够以最小的风险推送到预发布(staging)或生产环境,同时通过自动化测试和校验保障交付的质量与安全性。
部署完成后,监控工具会跟踪系统健康状况和应用性能,实时洞察潜在问题。最后在反馈阶段,团队可以分析监控数据、用户反馈和事件响应情况,不断迭代改进流程,优化后续版本。
借助 DevOps 生命周期,企业将这些阶段自动化并整合起来,从而改善开发与运维团队之间的协作,加快软件交付速度,并提升软件产品的整体质量。
DevOps 自动化是指利用各种工具和脚本,尽量减少开发生命周期中的手动操作。本质上,它是一种通过自动化项目关键环节来应对挑战的策略。
虽然自动化无法消除所有问题,但执行得当的自动化方案可以提高效率、减少失误并加快交付速度。其实现方式是简化关键步骤,重点关注:代码集成、运行测试、基础设施配置、配置管理、应用部署以及系统性能监控。
这项实践中的一个重要领域是持续集成/持续部署(CI/CD),它能在极少人工干预的情况下自动测试并部署代码变更。
此外,基础设施即代码(IaC)让团队能够通过代码来定义和管理基础设施,从而实现更可靠、更具扩展性且更快速的部署。配置管理工具可自动完成系统设置和软件安装,而监控与日志解决方案则能实时洞察系统的健康状况。
在 DevOps 中,流水线(pipeline)是一系列自动化流程,负责将代码从开发阶段推向生产环境。它通常被称为 CI/CD(持续集成/持续部署)流水线,通过引入自动化来简化工作流程。流水线中的主要任务包括:
构建:编译代码并为测试做好准备。在某些情况下,编译步骤可能是可选的甚至不需要,此时可以用 linting 来替代。
测试:运行自动化测试以尽早发现问题。如果某个测试失败,整个流水线通常会随之失败,从而阻止代码继续流向生产环境。
部署:将代码发布到预发布(staging)或生产环境。
监控:检查已部署应用的性能和稳定性。
定义良好的流水线能确保软件始终如一地完成构建、测试和部署,进而减少人为错误、提高效率,并支持高质量软件的快速交付。
DevOps 是一项复杂的实践,衡量其成功与否并不简单。实际上,需要综合运用多项指标,同时覆盖开发流程和运维表现两个方面。
一些关键指标包括:
部署频率:衡量新版本发布到生产环境的频率。频率越高,往往说明流程越精简高效。
变更前置时间:从代码提交到成功部署所需的时间。前置时间越短,说明现有流水线具备足够的灵活性,能够快速将想法落地到生产环境。
平均恢复时间(MTTR):故障或宕机后恢复服务所需的平均时间。MTTR 越低,说明团队越能及时解决问题、维持系统可靠性,同时也可能表明基础设施足够健壮和成熟。
变更失败率:导致失败的部署所占的百分比,例如引发宕机或需要回滚的情况。变更失败率越低,说明部署实践越稳定可靠。
自动化测试覆盖率与质量指标:包括被自动化测试覆盖的代码比例,以及代码复杂度、缺陷密度等其他质量指标。这些指标有助于确保软件健壮且易于维护。
系统性能与正常运行时间:正常运行时间、响应时间和错误率等运维指标用于监控生产环境中应用的健康状况和性能,确保良好的用户体验。
周期时间:新功能或缺陷修复从最初构想到上线生产所需的总时间。周期时间越短,说明流程效率越高。
可以看出,这些指标共同作用,不仅关注 DevOps 实践的技术层面,也反映了运维上的敏捷程度。
关于 DevOps 的一些常见误解包括:
DevOps 只是自动化:自动化固然是 DevOps 的重要组成部分,但并非全部。DevOps 是一种文化,强调开发团队与运维团队之间的协作、沟通和持续集成,以提升软件交付的质量和速度。
DevOps 只是一个职位名称:DevOps 是一种思维方式和一套实践,而不是某个具体的职位。任何参与软件开发和交付流程的人——包括开发者、测试人员、运维工程师等——都可以在工作中采用 DevOps 思维并践行 DevOps 实践。
DevOps 取代了 IT 运维:DevOps 并不会取代 IT 运维,而是通过促进运维团队与开发团队的协作,并引入新的部署、监控和维护工具与流程,改变运维团队的工作方式。
敏捷与 DevOps 都强调协作、持续改进和交付可用的软件。两者可以结合使用,打造更高效的软件开发流程。敏捷强调迭代开发和客户满意度,而 DevOps 强调流程自动化以及开发与运维团队的融合。将二者结合使用,可以通过精简流程、加强协作来改进软件的开发与交付。
DevOps 与 SRE 的区别在于关注点:DevOps 工程师致力于改进软件交付和基础设施自动化,在开发与运维之间架起桥梁;而站点可靠性工程师(SRE)则运用软件工程方法保障系统的可靠性与性能。DevOps 强调 CI/CD 和协作,而 SRE 更注重监控、事件响应和可扩展性。
DevSecOps 与 DevOps 的主要区别就体现在名称上:一个把安全纳入了关注范围,另一个则没有。不过,事情远不止于此,让我们深入探讨一下。
一方面,DevOps 主要聚焦于通过流程自动化以及促进开发与运维团队的紧密协作来简化软件交付流程,目标是快速、可靠地将代码交付到生产环境。
另一方面,DevSecOps 在此基础上更进一步,将安全措施嵌入到开发过程的每一个阶段。安全不再是事后才考虑的事情,安全团队会参与到所有活动中,协助构建安全的软件。
这一扩展后的实践确保漏洞评估、合规检查和代码扫描从一开始就成为工作流中的核心活动。
这种转变起初可能会让一些开发者感到不安,但从长远来看,它让安全成为共同的责任,有助于降低风险。在 DevOps 环境中,速度和效率是最重要的;而引入 DevSecOps 后,构建安全的流水线同样成为优先事项。
如果你想了解这两种方法在细节和实践层面的差异,可以阅读这篇详尽的对比文章:DevOps vs DevSecOps。
左移(shift-left)是一种软件开发实践,指的是把任务和流程提前到开发生命周期的更早阶段。通过将任务左移,团队能够在开发的早期发现并解决问题,从而降低修复这些问题所需的成本和工作量。
左移实践包括尽早实施自动化测试、代码评审和安全检查,以便在问题变得更难解决之前及时发现并修复。
DevOps 开发者会根据手头的任务使用各种工具和技术,无论是监控、测试、部署还是自动化。
在为你的组织挑选最合适的 DevOps 工具时,应根据几个关键因素对每个选项进行评估,包括性能、可扩展性、学习曲线,以及该技术的社区和生态系统。欢迎查看我们的专题指南,了解从基础到进阶和专业的最佳 DevOps 工具。