41

如何在六个月或更短的时间内成为DevOps工程师(四):打包

 5 years ago
source link: http://dockone.io/article/8399?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

快速回顾

在第1部分中,我们讨论了DevOps文化和所需的基础。

在第2部分中,我们讨论了如何为代码部署奠定基础:配置

在第3部分中,我们讨论了如何保持部署代码的有序性:版本控制

在这里,我们将讨论如何打包代码以便于部署和后续执行。

红圈表示我们当前所处的位置:

u2iMzuF.png!web

注意,当你看到本系列的这篇文章,你能发现每一篇都有着承上启下的作用。这很重要且有其原因。因为无论你是与你现在的,还是将来的老板交谈,你都必须能够清楚地表达出DevOps是什么以及它为何如何重要。你能通过一个连贯的故事来讲述如何使用最佳实践快速地有效地将代码从开发人员的手上部署到生产环境进而产生商业价值。

因此,我们不是为了学习一堆流行的但是却毫无关联的工具。我们是在学习一系列由业务驱动、由技术工具支持的技能。

好了,废话不多说,我们开始吧!

虚拟化入门

还记得物理服务器吗?就是那些你需要等待数周才能获得订单审批,发货,被数据中心接收,上架,网络调试,安装好系统并打好补丁的那些。

想象一下,如果想拥有住所,唯一的方法就是建造一座新的房子。需要居住的地方?那么你只能等到房子建好之后。现实中每个人都有房子,但也不是真的拥有,因为建房子需要耗费很长的时间。在这个类比中,物理服务器就像一座房子。

然后人们开始恼火于这些事耗费了他们太长时间,于是乎一些聪明的人就提出了虚拟化的想法:在一台物理机器上运行一堆虚拟的“机器”,让每台机器都假装自己是一台真实的机器。很聪明的想法是吧!

所以,如果你真的想要一座房子,你可以自己建造并等待一段时间。或者,你也可以选择住在公寓里,与其他租户共享资源。也许不是特别好但已足够满足需求,最重要的是,完全无需等待!

这种情况持续了一段时间,很多公司(例如VMWare)在这上面赚了很大一笔钱。

直到其他某些人认为,将一堆虚拟机塞进物理机器中还不够好,他们需要将 更多 进程 更紧凑 地打包到 更少 的资源中。

从这个需求点来说,房子跟公寓都太贵了。如果我只需要暂时租用一个房间呢?我可以随时搬进搬出,是不是很神奇!

实际上,这就是Docker。

Docker的诞生

Docker很新,但它背后的思想已经有很长历史。在2000年,FreeBSD这个操作系统就已经有了 Jails 的概念!的确,很多新的东西都是基于旧的思想来演进的。

那时与现在的想法都是想在同一操作系统中隔离单个进程,即所谓的“操作系统级虚拟化”。

注意:这与“完全虚拟化”不同,后者是在同一物理主机上并行运行虚拟机。

这在实践中意味着什么?

在实践中,这意味着Docker的流行正好巧妙地反映了微服务的兴起,微服务是一种软件工程方法,将软件分解为许多单独的组件。

而这些组件需要一个“家”。单独部署独立的Java应用程序或二进制可执行文件是一件很痛苦的事:你管理Java、C++与Golang应用程序的方式都各不相同。

相反,Docker提供一个简单管理界面,允许软件工程师以一致的方式打包,部署和运行各种应用程序。

这是一个巨大的利好消息!下面我们将谈谈Docker的好处。

Docker的好处

进程隔离

Docker允许每个服务都具有完全的进程隔离。服务A跟B都单独存在于自己的一个具备所有依赖关系的小容器中,两者之间不再存在冲突!

此外,如果一个容器崩溃,只有该容器受到影响。其余的容器(应该)还能继续运行。

这同时有利于安全。如果容器被泄露,那么通过该容器并破解宿主操作系统是非常困难的(但并非不可能)。

最后,如果容器行为不当(如消耗太多CPU或内存),则可以仅将影响范围限制到该容器,而不会影响系统的其余部分。

部署

回顾下在实践中如何构建各种应用程序。

