Learn DevOps-第一章:DevOps Introduction
Introduction
本课程的结构如下,我们将按照这个顺序学习:
课程内容介绍
第一部分中,我们将了解DevOps的基础知识、人员、流程和工具等知识。我们将从理解持续集成、持续交付、基础设施即代码以及围绕它们的重要工具的概述开始。在熟悉了DevOps的重点领域之后,我们将进入docker的世界。在这部分,我们将容器化各种应用程序,例如Java、javascript和python。我们还将介绍几个微服务,了解如何创建docker image并将其标记为microservice。
课程的Github Repository如下:
https://github.com/in28minutes/devops-master-class
DevOps
首先第一个问题,什么是DevOps?DevOps的定义有很多种,其中一个定义如下:
"DevOps is a collaborative and multidisciplinary effort within an organization to automate continuous delivery of new software versions, while guaranteeing their correctness and reliability."
翻译成中文就是:DevOps是组织内协作和多学科合作的一种努力,旨在自动化持续交付新软件版本,同时确保其正确性和可靠性。
AWS对其定义如下:
“DevOps is the combination of cutural philosophies, practices, and tools that increases an organization's ability to deliver applications and services at high velocity.”
即DevOps是一种理念、实践和工具的组合,可以帮助组织高速交付应用程序。此定义的重点是持续交付以及保证正确性和可靠性。通俗来说,它是一种软件开发和运维的实践和文化,旨在加强开发团队和运维团队之间的协作、自动化和效率。
接下来我们将看一下软件开发是如何向DevOps发展的,软件开发的最初几十年是围绕瀑布(waterfall)模型展开的。瀑布模型处理软件开发的方式与处理构建房地产项目的方式相同,我们将在多个阶段中构建软件,这些阶段可能会持续几周到几个月。如下图所示,每个阶段都可能花费几周的时间,因此业务部门需要几个月才能看到应用程序的工作版本。
在使用瀑布模型工作了几十年后,我们了解了构建优秀软件的几个关键因素:
- Enhanced communication
- Automation
- Quick feedback
首先是沟通的重要性,软件开发是一项涉及多种技能的多学科工作,人和人之间的沟通交流对于软件项目的成功至关重要。如下图所示,一个工作团队中可能有不同学科的人员,在瀑布模型中,我们一般通过准备很多页的需求设计、架构和部署文档来增强沟通。经过一段时间,我们了解到,增强团队内部沟通的最佳方式是将团队凝聚在一起,在同一个团队中获得各种技能,并创建具有广泛技能的跨职能团队。
构建优秀软件的下一个要素是自动化,软件开发涉及广泛的活动,手动操作速度慢且容易出错,引入自动化是至关重要的。
最后一个要素是快速获得反馈,我们不能等几个月才知道程序存在问题。如果我们现在正在implement某个业务,如果将其部署到生产环境中,会不会导致问题?我们希望尽早发现以及解决问题。
Agile
Agile将业务团队和开发团队合并成一个团队,这个团队致力于在称为sprints的小迭代中构建大的的软件。
Agile专注于在一个sprint中完成所有阶段,而不是在每个开发阶段花费数周或者数月。我们可以从一个称为用户故事的小需求(如图中的plan)开始,然后带着它经历各种开发周期。
这有对Enhanced Communication有什么帮助呢?
正如我们前面所提到的,Agile将业务和开发团队结合在一起。Business团队负责定义要构建的内容,Development团队负责构建符合要求的产品。当我们提到开发的时候,我们包括了所有从事设计、编码、测试和打包软件的人。两个团队是通过引入一个叫做产品所有者(product owner)的业务代表而结合在一起的。Agile团队可以随时联系product owner,更加清楚地理解业务目标,这样做就可以确保团队构建的最终产品是业务所需要的。
综上,Agile通过将Business和Development团队聚集在一起来增强团队的沟通。
Agile团队关注的自动化领域是什么呢?
Agile团队的主要关注点是尽可能早地发现缺陷(Find Defects (Functional & Technical) Early)。在开发软件时,存在各种各样的缺陷。功能缺陷是指产品不符合预期要求。代码质量错误等技术错误缺陷使得软件的维护变得困难,一般来说,Agile团队专注于使用自动化来尽可能早地发现技术和功能缺陷。Agile团队编写出色的单元测试(Unit tests)来测试方法和类,此外还专注于编写出色的自动化集成测试(Integration tests)来测试模块和应用程序。代码质量检查(Code Quality tests)也使用Sonar之类的工具来评估应用程序的静态代码质量。现在,如果我们有单元测试,集成测试,和很好的代码质量检查,这就足够了吗?我们需要连续进行这些检查。一旦我们将代码提交到Github仓库中,我们就想运行单元测试,做代码质量检查,我们还想打包应用程序,运行集成测试,这就是所谓的持续整合(Continuous Integration)。在Agile的早期,最重要的持续集成工具是Jenkins。
那么下一个问题是,Agile是如何促进获得即时反馈的?
最重要的因素是,企业不需要等待好几个月才能看到最终产品,在每一个sprint结束时(最后的Review阶段),都会向包括架构和业务团队在内的所有利益相关者演示产品。所有的反馈都被用于为下一个sprint确定用户故事的优先级。这样做的结果是,来自架构和业务团队的反馈被用于增强每一个sprint的产品。因此,团队构建的最终产品是业务部门非常满意的。
实现快速反馈的另一个因素是持续集成(Continuous integration)。如果我将一些代码提交到版本控制中,但是有一个缺陷,会发生什么事?Unit tests会失败,我们能立刻知道代码有问题。那如果我编写的某段代码不符合代码质量标准呢?Code quality阶段的build会立刻失败,我们会收到电子邮件提醒。
到目前为止,我们研究了Agile如何帮助团队更好地沟通,获得即时反馈和自动化。现在我们想知道,Agile真正成功了吗?我想是的,通过专注于改善开发和业务团队之间的沟通,专注于发现早期的各种缺陷,Agile将软件开发带到了下一个层次。那么是否意味着旅程停止了?
不,新的挑战已经出现,我们开始转向微服务架构,构建许多小型的API,而非大型应用程序。新的挑战是什么呢?新的挑战在于运营(Operations)变得十分重要,我们不再是一个月发布一次,而是每周发布数百个微小服务,有时候甚至每天都发布。调试微服务中的问题并了解微服务中发生的情况变得非常重要,是时候在软件开发中使用一个新的流行语了,即DevOps,接下来,我们将详细讨论。
DevOps
DeVOps的重点是什么呢?DevOps的重点是加强开发(Development)团队和运营(Operations)团队之间的沟通。其次是如何简化软件部署?以及如何让开发团队更容易看到运营团队所做的工作呢?
DevOps是如何实现Enhanced communication的呢?
DevOps做的第一件事就是让运营团队与开发团队联系更紧密,在成熟的企业中,开发和运营被合并到一个团队中,分享共同的目标,两个团队开始了解另一个团队面临的挑战。在处于DevOps演进早期阶段的企业中,通过将运营团队引入Scrum团队,并让他们参与sprint活动(例如stand-ups和retrospectives)来改善沟通。因此,DevOps试图通过让运营团队尽可能接近开发团队来加强沟通。
下一个问题是,DevOps关注的automation是什么?
除了Agile的重点领域(持续集成和自动化测试)之外,DevOps还专注于自动化运营团队的活动。运营团队的工作通常包括提供服务器、在这些服务器上安装软件、配置软件和部署应用程序,DevOps专注于自动化这些步骤。
与DevOps相关的关键术语是持续部署(Continuous Deployment),持续交付(Continuous Delivery)和基础架构即代码(IAC,Infrastructure as code)。持续部署是指在测试环境中持续部署新版本的软件,持续集成的重点是运行测试和代码质量检查。持续部署通过在环境中添加Deployment而将其提升到一个新的版本。
在Google、Facebook等更成熟的组织中,持续交付有助于持续将软件部署到生产环境。除了运行测试、构建软件和打包应用程序之外,还将应用程序部署到测试环境中,并在获得QA团队和UAT团队的正式批准后,将软件直接部署到下一个环境中,直至生产环境。
下一个重点领域是IAC,是关于像对待应用程序代码一样对待基础结构。这一切都是关于使用代码和配置以自动化的方式创建基础架构,即服务器(Servers)、负载平衡器(Load balancers)和数据库(database)。
那么如何获得即时反馈呢?
正如我们之前提到的,DevOps拉近了运营和开发团队的距离,开发和运营是同一个团队的一部分,所以整个团队都了解与运营相关的挑战和与开发相关的挑战。任何操作问题都会得到开发人员的快速关注,在软件上线过程中遇到的任何挑战都会引起运营团队的早期关注。由于持续交付,如果进行了可能破坏测试或者临时环境的代码更改或配置更改,在几个小时内我们就可以知道。而由于IAC,开发人员可以自行配置环境、部署代码和查找问题,而无需运营团队的任何帮助。
总而言之,Agile和DevOps是帮助我们改进软件开发的两种有效的方法。