基于Kubernetes的DevOps实践:容器加速软件交付(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-10 22:38:51

点击下载

作者:史天,肖力,等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

基于Kubernetes的DevOps实践:容器加速软件交付

基于Kubernetes的DevOps实践:容器加速软件交付试读:

前言

本书带领你开启DevOps、容器和Kubernetes基本概念和实用技能的学习之旅。

本书涉及的内容

第1章,DevOps 简介。介绍从过去到今天 DevOps 的演变过程,以及应该了解的DevOps工具。在过去几年中,对具有DevOps技能的工程师的需求一直在快速增长。它加快了软件开发和交付速度,也有助于提高业务灵活性。

第2章,DevOps和容器。帮助人们学习容器基础知识和容器编排,随着微服务的发展,容器因与语言无关的隔离性而成为DevOps的必备便捷工具。

第3章,Kubernetes入门。探讨了Kubernetes中的关键组件和API对象,以及如何在Kubernetes集群中部署和管理容器。Kubernetes通过许多“杀手级”功能,例如,弹性扩展、挂载存储系统、服务发现,极大地减少了容器编排的工作量。

第4章,存储与资源管理。介绍了卷管理,以及Kubernetes中的CPU和内存管理。集群中的容器存储管理通常是一个难点。

第5章,网络与安全。介绍了如何允许入站连接访问Kubernetes服务,以及默认网络如何在Kubernetes中工作。从外部访问服务是业务需求所必需的。

第6章,监控与日志。介绍如何使用Prometheus监控应用程序、容器和节点资源使用情况。介绍了如何从应用程序中收集日志,以及如何在Kubernetes中使用Elasticsearch、Fluentd及Kibana堆栈。确保服务正常运行是DevOps的主要职责之一。

第7章,持续交付。介绍了如何使用GitHub/Docker Hub/TravisCI构建持续发布流水线,还介绍了如何管理更新,消除滚动更新时可能产生的影响,并防止可能发生的故障。持续交付是一种加快产品上市的方法。

第8章,集群管理。介绍如何使用Kubernetes命名空间和资源配额解决资源管理的问题,以及如何在Kubernetes中进行访问控制。为Kubernetes集群设置管理边界和访问控制对DevOps至关重要。

第9章,AWS上的Kubernetes。介绍了AWS各项服务,并展示了如何在AWS上配置Kubernetes。AWS是目前最受欢迎的公有云,它为全球基础设施带来了灵活性和敏捷性。

第10章,GCP 上的 Kubernetes。帮助你了解 GCP 和 AWS 之间的区别,以及从Kubernetes的角度来看在托管服务中运行容器化应用*程序的好处。谷歌容器引擎(Google Containor Engine)是GCP平台上Kubernetes的托管环境。

第11章,未来探究。介绍了其他一些类似的容器编排技术,如 Docker Swarm, Amazon ECS和Apache Mesos,你将从中了解哪种方法最适合自己的业务。Kubernetes是开源项目。本章将介绍如何与Kubernetes社区联系,以参考社区中其他人的思路。

运行本书代码的环境准备

本书将介绍如何借助macOS和公有云(AWS和GCP)使用Docker容器和Kubernetes进行软件开发和交付的方法。你需要安装minikube、AWS CLI和Cloud SDK,以便运行本书中提供的示例代码。

谁适合阅读本书

本书面向具有一定软件开发经验的 DevOps 专业人员,探索扩展、自动化和缩短软件上市交付时间。

约定

在本书中,你将找到许多区分不同类型信息的文本样式。以下是这些样式的一些示例,以及它们的含义说明。

代码文本、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter样式如下所示:“将下载的WebStorm-10*.dmg磁盘镜像文件作为另一个磁盘装入你的系统。”

命令行输入或输出参照如下形式:

新术语和重要内容以粗体显示。在屏幕上看到的单词(例如,在菜单或对话框中)会以后述方式出现在文本中:“本书中的快捷方式基于Mac OS X 10.5+操作系统。”警告或重要说明。提示和技巧。

*译者注:AWS也提供Kubernetes的托管服务EKS(Amazon Elastic Container Service for Kubernetes),于2018年5月正式推出,是在本书原著撰写之后。

读者反馈

欢迎来自读者的反馈。让我们知道你对本书的看法——你喜欢或不喜欢的内容。读者反馈对我们很重要,因为它可以帮助我们开发那些可以真正帮助你获得收益的内容。

向我们发送一般反馈,请发送电子邮件至lzhmails@phei.com.cn,并在邮件主题中提及该书的标题。如果你有相关专业知识,并且有兴趣撰写书籍,请参阅本书后附的《选题申报表》,并与我们取得联系。

客户支持

作为Packt书籍读者,通过客户支持可以帮助用户获得最大收益。

示例代码下载

读者可以从http://www.packtpub.com下载此书的示例代码。如果你在其他地方购买了本书,可以访问http://www.packtpub.com/support并注册,以方便我们将文件直接通过电子邮件发送给你。你可以按照以下步骤下载代码文件:

1.使用你的电子邮件地址和密码在网站登录或注册。

2.将鼠标指针悬停在顶部的“SUPPORT”选项卡上。

3.单击“Code Downloads & Errata”。

4.在“Search”框中输入图书的名称。

5.选择你要下载代码文件的书籍。

6.从下拉菜单中选择你购买的书。

7.单击“Code Download”。

下载文件后,请确保使用最新版本解压缩文件夹:

● Windows上的WinR5AR / 7-Zip

● Mac上的Zipeg / iZip / UnRarX for

● Linux上的7-Zip / PeaZip

本书的代码包托管在GitHub 上,网址为:https://github.com/PacktPublishing/DevOpswithKubernetes。还有来自其他书籍的视频代码包,可通过https://github.com/PacktPublishing/获得。去看一下吧!

下载本书的彩色图片

我们还为你提供了一个 PDF 文件,包含本书中使用的屏幕截图/图表的彩色图片。彩色图片将帮助读者更好地了解输出的变化。你可以从下面的地址下载此文件:

勘误表

虽然我们已经尽力确保内容的准确性,但仍难免发生错误。如果你在本书中发现了错误,可能是文本或代码的错误,请向我们报告,我们将非常感激。这样做你可以帮助其他读者,并帮助我们改进本书的后续版本。如果你发现任何勘误,请访问http://www.packtpub.com/submit-errata,选择相应的图书,点击 Errata Submission Form链接,然后输入勘误的详细信息。一旦勘误得到验证,你的提交将被接受,勘误将上传到网站,或添加到该标题的勘误部分下的勘误表中。

要查看以前提交的勘误,请转到 https://www.packtpub.com/books/content/support,并在搜索字段中输入该书的名称。勘误信息将显示在Errata部分。

盗版行为

互联网上受版权保护的资料被盗版一直是媒体持续关注的问题。在Packt,我们非常重视保护我们的版权。如果你在互联网上发现我们作品的任何非法副本,请立即向我们提供地址或网站名称,以便我们寻求补救措施。请通过 copyright@packtpub.com (或dbqq@phei.com.cn)与我们联系,并提供可疑盗版资料的链接。

我们非常感谢你在帮助我们打击盗版行为上提供的帮助。

问题反馈

如果你对本书的任何方面有疑问,可以通过 lzhmails@phei.com.cn 与我们联系,我们将尽力解决。1 DevOps简介

软件交付周期越来越短,与此同时,应用程序的规模越来越大,软件开发工程师和运维工程师面临寻找解决方案的压力。然后,一个叫DevOps的新角色诞生了,它致力于支持软件的持续构建和交付。

本章包含以下内容:

● 软件交付方法是如何演进的?

● 什么是微服务?为什么要采取这个架构?

● DevOps如何支持应用程序的构建,并将其交付给用户?软件交付的挑战

如何构建计算机应用程序并且交付给用户,一直以来都是被不断讨论的话题,并且随着时间的推移不断发展。它和软件开发周期(Software Development Life Cycle,SDLC)息息相关,这里将介绍几种常见类型的流程、方法和历史。在本章中,我们将介绍这个发展过程。瀑布模型和实物交付

退回到20世纪90年代,软件交付采用实物方式,比如软盘、硬盘或者光盘。因此, SDLC是一个非常长的周期,因为整个过程并不简单。

在这个阶段,主要的软件开发模型是瀑布模型,该模型包含需求、设计、实施、验证、维护阶段,如下图所示。

这种情况下,我们不能从一个阶段返回到上一个阶段。例如,在开始或者结束实施阶段后,返回设计阶段(例如查找技术可扩展性问题)是不可接受的。这是因为它会影响到整体进度和成本。项目趋于继续向前并完成发布,然后进入下一个发布周期,包括新的设计。

这种方式和实物交付完美匹配,因为它需要与制作与交付软盘/CD-ROM 给用户的物流管理协调一致。瀑布模型和实物交付通常需要很长时间,一般是一年到几年。敏捷模型和电子交付

几年之后,互联网被广泛接受,随之软件交付从实物转变成电子交付,比如在线下载。因此,许多软件公司(也称为dot-com网络公司)试图找出如何缩短SDLC流程,以交付能够击败竞争对手的软件。

许多开发者开始采用新的方法,比如增量、迭代和敏捷模型,以便更快地交付给用户。即使发现了新的错误,现在也可以更容易地通过电子交付给用户更新和打补丁。微软也从Windows 98开始引入Windows update更新。

在这种情况下,软件开发者只需要写很少的逻辑和模块,而不是一次性编写整个应用程序。然后交付给质量保证工程师(QA),接着开发者可以继续添加新模块,最后再将其交付给质量保证工程师(QA)。

当所需的模块或功能准备就绪时,它将会被发布,如下图所示。

该模型使SDLC循环和软件交付更快,并且在此过程中也易于调整,因为循环一般持续几周到几个月,这个周期足以进行快速调整。

尽管敏捷模型目前受到大多数人的喜爱,但在当时应用软件交付意味着软件二进制文件,例如 EXE 程序,被设计用于在客户的PC上安装和运行。另一方面,基础设施(例如服务器和网络)是静态的,并且需要事先设置好。因此,SDLC的范围不倾向于涉及这些基础设施。云端的软件交付

几年之后,智能手机(例如iPhone)和无线技术(例如Wi-Fi和4G网络)被广泛接受,软件应用程序也从二进制转变为在线服务,网络浏览器是应用程序软件的交互界面,客户不再需要安装应用程序。另外一方面,基础设施转变为动态的,因为应用程序需求不断变化,并且容量也需要持续增长。

虚拟化技术和软件定义网络(SDN)使服务器更加动态化。现在,像Amazon Web Services(AWS)和Google Cloud Platform(GCP)这样的云服务,可以轻松创建和管理动态基础设施。

现在,基础设施被纳入软件开发交付周期的范围,并且是重要的组件之一,因为应用程序被安装并且运行在服务器上,而不再是客户的 PC 机上。因此,软件和服务交付周期缩短为几天到几周。持续集成

如上文所述,软件交付环境不断变化,交付周期也越来越短。为了实现更高质量的快速交付,开发者和 QA开始采用一些自动化技术。其中一项流行的自动化技术就是持续集成(Continuous Integration,CI),CI包含一系列工具的组合,例如版本控制系统(Version Control Systems,VCS)、构建服务器和自动化测试工具。

VCS帮助开发者在中心服务器上维护程序源代码。它阻止开发者的代码被覆盖或者和其他开发者的代码冲突,并且可以保留历史记录。因此,它可以更容易地保持源代码的一致性,直到下一个交付周期。

与 VCS相同,持续集成中有一个集中的构建服务器,它连接到 VCS,定期或者在开发者更新代码到VCS时自动检索源代码,然后触发新构建。如果构建失败,它会及时通知开发者。因此,当有人将损坏的代码提交到VCS时,构建服务器可以帮助开发者及时调整。

自动化测试工具也与构建服务器集成。当构建成功后,它会调用单元测试程序,然后将结果通知给开发者和QA。这有助于识别何时有人编写错误的代码,并存储到VCS。

整个CI的流程如下图所示:

CI不仅可以帮助开发者和QA提升代码质量,并且缩短了程序归档或者模块打包周期。在电子交付的时代,CI足够应付。然而,交付到用户即意味着需要将应用程序部署到服务器。持续交付

CI加上自动化部署是服务器上的应用程序向用户提供服务的理想过程。但是,还有一些技术挑战需要解决。如何将软件交付给服务器?如何优雅地关闭已有的应用程序?如何替换或者回滚应用程序?如果系统库也要更新,如何升级或者替换?如果需要,如何修改操作系统中的用户和组设置?

因为基础设施包含服务器和网络,所以这些都取决于开发、QA、预发布、生产等环境。每个环境都有不同的服务器配置和IP地址。

持续交付(Continuous Delivery,CD)是一种可以实现的最佳实践,它是CI工具、配置管理工具和编排工具的组合:配置管理

配置管理工具帮助配置操作系统,包括用户、用户组和系统库,并且可以管理多台服务器,以便我们更换服务器时与所需的状态或者配置保持一致。

它不是脚本语言,因为脚本语言是逐行执行的命令。如果我们两次运行脚本,则可能导致一些错误,举个例子,如尝试两次创建同一个用户。另外一方面,配置管理会检查状态,所以,如果用户已经创建,配置管理工具不会执行任何操作。但是,如果我们意外或者故意删除用户,配置管理工具将再次创建用户。

它还支持将应用程序部署或安装到服务器中。因为如果你告诉配置管理工具下载应用程序,然后设置并运行应用程序,它就会尝试这样做。

此外,如果你告诉配置管理工具关闭应用程序,然后下载并替换为新的可用的软件包,然后重新启动应用程序,它将保持新版本。

当然,一些用户希望仅在需要时更新应用程序,例如蓝绿部署。配置管理工具将允许你手工触发执行。蓝绿部署是一种准备两组应用程序堆栈的技术,只有一个环境(例如蓝色)为生产服务。当你需要部署新版本的应用程序时,部署到另一个环境(例如绿色),然后执行最终测试。如果一切工作正常,更改负载均衡器或路由器设置,将网络流量从蓝色切换为绿色。然后绿色变为生产服务,而蓝色变为休眠状态,并等待下一个版本部署。基础设施即代码

配置管理工具不仅支持操作系统或者虚拟机,还支持云基础设施。如果你需要在云端创建并且配置网络、存储和虚拟机,则需要一些云端操作。

配置管理工具可以通过配置文件自动化设置云基础设施,如下图所示:

配置管理相对于标准操作过程(Standard Operation Procedure,SOP)有一些优势。例如,使用VCS(比如Git)维护配置文件,可以跟踪环境设置的更改历史记录。

复制环境也变得容易。例如,你需要在云上部署一套额外的环境。如果你遵循传统方法(即读取SOP文档来操作云环境),它总是存在潜在的人为和操作失误。另一方面,我们可以通过配置管理工具执行操作,快速自动地在云上创建环境。基础设施即代码可能包含也可能不包含在持续交付(CD)过程中,因为基础设施更换或者更新成本高于仅替换服务器上的应用程序二进制文件。编排

编排工具也被归为配置管理工具的一种。但是,在配置和分配云资源时,它更加智能和动态。例如,编排工具可以管理多个服务器和网络资源,当管理员想要增加应用程序实例时,编排工具可以确定可用的服务器,然后自动部署和配置应用程序和网络。

虽然编排工具超出了SDLC范围,但它在需要扩展应用程序和重构基础设施资源时有助于持续交付。

总而言之,SDLC 已经发展为通过若干流程、工具和方法以实现快速交付。最终,软件(服务)交付只需要几小时。与此同时,软件架构和设计也在不断地发展,以实现大型应用程序。微服务趋势

基于目标环境和应用程序的大小,软件架构和设计也在不断发展。模块化编程

当应用程序规模越来越大时,开发人员试图将其拆分成若干个模块。每个模块应该是独立且可重用的,并且应由不同的开发团队维护。然后,当我们开始实现应用程序时,应用程序只需初始化,并使用这些模块来有效地构建更大的应用程序。

下面的例子显示了nginx(https://www.nginx.com)在CentOS7上使用的库。它表明nginx使用OpenSSL、POSIX线程库、PCRE正则表达式库、zlib压缩库、GNU C库等。nginx没有重新实现SSL加密和正则表达式:在CentOS中,ldd命令包含在glibc-common包中。包管理

Java语言和一些轻量级的编程语言,比如Python、Ruby和JavaScript都有自己的模块或者包管理工具。例如,Java的Maven(http://maven.apache.org),Python的pip(https://pip.pypa.io),Ruby的RubyGems(https://rubygems.org)和JavaScript的npm(https://www.npmjs.com)。

软件包管理工具允许将模块或软件包注册到集中式或私有存储库,并允许下载必要的软件包。以下屏幕截图显示了Maven的AWS SDK存储库:

当向应用程序添加一些特定的依赖项时,Maven会下载必要的包。以下屏幕截图是将awsjava-sdk依赖项添加到应用程序时获得的结果:

模块化编程可以帮助提高软件开发速度,并减少重复发明轮子的情况,因此它是现代应用程序开发最流行的方式。

但是,当我们不断添加新的功能和逻辑时,应用程序需要越来越多的模块、包和框架的组合。这将使得应用程序更加复杂和庞大,尤其是服务器端应用程序。因为它通常需要连接到数据库(如 RDBMS),以及身份验证服务器(如 LDAP),然后通过具有适当设计的HTML将结果返回给用户。

因此,开发人员采用了一些软件设计模型,以便在应用程序中使用一组模块开发应用程序。MVC设计模型

模型视图和控制器(MVC)是一种流行的应用程序设计模型。它定义了三个层次,视图层负责用户界面(UI)输入/输出(I/O),模型层负责数据查询和持久化,如加载和存储数据到数据库;控制器层负责视图和模型之间的业务逻辑。

有一些框架可以帮助开发人员简化MVC,比如Struts(https://struts.apache. org/),SpringMVC(https://projects.spring.io/spring-framework/),Ruby on Rails(http://rubyonrails.org/)和Django(https://www.djangoproject. com/)。MVC是成功的软件设计模型之一,是现代Web应用程序和服务的基础。

MVC定义了每个层之间的边界线,允许多名开发者共同开发相同的应用程序。但是,它也会有副作用,就是应用程序中源代码的体积不断变大。这是因为数据库代码(Model)、表示代码(View)和业务逻辑(Controller)都在同一个 VCS存储库中。它最终会对软件开发周期产生影响,再次变得更慢!它被称为单体架构(monolithic),包含许多构建巨型exe/war程序的代码。单体架构应用程序

没有明确的定义衡量单体架构应用程序,但它曾经有超过50个模块或包,以及超过50个数据库表,然后它需要超过30分钟来构建。当需要添加或修改其中一个模块时,它会影响很多代码,因此开发人员会尝试最小化应用程序代码更改。这种犹豫导致了更糟糕的效果,比如有些应用程序就“死”掉了,因为没有人想再维护这些代码。

因此,开发者开始将单体架构应用程序拆分成小块应用程序,然后通过网络进行连接。远程过程调用

实际上,在20世纪90年代,人们已经尝试将应用程序分成小块并通过网络连接。Sun Microsystems公司引进了Sun RPC(Remote Procedure Call,远程过程调用)。它允许你远程使用该模块。其中一个比较流行的Sun RPC实现是网络文件系统(Network File System,NFS)。因为基于Sun RPC,NFS客户端和NFS服务器之间的CPU和操作系统版本是相互独立的。

编程语言本身也支持RPC风格的功能。UNIX和C语言有rpcgen工[1]具。它有助于开发者生成桩代码,该代码负责网络通信,因此开发人员可以使用C语言函数样式,进而从困难的网络层编程中解脱出来。

Java具有类似于Sun RPC的Java远程方法调用(Remote Method Invocation,RMI), RMI编译器(rmic)生成连接远程Java进程的桩代码,以调用该方法并获得结果。下图显示了Java RMI过程调用的流程:

此外,Objective C有分布式对象,.NET有远程处理功能,因此大多数现代编程语言都具有开箱即用的远程过程调用功能。

这些远程过程调用设计有利于将应用程序划分为多个进程(程序)。单个程序可以有单独的源代码存储库。尽管机器资源(CPU、内存)在20世纪90年代和21世纪初受到限制,但效果仍然很好。

然而,它被设计为使用相同的编程语言,并且用于客户端/服务器模型的结构,而不是分布式架构。此外,安全方面的因素考虑较少。因此,不建议在公共网络上使用。

在21世纪初,诞生了一种使用SOAP(HTTP/SSL)作为数据传输的Web服务,它使用 XML 作为数据表示和服务定义 Web 服务描述语言(Web Services Description Language,WSDL),然后使用通用描述、发现和集成(Universal Description、Discovery、Integration,UDDI)作为服务注册来查找 Web 服务应用程序。但是,由于机器资源并不丰富,并且由于Web服务编程和可维护性的复杂性,并未被开发者广泛接受。RESTful设计

到了2010年,机器的能力甚至智能手机都拥有充足的CPU资源,此外还有几百Mbps的网络带宽。因此,开发人员开始充分利用这些资源使应用程序代码和系统结构尽可能简化,从而使软件开发周期更快。

基于硬件资源的情况,使用HTTP/SSL作为RPC传输是一个自然而然的决定,但是由于Web服务仍具有难度,因此开发者将其内容简化如下:

● 使用HTTP和SSL/TLS作为传输标准;

● 使用HTTP方法进行创建/加载/上传/删除(Create/Load/Upload/Delete,CLUD)操作,例如GET/POST/PUT/DELETE;

● 使用URI作为资源标识符,例如:user ID 123表示为/user/123/;

● 使用JSON作为标准数据表示。

这被称为RESTful设计,目前已被开发者广泛接受,并成为分布式应用程序的事实标准。RESTful应用程序支持任何编程语言,因为它是基于HTTP的,因此 RESTful服务器端可以是Java语言开发的,而客户端使用Python。

这为开发人员带来了自由和机会,它易于执行代码重构、升级库甚至切换到另一种编程语言。它还鼓励开发人员通过多个RESTful应用程序构建分布式模块化设计,这种应用程序称为微服务。

如果你有多个RESTful应用程序,则需要考虑如何在VCS上管理多个源代码,以及如何部署多个RESTful服务器。持续集成和持续交付自动化可以帮你更轻松地构建和部署多个RESTful服务器应用程序。

因此,微服务设计越来越受到Web应用程序开发人员的欢迎。微服务

虽然名称中使用“微”,但与20世纪90年代或21世纪初的应用相比,实际上它还是相当重。它使用完整堆栈的 HTTP/SSL服务器,包含整个 MVC层。微服务设计应该关注以下主题。

● 无状态:不将用户会话存储到系统中,这有助于更轻松地扩展。

● 无共享数据存储:微服务应拥自己的数据存储如数据库。它不应与其他应用程序共享。它有助于封装后端数据库,方便代码重构,并在单个微服务中更新数据库模式。

● 版本控制和兼容性:微服务可能会经常更改和更新 API,应定义版本,并且应具有向后兼容性。这有助于与其他微服务和应用程序解耦。

● 集成CI/CD:微服务应采用CI和CD流程来消除管理工作。

有一些框架可以帮助构建微服务应用程序,如Spring Boot (https://projects. spring.io/spring-boot/)和Flask(http://flask.pocoo.org)。也有很多基于HTTP的框架,因此开发人员可以随意尝试和选择框架,甚至编程语言。这也是微服务设计的精妙之处。

下图是单体架构应用程序设计和微服务设计之间的比较。它表明微服务(也是MVC)设计与单体架构相同,包括接口层、业务逻辑层、模型层和数据存储。

但不同之处在于应用程序(服务)由多个微服务构建,并且不同的应用程序可以在下面共享相同的微服务:

开发者可以使用不会影响现有应用程序(服务)的快速软件交付方法添加必要的微服务,或者修改现有的微服务。

它是整个软件开发环境和方法的突破,现在已被许多开发者广泛接受。

虽然持续集成和持续交付自动化流程有助于开发和部署多个微服务,但是资源和复杂性(如虚拟机、操作系统、库、磁盘卷和网络)在数量上无法与单体架构应用程序进行比较。

因此,有一些工具和角色可以支持云上的大型自动化环境。自动化工具

如前文所述,自动化是实现快速软件交付的最佳实践,并解决了管理许多微服务的复杂性。但是,自动化工具不是普通的IT/基础设施应用程序,如Active Directory、BIND (DNS)和Sendmail(MTA)。为了实现自动化,工程师应该具备编写代码的开发技能,特别是脚本语言,以及基础结构运维技能,如虚拟化、网络和存储。

DevOps是开发和运维的结合,可以实现自动化流程,如持续集成、基础设施即代码和持续交付。DevOps使用一些DevOps工具自动化过程。持续集成工具

Git是一款流行的 VCS工具(https://git-scm.com)。开发人员使用Git来检入(checkin)和检出(checkout)代码。有一些托管Git服务,如GitHub(https://github. com)和Bitbucket (https://bitbucket.org),它允许创建和保存你的Git存储库,并与其他用户协作。以下截图是GitHub上的拉取请求示例:

构建服务器也有很多种,比如Jenkins(https://jenkins.io)是一个成熟的应用程序,与TeamCity(https://www.jetbrains.com/teamcity/)相同。除了自建的构建服务器之外,还有托管服务,软件即服务(Software as a Service,SaaS),如Codeship(https://codeship.com)和Travis CI(https://travis-ci.org)。SaaS具有与其他SaaS工具集成的优势。

构建服务器能够调用外部命令,例如单元测试程序。因此,构建服务器是CI流水线中的关键点。

以下截图是使用Codeship的构建示例,它从GitHub中检出代码并调用Maven进行构建(mvn compile)和单元测试(mvn test):持续交付工具

配置管理工具有很多种,如Puppet(https://puppet.com)、Chef(https://www.chef.io)和Ansible(https://www.ansible.com),它们是最受欢迎的配置管理工具。

AWS OpsWorks(https://aws.amazon.com/opsworks/)提供托管Chef平台。以下截图是使用AWS OpsWorks安装Amazon CloudWatch Log代理的Chef脚本(配置),它在启动EC2实例时自动安装CloudWatch Log代理:

AWS CloudFormation(https://aws.amazon.com/cloudformation/)有助于实现基础设施即代码。它支持AWS操作的自动化,例如执行以下功能:

1.创建VPC。

2.在VPC上创建子网。

3.在VPC上创建Internet网关。

4.创建路由表以将子网关联到Internet网关。

5.创建安全组。

6.创建云主机实例。

7.将安全组关联到云主机实例。

CloudFormation的配置使用JSON编写,如下图所示:

它支持参数化,因此使用具有相同配置的 JSON文件很容易创建具有不同参数的环境(例如,VPC和CIDR)。此外,它还支持更新操作。因此,如果需要更改一部分基础设施,则无须重新创建。CloudFormation可以识别增量配置并执行必要的基础设施操作。

AWS CodeDeploy(https://aws.amazon.com/codedeploy/)也是一种有用的自动化工具。它主要聚焦在软件部署,允许用户自定义。以下是YAML文件中的一些操作。

1.到哪里下载和安装。

2.如何停止应用。

3.如何安装应用程序。

4.安装后,如何启动和配置应用程序。

以下截图是AWS CodeDeploy配置文件appspec.yml的示例:监控和日志工具

如果你开始使用云基础设施管理微服务,那么有一些监控工具可以帮助你管理服务器。

Amazon CloudWatch是 AWS的内置监控工具。它无须安装代理,会自动从 AWS实例收集一些指标,帮助 DevOps实现可视化。它还支持根据设置的条件进行警报。以下截图是EC2实例的Amazon CloudWatch指标:

Amazon CloudWatch还支持应用程序日志的收集。它需要在EC2实例上安装代理。当你需要开始管理多个微服务实例时,集中式日志管理是非常有用的。

ELK 是一种流行的堆栈组合,是 Elasticsearch(https://www.elastic.co/products/elasticsearch)、Logstash(https://www.elastic.co/products/logstash)和 Kibana(https://www.elastic.co/products/kibana)三个应用的缩写组合。Logstash 有助于采集应用程序日志并转换为 JSON 格式,然后发送到Elasticsearch。

Elasticsearch是一个分布式JSON数据库。Kibana可以可视化存储在Elasticsearch上的数据。以下是Kibana的一个示例,展示了nginx访问日志:

Grafana(https://grafana.com)是另一个流行的可视化工具。它与时间序列数据库连接,如 Graphite(https://graphiteapp.org)或 InfluxDB(https://www.influxdata.com)。时间序列数据库用于存储扁平的、非规范化的数字型数据,如CPU使用率和网络流量。与RDBMS不同,时间序列数据库有一些内置优化,可以节省数据空间,更快地查询数据历史记录。大多数 DevOps监控工具后端都使用时间序列数据库。

以下是Grafana显示消息队列服务(Message Queue Server)统计信息的示例:沟通工具

如果你开始使用我们之前提到的几个 DevOps工具,你需要来回切换访问不同的控制台以检查CI和CD流水线是否正常工作。例如,需要考虑以下几点。

1.将源代码合并到GitHub。

2.在Jenkins上触发新的构建

3.触发AWS CodeDeploy以部署新版本的应用程序。

这些事件需要按时间顺序跟踪,如果存在问题,DevOps需要与开发人员QA讨论以处理这些情况。然而,这样存在一些过度通信问题,因为 DevOps需要逐个查看事件,然后通过电子邮件进行解释。这样效率不但不高,而且问题仍在继续。

有一些通信工具可以帮助集成这些 DevOps工具,任何人都可以加入以查看事件并相互评论。Slack(https://slack.com)和HipChat(https://www.hipchat.com)是其中最受欢迎的通信工具。

这些工具支持集成到SaaS服务,以便DevOps可以在单个聊天室中查看事件。以下截图是与Jenkins集成的Slack聊天室:公有云

使用云计算技术,可以轻松实现 CI/CD 和自动化工作。特别是公有云 API 可以为DevOps提供许多CI/CD的支持。Amazon Web Services(https://aws.amazon.com)和Google Cloud Platform(https://cloud.google.com)等公有云为DevOps提供了一些API来控制云基础设施。DevOps可以借此缓解容量和资源限制,只需在需要资源时按需付费。

公有云将继续以与软件开发周期和架构设计相同的方式发展。它们是最好的组合,也是实现应用/服务成功的关键。

以下截图是Amazon Web Services的Web控制台:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载