如果它是一个Python应用程序,它将有一大堆各种Python依赖包。一些将作为pip模块安装,还有一些是rpm或deb软件包,其他的则是通过简单的 git clone 安装。如果使用 virtualenv ,它将是 virtualenv 目录中所有依赖项的一个zip文件。

另一方面,如果它是一个Java应用程序,它会使用gradle构建,将其所有依赖拉取并放到适当的目录上。

你明白了吧。这些使用不同语言和不同运行时构建的应用程序,当将它们部署到生产环境时将是一项挑战。

那么我们怎样才能满足所有的依赖关系呢?

另外,如果存在冲突,问题将会更严重。如果服务A依赖于v1版本的库但服务B依赖于v2版本的库怎么办?因为存在冲突,v1和v2都不能在同一台机器上共存。

再次回到Docker

Docker不仅允许完全进程隔离,还允许完全 依赖隔离 。在同一操作系统上并排运行多个容器是完全可能且常见的,每个容器都有自己的和冲突的库和包。

运行时管理

我们管理不同应用程序的方式因应用程序而异。Java的日志不同,启动方式不同,监控方式与Python不同。Python与Golang等其他的也不相同。

通过使用Docker,我们获得了一个统一的管理界面,允许我们启动,监控,集中日志,停止和重启许多不同类型的应用程序。

这是一个巨大的胜利,它极大地减少了运行生产系统的操作开销。

深入Lambda

虽然Docker很棒,但它也有缺点。

首先,运行Docker仍是在运行服务器。服务器很脆弱。必须对它们进行管理,修补和其他方面的保护。

其次,没有人真的只用Docker来运行Docker(有点绕)。相反,它几乎总是作为一些复杂的容器编排架构的一部分进行部署,例如Kubernetes,ECS,docker-swarm或Nomad。这些是相当复杂的平台,需要专职人员来运维(后面将详细介绍这些解决方案)。

但是,如果我是开发人员,我只想编写代码并让别人替我运行。Docker,Kubernetes和所有诸如此类都不是简单易学的东西。我真的需要学习这些吗?!

简而言之,这要看情况而定!

对于那些只想让他人去运行代码的人来说, AWS Lambda (以及其他类似的解决方案)就是解决方案:

AWS Lambda允许你在不配置或管理服务器的情况下运行代码。你只需为你消耗的计算时间付费,当代码未运行时不收取任何费用。

如果你听说过“无服务器”,那么它就是了!你不再需要运行服务器或管理容器。你只需编写代码,将其打包成zip文件,上传到AWS,接下来那些头痛的东西让别人替你解决!

而且,由于Lambda是短暂运行的,所以几乎无从破解。从设计上来讲,Lambda非常安全。

很好,但需要注意以下几项:

首先,Lambdas最多只能运行15分钟(截至2018年11月)。这意味着长时间运行的进程(如Kafka消费者或数据处理程序)无法在Lambda中运行。

其次,Lambdas是功能即服务,这意味着你的应用程序必须完全分解为微服务,并与其他复杂的PaaS服务(如 AWS Step Functions )结合使用。不是所有企业都处于这种微服务架构的水平。

第三,在Lambda上排障很困难。因为它们是云原生运行的,所有错误修复都发生在AWS的生态系统中。这通常具有挑战性,而且很不直观。

简而言之,世上没有免费的午餐。

注意:现在也出现了“无服务器”云容器解决方案。 AWS Fargate 就是其中之一。不过我们可以暂时忽略它们,因为这些往往比较昂贵并且需谨慎使用。

总结

Docker和Lambda是两种最流行的现代云原生方法,用于打包,运行和管理生产应用程序。

它们通常是互补的,每种都适用于略有不同的用例和应用。

无论如何,一个现代化的DevOps工程师必须精通两者。因此,学习Docker和Lambda是很好的短期和中期目标。

注意:到目前为止,在我们的系列中,我们已经处理了初级到中级DevOps工程师应该知道的主题。在后续章节中,我们将开始讨论更适合中级到高级DevOps工程师的技术。但是请记住,通向成功的道路没有捷径可寻,必须靠不断的实践!

原文链接: How To Become a DevOps Engineer In Six Months or Less, Part 4: Package (翻译:fengxsong)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK