目录

DevOps 指南:概念、价值、实施以及常见问题

目前在国外,互联网巨头如Google、Facebook、Amazon、LinkedIn、Netflix、Airbnb,传统软件公司如Adobe、IBM、Microsoft、SAP等,亦或是网络业务非核心企业如苹果、沃尔玛、索尼影视娱乐、星巴克等都在采用DevOps或提供相关支持产品。那么DevOps究竟是怎样一回事?

一、什么是 DevOps

DevOps 是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。DevOps 是为了填补开发端和运维端之间的信息鸿沟,改善团队之间的协作关系。不过需要澄清的一点是,从开发到运维,中间还有测试环节。DevOps其实包含了三个部分:开发、测试和运维。

DevOps 对团队意味着什么? DevOps 使以前孤立的角色(开发、IT 运营、质量工程和安全)可以协调和协作,以生产更好、更可靠的产品。通过采用 DevOps 文化、做法和工具,团队能够更好地响应客户需求,增强对所构建应用程序的信心,更快地实现业务目标。

二、Devops的历史

由上所述,相信大家对DevOps有了一定的了解。但是除了触及工具链之外,作为文化和技术的方法论,DevOps还需要公司在组织文化上的变革。回顾软件行业的研发模式,可以发现大致有三个阶段:瀑布式开发敏捷开发、DevOps。

DevOps早在九年前就有人提出来,但是,为什么这两年才开始受到越来越多的企业重视和实践呢?因为DevOps的发展是独木不成林的,现在有越来越多的技术支撑。微服务架构理念、容器技术使得DevOps的实施变得更加容易,计算能力提升和云环境的发展使得快速开发的产品可以立刻获得更广泛的使用。

三、DevOps 的好处

DevOps的一个巨大好处就是可以高效交付,这也正好是它的初衷。Puppet和DevOps Research and Assessment (DORA) 主办了2016年DevOps调查报告,根据全球4600位各IT公司的技术工作者的提交数据统计,得出高效公司平均每年可以完成1460次部署。

与低效组织相比,高效组织的部署频繁200倍,产品投入使用速度快2555倍,服务恢复速度快24倍。在工作内容的时间分配上,低效者要多花22%的时间用在为规划好或者重复工作上,而高效者却可以多花29%的时间用在新的工作上。所以这里的高效不仅仅指公司产出的效率提高,还指员工的工作质量得到提升。

DevOps另外一个好处就是会改善公司组织文化、提高员工的参与感。员工们变得更高效,也更有满足和成就感;调查显示高效员工的雇员净推荐值(eNPS:employee Net Promoter Score)更高,即对公司更加认同。

快速部署同时提高IT稳定性。这难道不矛盾吗?

快速的部署其实可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地响应。而且,DevOps小步快跑的形式带来的变化是比较小的,出现问题的偏差每次都不会太大,修复起来也会相对容易一些。

因此,认为速度就意味着危险是一种偏见。此外,滞后软件服务的发布也并不一定会完全地避免问题,在竞争日益激烈的IT行业,这反而可能错失了软件的发布时机。

总结而言,采用 DevOps 的文化、做法和工具的团队能够提升效率,以更快的速度构建更好的产品,从而获得更高的客户满意度。若要实现以下业务目标,这种改进的协作方式和生产能力不可或缺:

  • 缩短上市时间
  • 适应市场和竞争
  • 保持系统稳定性和可靠性
  • 缩短平均恢复时间

四、DevOps 和应用程序生命周期

DevOps 影响应用程序生命周期的规划、开发、交付和运营阶段。每个阶段都依赖于其他阶段,并且这些阶段并非特定于角色。在真正的 DevOps 文化中,每个角色在某种程度上都涉及到每个阶段。

1.计划

在计划阶段,DevOps 团队构思、定义和描述他们即将构建的应用程序和系统的特性和功能。他们在低粒度和高粒度级别上跟踪从单个产品任务到跨多个产品组合的任务进展。DevOps 团队以敏捷和直观地方式进行规划的一些方法包括创建积压工作 (backlog)、跟踪 bug、使用 Scrum 管理敏捷软件开发、使用看板以及使用仪表板直观呈现进度。

2.开发

开发阶段包括编码的各个方面(编写、测试、评审)、团队成员集成代码,以及将代码构建为可部署到各种环境中的生成工件。DevOps 团队寻求在不牺牲质量、稳定性和生产效率的情况下快速创新。为此,他们使用高效的工具、自动化单调和手动步骤,并通过自动化测试和持续集成以小增量迭代。

