写点什么

「云端的 DevOps」系列之打造 DevOps 持续交付高速公路

  • 2016-08-11
  • 本文字数:6482 字

    阅读完需:约 21 分钟

一个产品服务的交付过程就像是在道路上行进,如果想要速度快,就需要有好的基础和好的工具。接下来由我来给大家分享一下我在 DevOps 落地建设方面积累的一些经验和教训,即:如何基于云服务打造一条 DevOps 持续交付高速公路,打通从代码到服务的通道,让我们的交付过程快速顺畅,通过实现快速可靠的部署和发布,提升研发、运维各环节的效率和整体的交付效率和质量。希望能在这里和大家一起讨论,共同进步,如有不正确的地方恳请大家指正,避免误导大家。

对于 DevOps,大家都不陌生,最近一段时间国内认同度和关注度也在持续上升,在各个技术媒体上关于 DevOps 文章和讨论非常之多,有很多非常好的从理论价值观实践层面讨论的文章。DevOps 最有标志性的文章就是 09 年的” Ten Deploys A Day ”,如果了解 DevOps,这篇是一定要看的文章。DevOps 和前些年的敏捷开发一样,对企业来说非常重要,是支撑企业业务创新的核心能力。今天,又有了云计算这个敏捷弹性自动化的 IT 基础设施,让 DevOps 平台的能力也有了一个巨大的飞跃。

本文将主要着重从云环境下的落地和解决方案的角度讨论,先和大家一起讨论我们为什么做 DevOps,将要打造 DevOps 高速公路的目标具体化;然后介绍一种能够在云计算环境下用最少的工作量、时间和代价风险落地的方案,基于云服务和云管理平台打造强大的横向纵向均全面覆盖环境和应用自动化的 DevOps 平台,实现在公有云、私有云、混合云以及传统数据中心中的各种业务应用的持续快速可靠的部署和发布,以及高效的运维管理。

一、为什么要做 DevOps,DevOps 要解决的问题

首先,我们先一起明确一下我们为什么做 DevOps,DevOps 要解决的问题,将 DevOps 建设目标收敛到符合 SMART 原则的具体的可达成目标。

从业务的层面,DevOps 要解决的主要问题就是实现从开发到交付端到端的业务敏捷,加速业务创新,缩短交付周期,实现持续快速可靠的交付;请见下图,来自于 AWS 官方资料,非常经典的一张图,清晰地诠释了 DevOps 的地位和作用。

具体到研发和运维的层面,DevOps 要解决的问题就是的交付周期长,发布不可靠、低效问题。

下面我们来层层剥茧,导出 DevOps 解决方案要实现的具体目标。对于交付周期长,发布不可靠问题,有很多影响因素,这些因素中,其中一个非常主要的因素就是:交付过程各个阶段中环境准备、部署发布环节手工操作多、速度慢、不可靠、没有规范。(请看下图)

(点击放大图像)

这张图展示了一个产品版本的整个交付过程,这个过程实际上就是一个不断修改代码、创建配置准备环境、部署应用,验证 (获取环境及应用信息,定位问题) 的循环过程。这个过程包含四个阶段,可以看到在每个阶段都需要经过多次创建或配置准备环境,部署应用的环节。这里的指的环境,不仅仅包含主机虚拟机、应用运行的操作系统环境,还包含中间件服务、防火墙、负载均衡配置、DNS 配置等。

在这个过程中对于我们研发团队面临和要解决的问题为:

  1. 在准备环境环节,通常在项目初始和过程中,由于需要向 IT 部门申请,不能够自助的获取项目环境所需的资源,导致不得不等待环境资源,影响交付的时间;
  2. 在部署应用环节,开发过程中需要部署测试时,由于部署的手工或半自动化,导致花费了大量的时间精力在手工操作和解决不可靠部署带来的问题上,特别是在集中集成测试阶段,当系统为分布式、组件比较多,涉及的机器数量比较多时,如果能实现环境和应用的自动化部署将会节省非常多的时间,缩短每次修改获得结果的反馈时间,从而加速开发过程;
  3. 仍然在部署应用环节,在日常测试场景中,由于创建一个环境比较麻烦费事,测试环境有限,所以经常出现由于测试环境有限导致不得不互相等待、协调,延误了问题的解决,带来很多管理和麻烦。如果能够实现创建环境自动化,那么当多人需要不同测试环境时,就可以按需自助创建,消除环境资源有限造成的瓶颈。

