深度解读什么是DevOp以及DevOps的技术实现

近两年,随着容器、kubernetes 等技术的兴起,devops 这个概念被广泛提及并被大量使用。本文将会从devops的产生、devops 与容器/kubernetes 之间的关系、devops 的技术实现方式几个方面,结合实验展现的方式,让读者真正理解 devops 的含义。
devops 是什么
devops 中的 dev 指的 development,ops 指的是的 operations,用一句话来说 devops 就是打通开发运维的壁垒,实现开发运维一体化。
从瀑布式开发到敏捷开发
谈到 devops 的发展史,我们需要先谈一下敏捷开发。
首先,敏捷开发是面向软件的,而软件依赖于计算硬件。我们知道,世界上第一台计算机是在 1946 年出现的。因此,软件开发相对于人类历史而言,时间并不长。相对于软件开发方法论的掌握,人们更擅长于工程学,如盖楼、造桥等。为了推动软件开发,1968 年,人们将工程学的方法应用到软件领域,由此产生了软件工程。
软件工程的方式有其优点,但带来了不少问题。最关键一点是:软件不同于工程。通过工程学建造的大桥、高楼在竣工后,人们通常不会对大桥高楼的主体有大量使用需求的变更;但软件却不同。对于面向最终用户的软件,人们对于软件功能的需求是会不断变化的。在瀑布式开发的模式下,当客户对应用有变化的需求时,软件厂商得重新开发软件。这将会使企业的竞争力大幅下降。
传统的软件开发流程是:产品经理收集一线业务部门和客户的需求,这些需求可能是新功能需求,也可能是对产品现有功能做变更的需求。然后进行评估、分析,将这些需求制定为产品的路线图,并且分配相应的资源进行相关工作。
接下来,产品经理将需求输出给开发部门,开发工程师写代码。写好以后,就由不同的部门的人员进行后续的代码构建、质量检验、集成测试、用户验收测试,最后给生产部门。这样带来的问题是,开发周期比较长,并且如果有任何变更,都要重新走一遍开发流程,在商场如战场的今天,软件一个版本推迟发布,可能到发布时这个版本在市场上就已经过时了;而竞争对手很可能由于在新软件发布上快了一步,而迅速抢占了客户和市场。
正是由于商业环境的压力,软件厂商需要改进开发方式。
2001 年初,在美国滑雪胜地 snowbird,17 位专家聚集在一起,概括了一些可以让软件开发团队更具有快速工作、相应变化的能力的价值观原则。他们称自己为“敏捷联盟”。
有了敏捷联盟,有了敏捷开发价值观,必然会产生开发的流派。主要的敏捷开发流派有:
极限编程(xp)、scrum、水晶方法等。
至此,敏捷开发有理念、有方法、有实践。随着云计算概念的兴起,云计算的不断落地,敏捷开发不仅实现了工具化,也得到了升华。
从敏捷开发到 devops
谈到了敏捷开发,那么敏捷开发和 devops 有什么关系呢?
敏捷开发是开发域里的概念,在敏捷开发基础之上,有如下阶段:
敏捷开发-》持续集成-》持续交付-》持续部署-》devops。
从敏捷开发到 devops,前一个阶段都是后一个阶段的基础;随着阶段的推进,每个阶段概念覆盖的流程越来越多;最终 devops 涵盖了整个开发和运维阶段。正式由于每个阶段涉及的范围不同,因此所以每个概念所提供的工具也是不一样的。
持续集成(continuous integration)指的是:代码集成到主干之前,必须全部通过自动化测试;只要有一个测试用例失败,就不能集成。持续集成的要实现的目标是:在保持高质量的基础上,让产品可以快速迭代。
持续交付(continuous delivery)指的是:开发人员频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就被发布。如果评审不通过,那么需要开发进行变更后再提交。
持续部署(continuous deployment)指的是:代码通过评审并发布后,自动部署,以交付使用。
devops 是一组完整的实践,可以自动化软件开发和 it 团队之间的流程,以便他们可以更快、更可靠地构建、测试和发布软件。
devops 的技术实现
devops 的技术实现,需要三个方面:标准交付物、容器调度平台、devops 工具链。接下来,我们详细看一下这个三个方面的内容。
devops 的技术实现 1:标准交付物
devops 的目的在于让开发和运维一体化、让开发和运维相互之间的沟通更加顺畅、迅捷,从而使企业更能适应市场的变化。
当然,真正实现开发运维一体化,并非只是让开发和运维的人坐在一起那么简单。从技术角度,devops 首先需要有一个包含了“操作系统+runtime+应用”的标准交付物。除此之外,还需要通过整个 devops 流程来打通。
在 it 早期,厂商硬件和系统平台的差异化过大,在不同硬件和系统平台进行应用的无缝迁移几乎是不可想象的。随着 x86 服务器以及 vsphere 等虚拟化技术的普及,操作系统(包括操作系统上的应用)可以在不同 x86 服务器厂商的硬件平台上在线无缝迁移。硬件差异化不断缩小甚至消失,软件的重要性不断提升,it 界真正进入软件定义一切的时代。在这个背景下,业务提出了更高的要求,如何将应用在不同操作系统之间实现无缝迁移,将开发和生产统一,做到”构建一次,到处运行”。
容器技术的概念最初出现在 2000 年,当时称为 freebsd jail,这种技术可将 freebsd 系统分区为多个子系统。
但直到 docker 的出现(2008 年),容器才真正具备了较好的可操作性和实用性。因为 docker 提供了容器的镜像构建、打包等技术,使容器具备了一次打包,到处运行的能力。
对于客户而言,docker 只能在一个 linux 上运行,是“单机版”,很难符合企业对高可用的需求。此外,docker 也缺乏和持久存储、虚拟网络相关的功能。
devops 的技术实现 2:容器调度平台
2014 年 kubernetes 的出现,奠定了今天容器调度平台的事实标准的基础。
因为通过 kubernetes,我们不仅实现了容器在多个计算节点上的统一调度,还可以将容器对接持久存储、对接虚拟网络等。换句话说,kubernetes 使容器具备企业级的功能。
devops 的技术实现 3:devops 工具链
在有了容器和 kubernetes 以后,我们还需要相关的 devops 工具链。
目前在 it 界,devops 相关的工具很多,其中大多数是开源的工具。
在后面的文章中,我们会选择几种常用的 devops 工具,然后进行试验展现。
总结:devops 与容器和 kubernetes 的关系
paas、devops 的概念,在容器和 kubernetes 普及之前就存在了。广义上的 paas、devops 的建设,会包含:人、流程、工具等多方面内容。it 厂商提供的 paas、devops 以指工具层面的落地为主、以流程咨询为辅。
在 kubernetes 和容器普及之前,我们通过虚拟机也可以实现 paas、ci/cd,只是相对速度较慢,因此普及性不高(想象一下通过 x86 虚拟化来实现中间件集群弹性伸缩的效率)。
而正是容器的出现,为 paas、devops 工具层面的落地提供非常好的承载平台,使得这两年容器云风生水起。这就好比 4g(2014 年出现)和微信(2011 年出现)之间的关系:在手机网速 3g 时代,流量按照兆收费的时候,(即使有)大家对于微信语音聊天、微信视频也不会太感兴趣。
所以说, docker 使容器具备了较好的可操作性、可移植性,kubernetes 使容器具备企业级使用的条件。而 it 界众多基于 kubernetes 和 docker 企业级的容器平台,又成为了 devops 工具落地的新一代基础架构。
devops 工作流展示
常用 devops 工具介绍
kubernetes 集群:包含 docker 和 kubernetes
gogs: 通过 go 编写的本地代码仓库,功能与 github 类似。
jenkins/jenkins slave pods:持续集成工具
nexus :工件管理器,能够解决本地缓存构建依赖项。
sonarqube:开源代码分析工具,它可以分析常见编程错误的源代码
以上的 devops 工具,都可以以容器方式部署到 kubernetes 集群中。在实验环境中,有一个两个节点的 kubernetes 集群,用于进行实验展现。
kubernetes 集群
在 kubernetes 集群中创建三个 namespace:cicd、dev、stage。其中 cicd namespace 存放的是 devops 相关工具链。dev、stage 是模拟开发和生产两个环境。
kubernetes 集群的 namespaces
接下来,我们看一下在 cicd namespace 中部署的 devops 工具链:
kubernetes 集群中部署的 devops 工具
在工具链部署成功以后,我们分别登录工具的 ui 界面进行查看。
nexus 用于存放构建成功、并经过 code review 的 war 包,我们查看 nexus 的界面:
sonarqube 负责 code review:
jenkins pipeline 工作流分析
整个 devops 的流程,通过 jenkins 的 pipeline 串接起来。在 jenkins 中,我们可以通过编写 jenkins file,或者通过 jenkins 浏览器页面的操作来完成 pipeline 的定制。两者的实现效果是一样的,本文以书写 jenkins file 方式展现。通过一个 jenkins file,打通整个 devops 流程。
我们查看 jenkins file 的内容并进行解释。
第一步,从 gogs 拉取源代码,然后调用 maven 进行代码编译:
清单 1. pipeline 第一阶段
pipeline { agent { label ‘maven’} stages { stage(‘build app’) { steps { git branch: ‘eap-7’, url: ‘http://gogs:3000/gogs/openshift-tasks.git’ script {def pom = readmavenpom file: ‘pom.xml’ version = pom.version } sh “${mvncmd} install -dskiptests=true” }
第二步,构建成功以后,调用 mvn 进行测试。
清单 2. pipeline 第二阶段
stage(‘test’) { steps { sh “${mvncmd} test” step([$class: ‘junitresultarchiver’, testresults: ‘**/target/surefire-reports/test-*.xml’]) } }
第三步,调用 sonarqube 进行代码 review。
清单 3. pipeline 第三阶段
stage(‘code analysis’) { steps { script { sh “${mvncmd} sonar:sonar -dsonar.host.url=http://sonarqube:9000 -dskiptests=true” } }}
第四步,将测试成功的代码存档到 nexus:
清单 4. pipeline 第四阶段
stage(‘archive app’) { steps { sh “${mvncmd} deploy -dskiptests=true -p nexus3” } }
第五步,pipeline 会将构建成功的 war 包,以二进制的方式注入到 jboss eap 的 docker image 中。
清单 5. pipeline 第五阶段
stage(‘build image’) { steps { sh “rm -rf oc-build && mkdir -p oc-build/deployments” sh “cp target/tasks.war oc-build/deployments/root.war”
接下来,pileline 先将这个 docker image 部署到 dev 环境,然后引入审批工作流,批准后部署到生产。
清单 6. pipeline 中的审批流
tage(‘promote to stage?’) { steps { timeout(time:15, unit:‘minutes’) { input message: “promote to stage?”, ok: “promote” }
devops 工具链演示
首先,登录到 jenkins 上,查看已经创建好的 pipeline。
点击“开始构建”,触发工作流(工作流也可以通过提交代码自动触发);
pipeline 的第一个阶段是 build app。
build app 成功的 logs 如下,我们可以看到生成了 war 包:
清单 7. 构建应用成功的日志
[info] installing /tmp/workspace/cicd-monolith-f138/cicd-monolith-f138-tasks-pipeline/target/tasks.war to /home/jenkins/.m2/repository/org/jboss/quickstarts/eap/jboss-tasks-rs/7.0.0-snapshot/jboss-tasks-rs-7.0.0-snapshot.war[info] installing /tmp/workspace/cicd-monolith-f138/cicd-monolith-f138-tasks-pipeline/pom.xml to /home/jenkins/.m2/repository/or
pipeline 继续执行,在 test 成功以后,开始进行 code analysis:
test 阶段执行成功的 log:
清单 8. 测试成功的日志
------------------------------------------------------- t e s t s-------------------------------------------------------running org.jboss.as.quickstarts.tasksrs.service.userresourcetesttests run: 1, failures: 0, errors: 0, skipped: 1, time elapsed: 1.798 sec - in org.jboss.as.quickstarts.tasksrs.service.userresourcetestrunning org.jboss.as.quickstarts.tasksrs.service.taskresourcetesttests run: 3, failures: 0, errors: 0, skipped: 0, time elapsed: 0.604 sec - in org.jboss.as.quickstarts.tasksrs.service.taskresourcetestresults :tests run: 4, failures: 0, errors: 0, skipped: 1
code analysis 阶段执行成功的日志,我们看到日志显示代码分析成功,并建议通过浏览器访问 sonarqube:
清单 9. 代码分析成功的日志
[info] analysis successful, you can browse http://sonarqube:9000/dashboard/index/org.jboss.quickstarts.eap:jboss-tasks-rs[info] note that you will be able to access the updated dashboard once the server has processed the submitted analysis report[info] more about the report processing at http://sonarqube:9000/api/ce/task?id=awc_r_egipi_jn5vc3mt[info] task total time: 18.918 s
我们登录 sonarqube,查看结果;
接下来,pilepine 进入到 create image builder 阶段,其关键的步骤是将构建成功的 war 包以二进制的方式注入到 docker image 中:
清单 10. 构建镜像的日志
[cicd-monolith-f138-tasks-pipeline] running shell script+ rm -rf oc-build+ mkdir -p oc-build/deployments[pipeline] sh[cicd-monolith-f138-tasks-pipeline] running shell script+ cp target/tasks.war oc-build/deployments/root.war
create image builder 执行成功以后,会生成包含应用的 docker image。接下来是 create dev 和 deploy dev,即在 dev 环境部署包含应用的 docker image。当 deploy dev 成功以后,会引入工作流,提示是否批准将应用部署到 stage。
选择 promote,应用会部署到 stage,pipeline 流程走完。
最后,通过浏览器访问成功部署到 dev/stage namespace 中的应用。
至此,您可以看到应用访问结果,说明 devops 全流程已经打通。
总结
通过本文,相信读者对 devops 的概念和工具链已经有了大致的了解。也对通过 kubernetes 集群和容器实现 devops 有了一定的理解。
文章转载:twt企业it社区
(版权归原作者所有,侵删)


LED透明显示屏的优点的以及它的应用场景
如何实现PLC之间无线通讯
哪些行业能引领工业4.0或推动工业互联网的突破发展
常见问题解答:Xilinx采用首个ASIC级UltraScale可编程架构
智能音箱巨头们各怀心思 是创业公司的生死场
深度解读什么是DevOp以及DevOps的技术实现
实时监测环境变化,DTU为环境保护保驾护航
NI部署自动驾驶研究车辆 提升ADAS/自动驾驶数据流程及管理
安森美半导体高能效智能电表电源方案
苹果新两项专利 为用户提高键盘的打字体验
喜讯 | 瑞迅科技入选西安市工业互联网产业生态供给资源池企业名单
解决低照度下摄像机成像效果的两种技术介绍
沃尔沃已达吉利对其推进IPO标准 估值300亿元
乐天移动和NEC公司正在开始生产5G网络无线设备
WinCE系统的编译过程详解
汽车企业要跟上开放的脚步 做到真正的开放和包容
家用逆变器使用注意事项
红米K30S再次开售欲截胡摩托罗拉
从芯片到应用,LoRa产业正在高速发展
2018年5月28日 | 周一 | 区块链早报