3.交付

交付是以一致且可靠的方式将应用程序部署到生产环境中的过程。交付阶段还包括部署和配置构成这些环境的基础结构,该基础机构受到完全治理。

在交付阶段,团队定义了具有明确手动批准阶段的发布管理流程。他们还设置了自动入口,用于推动应用程序经历各个阶段,直到提供给客户。这些流程的自动化使这些流程可伸缩、可重复并且可控制。这样,使用 DevOps 的团队就可以轻松、自信、放心地频繁交付。

4.运营

运营阶段包括维护、监视和对生产环境中的应用程序进行故障排除。在采用 DevOps 做法时,团队致力于确保系统的可靠性、高可用性,并在加强安全性和治理的同时实现零停机的目标。DevOps 团队希望在问题影响客户体验之前发现问题,并在问题发生时迅速解决问题。保持这种警惕性需要丰富的遥测、可操作的警报以及全面了解程序和基础系统。

五、DevOps 实施的前提条件

1.硬性要求:工具上的准备

团队有许多 DevOps 工具来帮助他们促进组织中的 DevOps 文化。大多数团队依赖于多种工具,构建自定义工具链,以满足应用程序生命周期中每个阶段的需求。虽然采用某个特定工具或技术与采用 DevOps 不同,但当 DevOps 文化存在并定义了流程时,如果人们选择了适当的工具,就可以实现和简化 DevOps 做法。

上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下:

  • 代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion
  • 构建工具:Ant、Gradle、maven
  • 自动部署:Capistrano、CodeDeploy
  • 持续集成(CI):Bamboo、Hudson、Jenkins
  • 配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail
  • 容器:Docker、LXC、第三方厂商如AWS
  • 编排:Kubernetes、Core、Apache Mesos、DC/OS
  • 服务注册与发现:Zookeeper、etcd、Consul
  • 脚本语言:python、ruby、shell
  • 日志管理:ELK、Logentries
  • 系统监控:Datadog、Graphite、Icinga、Nagios
  • 性能监控:AppDynamics、New Relic、Splunk
  • 压力测试:JMeter、Blaze Meter、loader.io
  • 预警:PagerDuty、pingdom、厂商自带如AWS SNS
  • HTTP加速器:Varnish
  • 消息总线:ActiveMQ、SQS
  • 应用服务器:Tomcat、JBoss
  • Web服务器:Apache、Nginx、IIS
  • 数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库
  • 项目管理(PM):PingCode、Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker

在工具的选择上,需要结合公司业务需求和技术团队情况而定。

2.软性需求:文化和人

DevOps成功与否,公司组织是否利于协作是关键。开发人员和运维人员可以良好沟通互相学习,从而拥有高生产力。并且协作也存在于业务人员与开发人员之间。

出席了2016年伦敦企业级DevOps峰会的ITV公司在2012年就开始落地DevOps,其通用平台主管Clark在接受了InfoQ的采访,在谈及成功时表示,业务人员非常清楚他们希望在最小化可行产品中实现什么,工程师们就按需交付,不做多余工作。

这样,工程师们使用通用的平台(即打通的工具链)得到更好的一致性和更高的质量。此外,DevOps对工程师个人的要求也提高了,很多专家也认为招募到优异的人才也是一个挑战。

六、加速 DevOps 成功实施的一些做法

除形成 DevOps 文化之外,团队还通过在整个应用程序生命周期中实施特定做法,以充分利用 DevOps。其中一些做法有助于加速、自动化和改进特定阶段。其他的跨越几个阶段,帮助团队创建可帮助提高生产效率的无缝进程。这些方法包括但不限于以下这些:

1.持续集成和持续交付 (CI/CD)

配置管理是指管理系统中资源(包括服务器、虚拟机和数据库)的状态。使用配置管理工具,团队能够以一种可控和系统的方式进行更改,因此降低了修改系统配置的风险。团队使用配置管理工具来跟踪系统状态并帮助避免配置漂移,即避免系统资源的配置随时间偏离为其定义的目标状态。

通过与基础设施即代码结合使用,系统定义和配置都很容易进行模板化和自动化,帮助团队大规模地操作复杂的环境。

2.版本控制