在这个过程中对于运维团队突出面临和要解决的问题为:

1. 发布过程速度慢,不可控、压力大,原因多由于:

  • 手工或半自动过程
  • 生产环境与开发测试不一致
  • 部署方式不同
  • 环境相关的应用配置文件没有很好的管理

2. 运维过程效率低,特别当环境很多、机器数量很多、系统为分布式系统时,分布在多地域多个云中时,需要经常扩容缩容时;

3. 当运维团队人数有限,有很多项目团队申请资源时,给运维团队带来很多工作量,造成很多压力

对于以上的问题,基本可以通过环境和应用的自动化标准化解决,我们可以将要解决的主要问题具体到以下场景:

1. 实现环境创建自动化自服务

  • 实现自服务 IT 功能让研发能够自助创建所需资源
  • 对接云服务实现自动化创建资源

2. 实现应用部署自动化标准化

  • 创建环境或新建虚拟机时自动部署
  • 代码提交后的自动化部署
  • 按需手动触发后的自动化部署
  • 自动伸缩后的自动化部署
  • 实现各个环境使用同样的脚本工具进行部署,最小化各环境部署差别为配置文件的区别

3. 实现编排全栈自动化

  • 实现一键从无到有自动化创建部署环境并部署指定版本应用
  • 实现一键添加指定用途虚拟机到环境并自动部署指定版本应用
  • 实现定时或按需的一键扩容,自动添加虚机资源并部署应用,配置负载均衡,DNS 等
  • 实现覆盖基础设施及应用的编排功能,并且能够跨主机、环境、公有云、私有云以及传统数物理及虚拟化环境编排

二、打造 DevOps 持续交付高速公路

针对以上的各个 DevOps 自动化场景,有很多实现的方式,包括基于容器的解决方案,由于容器技术当前还需要一段时间才能“飞入寻常企业家”,较大范围的应用到生产环境,对当前的开发和运维管理习惯改变比较大,相关配套设施也要求比较多,所以这个后续再表。现在,先给大家介绍一种基于 IaaS 云服务和云管理平台的比较容易落地的 DevOps 平台解决方案,供大家参考。通过这个解决方案我们能够以很小的代价,快速地基于公有云私有云服务实现开发测试以及运维中的各种环境和应用的自动化,能够非常容易的落地,对应用的架构没有限制及对现有代码无侵入。从实现的代价工作量来看,根据对以往经验,对于 20 个项目,平均一个项目 4~5 个组件,考虑项目的基础条件不一样,综合平均下来每个组件的实现代价小于 1.5 人天。

(点击放大图像)

这个平台解决方案如图示,主要由三大部分组成:一个是配置管理部分,一个是云管理平台部分,一个是定制化应用部署工具部分。这个方案有几个关键的选型和设计:

选择了云管理平台,原因如下:

由于云管理平台本身集成了各个 IaaS 云服务的 API,相比于直接基于云 API 开发自动化功能,或编写环境自动化的模板文件,能够让我们免去大部分集成 IaaS API 的二次开发工作,降低了实现自动化的开发维护工作量和门槛,同时能够充分发挥云的自动化特性;

云管理平台提供了业务角度的管理视图,对虚拟机按照用途和环境类型进行分组,符合我们管理操作的习惯,可以可视化的一目了然在一个集中的视图中,先按用途找到机器具体信息,然后再进行相关操作,让我们不需要再采用之前使用 Excel 表手工维护管理环境信息;

云管理平台提供了集群感知和编排的功能,能够让我们实现一键创建环境虚拟机并自动部署配置应用的功能,应用到开发测试过程中建立测试环境场景,以及诸多运维场景,如一键扩容缩容、自动故障恢复、备份恢复等等,还有包括公有云、私有云、虚拟化多种环境中;

云管理平台提供了一体化的工具,涵盖了环境管理、批量管理、代码部署、监控告警等功能;

云管理平台不同于 PaaS,不对应用的运行环境进行限制,所以可以广泛的用于实现各种架构的应用的自动化部署,而不仅仅限于 Web 类的应用;从管理对象上,云管理平台不仅可以对接管理各个主流公有云私有云的虚拟机,而且还可以将传统物理机和 VMware 虚拟机导入进行管理,既能够管理各个遗留环境中应用,也能管理运行在 IaaS 上的应用,在遗留环境自动化部署后,还能够实现应用的上云迁移。

