从容器和Kubernetes技术看现代云计算的发展轨迹

【编者的话】本文选自 Google Cloud Platform Blog,是一个主要介绍容器技术的系列博客的开篇。文中通过对容器技术和kubernetes的大致介绍,阐述了容器技术的优势以及Google对于容器技术的理解。基于单台服务器的容器虚拟化技术可以为测试和部署提供方便,但是在生产环境中,客户往往面对的是整个集群的资源。Google的kubernetes产品为容器的集群化部署和管理提供了解决方案,kubernetes从另一个角度对资源进行了抽象,把每一个服务当作一个整体来对待。作者认为容器技术仅仅是当前计算模型演变的一个开端,而Google将会在这场新的技术革命中扮演重要的角色。

在接下来的几周,我们将会发布一个新的系列博客,在这个系列中,我们想阐述Google对于容器技术的一些观点,此外我们还会和读者分享Google在过去十年间,在容器中运行服务的一些经验。我们是一支由Google的产品经理、一线技术员以及架构师组成的团队,团队共同的目标是要帮助读者了解“容器技术革命”如何能更有效的构建和运行服务。这次我们邀请了“Google 云平台全球解决方案”的专家Miles Ward来做分享,作为这一系列博客的开篇。

各位好!欢迎来到我们新的系列博客,在这个系列中,我们将要为大家介绍当今计算模型创新中最时髦的领域之一:容器化技术(containerization)。

你可能会有很多疑惑:容器到底是什么,它究竟怎样工作?Docker、Kubernetes到底指的是什么,Google Container Engine以及Managed VM又有什么用?它们之间有何关联,我们如何通过容器来构建一个功能强大的服务,并且能让它们在生产环境的大规模集群中使用? 用户采用这种技术,怎样才能获得商业价值?好了,我们不再卖关子,接下来就直入主题。我们首先会对容器技术进行具体的介绍,之后讲述容器技术究竟如何使我们更好地进行工作。

随着计算模型(computing models)的不断发展衍化,我们曾经经历过几次计算模型解决方案的转变。回顾在过去的10年,我们从虚拟化技术的角度可以很清楚看到这种变化的过程。受益于虚拟化技术的发展,我们对整体资源的使用效率有了巨大的提升,与此同时,我们工作的时间价值和为了交付服务所做的重复性工作得到了相应减少。随着多租户、基于API的管理以及公有云计算技术的到来,这一趋势更是被不断加强。这其中,最关键的突破就是资源使用方式所发生的变化。通过虚拟化的方式,我们可以在几分钟之内,虚拟出一个小的、独立的、随需随用CPU内核,这个虚拟的CPU内核感觉像是直接运行在物理机之外。那么问题来了,当你仅仅需要使用一小部分资源的时候,是否还有必要虚拟出一整台机器?

Google在很早的时候就已经遇到了这个问题:我们需要更快、更便宜的方式发布软件,并且支撑服务运行所需要的计算资源的规模也是以前从未有过的,那么这一问题应该如何解决?为了满足这一需求,我们需要对已有资源进行更高级别的抽象,使得服务可以通过更细的粒度对资源进行控制。为此,我们为Linux内核添加了新的技术,这便是众所周知的cgroup,我们通过这一技术来对服务运行时的环境进行隔离,这种被隔离起来的运行时的环境就被称为容器。这是一种新的虚拟化技术,通过这一技术,我们简化了Google全部服务运行所需要的底层OS环境。之后的几年一直到现在,容器相关的技术不断发展,随着Docker的出现,这一技术的影响得到了进一步扩大,Docker也正是通过使用这一技术为基于容器的应用创建了一种可互操作的格式(interoperable format)。

为何使用容器?

容器技术究竟提供了哪些虚拟机所没有的?
简化部署(Simple deployment):容器技术可以将你的应用打包成单一地址访问的、registry存储的(registry-stored)、仅通过一行命令就可以部署完成的组件。不论你想将服务部署在哪里,容器都可以从根本上简化你的服务部署工作。

快速可用(Rapid availability):容器技术对操作系统的资源进行再次抽象,而并非对整个物理机资源进行虚拟化,通过这种方式,打包好的服务可以在1/20秒的时间内启动,相比之下,可能需要一分钟的时间才能启动一台虚拟机。

微服务化(Leverage microservices):容器可以允许开发者和系统管理人员对计算资源进行进一步细分,如果一个小型的虚拟机所提供的资源相对于服务运行所需要的资源来说过于庞大,或者对于你的系统而言,一次性地扩展出一台虚拟机会需要很多的工作量,那么容器可能会很好的改善这一状况。

容器技术的这些优点能为你的工作带来哪些帮助?
最明显的一个方面就是:开发者只需要通过他们的笔记本电脑就能同时运行多个容器,并进行方便快速的服务部署。虽然在一台笔记本电脑上运行多个虚拟机也是可以的,但是显然通过容器的方式可以更快速、简单、轻量级。

不仅如此,容器还可以使得服务发行版的管理变得更加容易,发布一个新的容器版本仅仅需要一个单独的命令就能完成。同时,测试工作也变得更加容易,在公有云平台中,虚拟机的计费方式可能至少以10分钟为单位(或者,一整个小时?),如果仅运行单个测试程序,测试所消耗的资源可能并不多。但是,如果你每天要运行上千个测试驱动导向的程序,资源成本就可能直线上升。如果改用容器进行同样的测试工作,你只需要用同样的资源消耗(与使用一台虚拟机相同的资源消耗)来完成这上千个测试,这将会大大节省你的服务运行成本。

另外一个重要的优势就是组合特性,采用容器的方式进行部署,整个系统会变得易于组合,特别是对于那些需要使用到开源软件的系统。对于系统管理人员,以下的工作可能会使人望而却步:安装和配置MySQL、Memcached、MongoDB、Hadoop、GlusterFS、RabbitMQ、Node.js、Nginx等等,之后再将这些软件封装起来,为服务提供一个运行平台。然而,这些复杂的工作完全可以通过启动几个容器来完成:先将这些服务封装在对应的容器中,之后结合一些脚本使这些容器按照要求相互协作,这样操作不仅可以简化部署难度还可以降低操作风险。

如果你想按照前面所描述的过程构建一个服务平台,可能会有许多容易出错的地方,整个配制过程也需要具备很专业的知识, 中间可能还会有许多重复的劳动。因此,我们可以先将核心的容器组件以规范的方式来实现,之后将它们添加在公共的registry服务中。这样其他用户就可以通过registry服务随时获得所需要的容器,拥有高质量组件的容器生态系统就这样被构建起来。

在相当长的一段时间内,容器技术最重要的价值就是为不同主机上的运行服务提供一个轻便的、一致的格式。例如,如果你今天要构建一个服务,你可能先要接入裸机服务器,并且使用虚拟化之后的预先定义好的基础设施,或者直接使用共有或者私有的云服务平台,当然也有许多PaaS提供商可以供你选择。然而,你为了使自己的服务能够运行在不同的服务平台上,可能需要通过多种不通的方式对服务进行打包!而如果通过容器格式进行标准化操作,这些不同的计算模型的提供商们就可以给用户提供一种独特的交付体验,这就允许用户方便地对工作负载地进行迁移,用户可以选择将工作任务部署在最便宜和最快的平台上,避免局限于单一的平台提供商。

Docker

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7a0d052da91e02ec590364a25cf781ca.html