版本控制是管理各版本中代码的做法,用于跟踪修订和更改历史记录,使代码易于评审和恢复。通常使用版本控制系统(比如 Git)来实现这种做法,这些系统允许多个开发人员协作编写代码。有关合并在相同文件中发生的代码更改、处理冲突以及将更改回滚到早期状态,这些系统具有一个清楚的流程。

使用版本控制是一个基本的 DevOps 做法,可帮助开发团队协同工作,在团队成员之间划分编码任务,并存储所有代码,以便在需要时轻松恢复。

版本控制也是其他做法(如持续集成和基础结构即代码)中的必要元素。

3.敏捷软件开发

敏捷是一种软件开发方法,注重团队协作、客户和用户反馈,以及高度适应在短期发布周期内的变化。采用敏捷的团队向客户提供持续的更改和改进,收集他们的反馈,然后吸取经验并根据客户的需求和需要进行调整。敏捷与其他更传统的框架(如瀑布框架)有本质的不同,瀑布框架包括由顺序阶段定义的较长的发布周期。看板和 Scrum 是两种与敏捷相关的热门框架。

4.基础结构即代码

基础结构即代码以一种描述性的方式定义系统资源和拓扑,团队可以像编码一样管理这些资源。这些定义也可以存储并在版本控制系统中进行版本控制以及像代码一样进行评审和还原。

使用基础设施即代码有助于团队以可靠、可重复和可控的方式部署系统资源。基础设施即代码也有助于自动化部署并降低人为错误的风险,特别是对于复杂的大型环境。这种可重复、可靠的环境部署解决方案允许团队维护与生产环境相同的开发和测试环境。将环境复制到不同的数据中心和云平台同样变得更加简单和高效。

5.配置管理

配置管理是指管理系统中资源(包括服务器、虚拟机和数据库)的状态。使用配置管理工具,团队能够以一种可控和系统的方式进行更改,因此降低了修改系统配置的风险。团队使用配置管理工具来跟踪系统状态并帮助避免配置漂移,即避免系统资源的配置随时间偏离为其定义的目标状态。

通过与基础设施即代码结合使用,系统定义和配置都很容易进行模板化和自动化,帮助团队大规模地操作复杂的环境。

6.持续监视

持续监视意味着能够全面、实时地了解整个应用程序堆栈(从运行应用程序的基础结构到更高级别的软件组件)的性能和运行状况。可查看的内容包括遥测和元数据集合,以及需要引起操作员注意的预定义条件警报的设置。遥测包括从系统各个部分收集的事件数据和日志,这些数据和日志存储在可以分析和查询的地方。

高绩效的 DevOps 团队会确保他们设置了可操作且有意义的警报,并收集了丰富的遥测数据,以便能够从大量数据中获得见解。这些见解有助于团队实时解决问题,并了解如何在未来的开发周期中改进应用程序。

七、Devops落地的常见问题

1.哪些团队应该参与Devops的采用?

DevOps 需要通过组织中的不同角色来实施,并且其中几个角色需要密切协作。在大多数情况下,DevOps 角色包括开发、IT、运营、安全和支持。

2.Devops是职务吗?

DevOps 不限于单个角色。参与应用程序生命周期各阶段的每个人都必须接受 DevOps 文化。然而,在一些组织中,一些人员或团队仅关注实现自动化、定义做法和实施 CI/CD 管道。有时,这些角色的官方头衔是 DevOps 工程师或 DevOps 专家。

3.大型组织如何采用Devops?

在大型组织中采用 DevOps 可能极具挑战。改变大型组织的文化以及标准化流程和工具需要耐心和毅力。在大多数大型组织中,都有 DevOps 做法的早期采用者。随着这些做法走向成熟并产生积极的结果,其他团队通常会跟着开始他们的 DevOps 之旅。

4.Devops 如何帮助推动业务成果?

DevOps 的真正意义是为客户提供持续的价值。衡量采用 DevOps 的结果时必须考虑业务目标。DevOps 团队围绕这些目标进行调整,并使用短发布周期实现这些目标。周期非常短,因此可以对市场做出敏捷的反应,并通过客户反馈不断吸取经验。

5.Devops 与敏捷之间的关系是什么?

DevOps 和敏捷都是用于生产产品、进行发布或发行的现代软件开发框架。DevOps 是一种文化,促进软件开发和维护中所有角色之间的协作。敏捷是一种开发方法,在需求不断变化的常见现实中保持工作效率和促进发布。DevOps 和敏捷并不是相互排斥的,而是经常搭配使用。