(点击放大图像)

应用自动化部署采用AWS CodeDeploy 规范

AWS CodeDeploy 源自 Amazon 内部一个非常成熟的规范,这个规范适用的范围很广,对应用的部署架构没有限制和约束。而且非常易用易于掌握,便于落地和推广。对于部署规范的选型非常重要,直接决定了是否易于推行实现和工作量。

(点击放大图像)

下面我们具体介绍一下各个部分,然后以提交代码自动部署场景和一键自动创建虚拟机并部署代码为例介绍DevOps 场景的实现过程:

1. 配置管理部分

主要由版本控制系统、持续集成服务、制品库服务组成。这部分的主要作用是,能够将要部署的代码自动编译,并进行必要的单元测试和组件测试,将部署包上传到制品库并将版本信息注册到云管理平台,存储并管理部署包,为后续的自动化部署提供可下载的部署包,方便实现自动化部署下载版本代码,给自动化部署打下一个好的基础。即便代码存放的版本控制库不一样,所处的网络不一样,仍然可以用统一的 HTTP 方式下载,也方便同步部署包到各个不同地域网络以保证下载速度。

这部分输入为开发人员提交到指定分支的应用代码,输出为制品库如 Nexus 上的应用版本部署包和云管理平台上的应用版本信息。

中间的实现依赖于 Jenkins 和 Maven,每个需要独立部署的应用的代码分支,在 Jenkins 上都对应一个 Jenkins 持续集成任务,当代码提交后,那么这个对应的 Jenkins 持续集成任务就开始同步分支最新代码,并编译,单元测试,通过后使用 Maven 进行打包并上传到制品库如 Nexus,之后调用定制的 Jenkins 插件将部署包版本信息注册到云管理平台上。

2. 云管理平台部分

云管理平台在整个方案中的作用是:

  1. 在环境准备场景中,可集成各个主流公有云私有云 API 创建虚拟机,对通过集成云 API 自动创建和纳管,进行分组分类管理,提供业务维度的管理视图;
  2. 在部署应用场景中,提供应用版本信息的管理,以及自动化部署引擎,支持符合 AWS CodeDeloy 规范的应用部署包的部署,实现部署的标准化自动化和可视化;
  3. 提供编排自动化、批量管理以及基础设施感知功能,支持实现应用的各种场景下的自动化部署,如创建虚拟机时,提交代码,手动触发,执行编排部署任务、定时或基于监控的自动伸缩,备份恢复,自动故障处理等;
  4. 提供自服务 IT 功能,能够让研发人员在 IT 允许的范围内自助获取资源准备环境;这个能有效解决在获取资源环节上研发和 IT 的协作问题,既减轻了 IT 的工作量和沟通成本,也提升了双方的效率。

(点击放大图像)

3. 定制化应用部署工具部分

这部分的主要作用是,遵循 AWS Code Deploy 规范,将依据规范实现的各个步骤的部署脚本与应用代码打在一个包内,部署引擎下载应用版本代码到要部署的主机后,会按照规范配置执行这个部署各个步骤的脚本,完成应用在主机上的自动化部署过程。

上面给大家介绍了 DevOps 平台解决方案的组成部分,下面以两个典型的 DevOps 场景给大家介绍一下实现的原理:

  1. 代码提交后自动部署 DevOps 场景实现过程:
  • 开发人员将某应用代码提交到其某个分支上;
  • 应用分支对应的 Jenkins 任务自动被触发,开始同步分支最新代码,并进行编译,只会调用 Maven 打包并上传到 Nexus;
  • Jenkins 任务调用云管理平台应用代码部署插件将应用版本信息注册到云管理平台;
  • Jenkins 任务调用云管理平台应用代码部署插件通知云管理平台将应用版本部署到指定范围的主机上;
  • 云管理平台将部署请求下发给主机上的 Agent;
  • Agent 收到请求后下载部署包,解压后,按照 CodeDeploy 规范,执行部署各个步骤的脚本进行自动化部署,同时将执行的日志和结果上报给云管理平台控制台,完成代码提交自动化部署。
  1. 一键创建环境主机并自动部署 DevOps 场景实现过程:
  • 创建虚拟机创建模板,设定对虚拟机配置、操作系统、网络,负载均衡,以及虚拟机启动后要执行的脚本等要求;
  • 指定使用虚拟机创建模板创建虚拟机并添加到指定的环境的主机组中;
  • 云管理平台根据虚拟机模板请求调用云 API 进行创建;
  • 虚拟机启动后,云管理平台使用 SSH 自动登录到虚拟机安装 Agent;
  • 云管理平台通知 agent 部署应用;
  • Agent 将部署包下载到其所在主机,然后依据包中部署规范配置自动部署应用。

这里有一点需要说明的是,自动化部署是持续交付里最基础的第一步,做到这一步能够大幅提高效率,但是要想实现持续交付,还需要有比较完备的自动化测试工具,实现各个层次阶段的测试,包括持续集成阶段的单元测试、组件测试,部署后的集成测试,运行期的实时监控。对于自动化测试的实现,通常是一个比较大的技术债务,最好在项目的研发过程中实现,否则最后很难有获得专门的时间投入资源去做。

最后,总结一下,本文的要点有三:

  1. 了解 DevOps 要具体解决的自动化场景
  2. 了解上云后基于云管理平台能够易于且快速落地的 DevOps 的解决方案
  3. 了解云计算环境下用最少的工作量、时间和代价落地的 DevOps 解决方案

通过这个方案:

  • 实现各种场景的环境和应用的自动化,自动化部署升级发布,从而有效地支持开发测试进行高效的开发测试,减少过程中不必要的资源等待,手动操作,缩短反馈周期提交效率;

  • 帮助运维实现快速可靠的发布,支持研发和运维在申请资源环节和发布环节的高效协作;

  • 帮助实现从敏捷开发到交付的端到端业务敏捷。

精彩 QA 环节

问:在 DevOps 的环节中,QA 如何发挥作用?

刘涛:发挥作用体现在两个环节,一个是各个阶段的自动化测试,一个是不能或暂时不适合自动化的人工测试。

对于自动化测试,在持续集成阶段的贡献为单元测试、组件测试,帮助快速完成新加功能的测试以及验证是否影响已有功能;对于部署后的集成测试阶段,完成必要的人工功能性测试保证上线的质量。

自动化测试越完备,对快速开发交付贡献越大。

问:DevOps 是以运维为主,还是开发为主, 现在可以使用云上提供的各种 API,将来运维何去何从?

刘涛:我一直最大的感受是,从实现 DevOps 所做的云服务至上的自动化工作上更多依赖于开发,而云服务的稳定性维护和提供必要的支持和工具还依赖于运维。云计算给运维工作带来的改变是非常大的,提供了一个弹性自动化的基础设施服务,运维将来的发展方向也会在这个基础上越来越自动化,越来越智能化。

问:近来容器潮席卷技术社区,我想问下,老师怎么看待 DevOps 与 Docker 结合解决痛点?

刘涛:对于 DevOps 与 Docker 结合的痛点,我觉的主要在于网络的方面,这个影响会具体会影响到应用的自动化的部署上。之所以有这么多的容器解决方案,有这么多的编排方案,网络方案,都是要解决连接问题。

现实中非常多的应用的架构并不是一个简单的架构,而是分布式的,要想让适用于大多数分布是应用的部署,首先要解决网络层的连接,然后是各个应用组件的连接配置。

问:跨云管理与持续交付的难点在于哪里?您今天分享的方案是否使用此类场景?

刘涛:这个问题非常好。

跨云管理的难点在于管理的覆盖面和编排上,可以从几个维度上看。

  • 一个是纵向的覆盖面,需要既覆盖基础设施层,也覆盖应用层,而基础设施层需要覆盖资源的类型又有很多种,要想做到比较全面的覆盖是一个很有难度的事情。
  • 一个是横向的维度,这个横向的维度就是跨云、跨网的编排,要做到这一点需要处理非常多的异构情况,同时要想跨网,需要在管理的设计上做一些特殊的处理。
  • 对于持续交付的难点上,我觉的最大的难点不在于自动化和部署上,最大的难点在于能否在做到自动化部署发布之后的测试上。

如果在整个开发过程中,能够比较好的做到自动化测试,加上完备的手工测试,才能真正做到持续交付。一个极端的例子就是,虽然实现了自动化的部署,但是部署后,如果没有比较好的自动化测试,仍然将不得不花费很长的时间进行验证,才能真正完成部署上线。

关于作者

刘涛,目前在 FIT2CLOUD 从事云管理和 DevOps 平台的研发工作,曾在 InfoQ 和 CSDN 发表过《国内云建设普遍缺失的一环:云管理平台》,《剖析 AWS CodeDeploy》,《亚马逊 AWS 认证攻略》,《DevOps 系统的变迁及其关键使能技术》等文章。职业生涯的主要角色基本都在研发,也常常负责自身研发的产品服务的运维管理,经历过传统物理环境下的大规模移动互联网服务的研发运维,也经历过云环境混合云下的研发和运维,深切地体会到云计算给我们研发和运维工作方式带来的改变,效率上的巨大提升。


感谢魏星对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-08-11 17:572764

评论

发布
暂无评论
发现更多内容

ONES 收购 Tower,五源资本合伙人对话两位创始人

万事ONES

项目管理 团队协作 ONES Tower 收购

年轻人想详细了解做了十年Linux跟做了十年Windows的程序员差距有多大吗?听我慢慢道来!

ShenDu_Linux

Linux 程序员 windows

线程池的优点及其原理,代码实现线程池。简单、明了。

Linux服务器开发

后端 网络编程 线程池 Linux服务器 web服务器

一周信创舆情观察(11.23~11.29)

统小信uos

ONES 收购知名协作工具 Tower

万事ONES

团队协作 高效 研发管理工具 收购 资讯

接口测试怎么进行,如何做好接口测试

测试人生路

软件测试 接口测试

《迅雷链精品课》第十课:共识算法理论基础

迅雷链

区块链

《前端实战总结》之使用CSS3实现酷炫的3D旋转透视

徐小夕

css3 大前端 CSS小技巧

一个真正0基础小白学习前端开发的心路历程

华为云开发者联盟

开发 开发小白 0基础

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

PostgreSQLChina

数据库 postgresql 开源

挑战赛 | 话题王者VS互动先锋(第一季)

InfoQ写作社区官方

话题讨论 热门活动

区块链产业下的“非遗”突围战:商业化和手艺人发掘

CECBC

区块链 非遗

架构师训练营第二周框架设计课后练习

Geek_xq

「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」

阿里巴巴云原生

容器 运维 云原生 双十一 CloudNative

我在阿里巴巴做 Serverless 云研发平台

阿里巴巴云原生

Serverless 容器 开发者 云原生 CloudNative

每周学点TARS——服务自定义命令

TARS基金会

c++ DevOps 后端 TARS

价值、产业、数据加密,区块链如何助力互联网升级?

CECBC

区块链 互联网

训练营第七周总结

大脸猫

极客大学架构师训练营

性能压测

jorden wang

mysql的这些坑你踩过吗?快来看看怎么优化mysql?

比伯

Java 编程 架构 面试 计算机

即使不会node.js,拖拽就可完成数据的可视化展示

华为云开发者联盟

node.js 数据 可视化

技巧收藏|10个JavaScript常用数组操作方法

华为云开发者联盟

Java 数组 开发

讲述我在阿里六面的经历,幸好我掌握了这份“Java并发编程+面试题库”成功拿到20K的offer

比伯

Java 编程 架构 面试 计算机

架构师训练营 1 期 -- 第十一周总结

曾彪彪

极客大学架构师训练营

打造Django私有化缓存组件django-api-cache

pygodnet

django django-api-cache django缓存 私有化缓存 接口缓存

我对业务方提出需求的态度

boshi

随笔杂谈 需求落地

已拿腾讯后台开发岗offer,简单说下自己的面试经历和学习路线

程序员小灰

c++ 后台开发 架构师 TCP/IP Linux服务器开发

程序员的故事

Philips

敏捷开发 快速开发 原创小说 企业开发 企业应用

想了解任务型对话机器人,我们先从自然语言理解聊起

华为云开发者联盟

人工智能 机器人 自然语言

训练营第七周作业

大脸猫

极客大学架构师训练营

看区块链如何打通信息壁垒,盘活万亿级”积分”市场

CECBC

区块链 信息

「云端的DevOps」系列之打造DevOps持续交付高速公路_语言 & 开发_刘涛_InfoQ精选文章