容器云的关键理论和方法研究
上QQ阅读APP看书,第一时间看更新

1.2 从容器到容器云

随着云计算的发展,为满足云计算更加方便快捷的需求,逐渐形成了使用容器技术替代原有的虚拟机(Virtual Machine,VM)方式的虚拟化技术。容器云是轻量级虚拟化技术,而Docker技术是现有容器技术中的主流技术,它可以快速地部署容器云,并且使容器云平台快速地扩展,加快Docker容器在物理资源之间的迁移速度,提高运行期间的资源利用率。

1.2.1 容器技术

轻量级虚拟化技术的出现给传统的主机虚拟化技术带来巨大的挑战,而作为轻量级虚拟化技术的代表,容器技术为云计算的发展做出了巨大的贡献。虽然容器技术与虚拟机技术都是将硬件配置与应用程序进行隔离[6],从而构建一种随处运行的虚拟环境,在这种环境下应用程序好像感知不到硬件的存在,提升了资源利用效率和成本效益。但是不同点在于虚拟机技术需要将操作系统、虚拟硬件、用户空间集成到一个虚拟机中,通过特定的管理程序的配置,虚拟机才能在物理设备上运行。虚拟机依赖Hypervisor层将自身与物理机关联,也就是说可以将Hypervisor层理解为一种变相的操作系统,只有通过安装Hypervisor层的硬件才能为虚拟机分配实体物理机上的可用资源[7]

容器技术的特色在于不用运行一个完整的操作系统,而是对物理主机上的资源进行更加抽象的隔离,使其对于外部而言只是一个相对独立的运行环境。由系统级别降低到进程级别,凸显了容器的优秀之处[8]。与传统虚拟机相比,容器对资源的使用需求大量减少,提升了资源的利用效率。因此,在相同的物理环境与硬件配置的基础上,容器可以运行的实例数量会多于虚拟机的实例数量[9]。容器在虚拟化的量级上由操作系统级别降低到了进程级别,这使得启动过程中的速度由分钟级降低到毫秒级[10]。在部署方式上,容器可通过单一地址访问、镜像(Image)存储的方式简化部署方式,仅需要一些简单的部署命令即可完成应用的部署:先将不同的应用封装到不同的容器实例中,再通过组合方式在目标系统中对应用进行组合,可提升系统的解耦合性,减少操作中出现的问题。表1.2为容器技术与主机虚拟化技术的特点对比。

表1.2 容器技术与主机虚拟化技术的特点对比

容器技术可以将运行组件与应用程序打包到一起,使其运行在一个进程中,并且这个进程具有资源隔离的特性。在应用程序配置完成后,还可以将容器打包成一个可以复用的镜像文件。在运行容器的过程中,为保证容器内的进程具有独立性,容器不会共享任务和物理资源。容器的具体结构如图1.1所示。

图1.1 容器结构

Linux Container(LXC)、Rocker、OpenVZ、Docker都推出了由各自的工作团队提出的容器技术[11],其中,Docker是被开发工作者普遍接受的,并得到了广泛应用。

容器和虚拟机的主要区别如下:

一是容器与容器之间只是进程的隔离,而虚拟机是完全的资源隔离;

二是虚拟机的启动是分钟级,而容器的启动是秒级甚至更短;

三是容器使用宿主操作系统的内核,而虚拟机使用完全独立的内核;

四是容器的局限性之一是要运行在64位的操作系统上,而虚拟机还可以运行在其他位数的操作系统上。

1.2.2 Docker是什么

Docker是一个开源的应用容器引擎,可以让开发者将他们的应用以及依赖包打包到一个可移植的容器中,然后发布到流行的Linux机器或Windows机器上,也可以实现虚拟化。Docker的容器完全使用沙盒机制,相互之间不会有任何接口。

Docker中的容器是资源分割和调度的基本单位,可以封装整个服务的运行环境,是用于构建、发布和运行分布式应用的一个框架。Docker是一个跨平台、可移植并且简单易用的容器解决方案。Docker的开发工作团队是Docker公司(原dotCloud公司),Docker使用Go语言作为编写语言,并且遵循Apache2.0协议。

Docker可以快速地将应用程序部署到容器中。在资源隔离与安全防护方面,Docker采用Linux内核的控制组(Control Groups,cgroups)和内核对象命名空间(Kernel Object Namespace)资源隔离技术进行资源隔离,使用OverlayFs联合文件系统作为文件的安全保护方式[12]。Docker在最初开发时采用LXC对容器进行操作与控制,但Linux的命名空间支持对应用程序操作环境的隔离功能(如进程、网络、文件挂载等),内核的cgroups提供了对CPU、内存、I/O、网络资源的限制功能,更加迎合Docker的设计,因此在Docker0.9的后续版本中,使用Libcontainer库实现对Namespace、cgroups、文件系统管理的资源管控。Docker总体架构如图1.2所示。

图1.2 Docker的总体架构

Docker技术之所以能够被广大研发人员接受,是因为其具有以下优点[13]

一是高效的利用率。容器的轻量级虚拟化方式使Docker能够共享操作系统。作为进程级别的虚拟化技术,Docker在运行中使用更少的资源,并且启动时无需加载其他系统软件,因而Docker具有更高的资源利用率。

二是跨平台。Docker官方对其部署与应用提供了标准化的配置,使用镜像的方式对应用程序与依赖环境进行打包,打包完成后可以将其发布到任何装有Docker环境的机器上运行,不用担心版本与配置环境出现不兼容问题,具有建立一次、处处运行的特点。

三是镜像仓库。Docker官方建立了一个镜像仓库——Docker Hub,以方便所有对Docker感兴趣的人在上面进行交流。用户可以使用Docker官方发布的镜像,也可以在上面共享自己建立的镜像。

四是快捷。Docker能够快速地启动与部署,并且由于Docker实例的大小是MB级别,降低了应用的开销。

五是操作方便。Docker提供了RestAPI,便于开发者进行调用。

在面向应用的层级上,应用程序的环境配置、开发和运行在虚拟机上具有资源消耗大、启动慢、分布式应用伸缩不及时等缺点;容器技术在应用层面对资源分配进一步细粒度化,通过将应用程序完整的运行环境(包括全部依赖库、环境配置等)封装成一个通用的基础镜像,将应用本身构建于基础镜像之上,只需将镜像以容器方式运行即可,而且启动时间是秒级的,为高并发、高弹性的应用提供了很好的解决方案。其中,Docker技术成为容器技术的代名词,进一步促进了容器技术的推广和发展。

Docker是容器化技术的具体技术实现之一。从容器的本质说,容器以进程的方式运行在操作系统上,并在该进程访问资源时对资源进行隔离和限制。基于容器的设计思想,Docker是在LXC[14]技术基础上实现的核心管理引擎。Docker主要采用以下3种关键技术对资源进行隔离和限制。

(一)命名空间

命名空间[15]用来对进程树、进程之间的通信、挂载点、网络接口以及文件系统资源进行隔离,在Linux内核中对每个Namespace占用的全局资源加以控制,相同Namespace内的进程之间是可见的,反之是透明的,以保证运行在同一台机器上的多种服务之间相互不受影响。目前Linux提供6种命名空间类型,通过这6种命名空间类型设置新创建的进程在哪些资源上与其他进程进行隔离。表1.3给出了Linux内核提供的6种命名空间类型。

表1.3 Linux内核提供的6种命名空间类型

(二)控制组

控制组[16]是实现容器技术的另一个重要工具,同样也是由Linux内核提供支持,用来对进程组的资源进行限制和统计,以及控制进程对物理硬件资源(CPU、内存、网络、I/O、存储等)的访问。cgroups通过内核给程序附加hooks实现对资源的控制(当程序请求资源时,会触发相应的hooks)。控制组可以避免一些耗费资源的应用程序(如进行密集型任务的计算)占用大量的物理资源,进而影响其他容器的性能。

(三)分层式镜像文件技术

Docker设计了分层式的镜像文件格式。这种文件格式由最上层的读写层与多个只读层联合而成。Docker通过联合文件系统(Union File System,UnionFS[17])挂载方式成为只能在容器内被构成的文件系统,当用户进行文件操作时,Docker会将所有操作保留在读写层,不对只读层的镜像再次编写。用户在个性化定制自己的镜像时,可以在原有镜像的基础上直接提交自己的镜像,也可以在原有镜像上用DockerFile进行编写。这种分层的文件存储方式提高了镜像的重用性与拓展性,在进行版本迭代时减少了文件的冗余,保障了整个系统的稳定。常见的存储驱动有aufs、devicemapper以及overlay2等,其中overlay2是Docker:18.x版本默认使用的存储驱动方式。

1.2.3 Docker的发展历程

Docker正式诞生于2013年,并在之后的几年时间里得到快速发展。

2014年,Docker公司发布了容器集群管理项目Swarm,使得容器化技术名声大噪。

在Docker大红大紫的时候,Fig项目应运而生。Fig用于对Docker容器的编排,将Docker命令实现的定义、配置、创建以及容器的启动结构化,并用类似编码的形式逻辑化,从而将容器之间的关系更清晰地表达出来。后来Fig项目被Docker公司收购,并被改名成Compose。

在Docker占据容器领域的巨大份额的时候,2014年6月,基于Google内部强大的Borg系统开发的Kubernetes横空出世,刷新了人们对容器的理解。

2015年,Oracle调用接口(Oracle Call Interface,OCI)标准被提出,容器运行时和镜像的实现从Docker项目中分割出来,使得其他容器技术不需要依赖Docker项目就可以构建自己的容器平台。

2016年,在人们认识到容器技术本身的价值在于容器编排的时候,Docker公司却放弃了Swarm项目,想将容器的编排和集群的管理功能添加到Docker项目中。Kubernetes与Docker不同的是它推进了民主化架构,通过暴露Kubernetes API的方法,吸引更多的人不断丰富Kubernetes的插件。

2017年,Docker公司由于自己的决策性失误放弃了开源社区,并向商业化转型。而Docker公司也将容器运行时捐赠给了云原生计算基金会(Cloud Native Computing Foundation,CNCF),并将Docker改名为Moby。

1.2.4 Docker与容器

随着互联网时代的到来,人们对效率越发敏感,任何事情都在向追寻高效、快捷、可靠的需求迈进。同样,云计算领域对此格外关注,如何改变传统的应用搭建与交付的方式是业内人士关注的重点。对此,最新提出的Docker技术迅速吸引了众多开发者的目光,也为云计算领域带来突破式的进展[18]。快捷是Docker的主要优点,Docker的启动速度可以达到秒级甚至毫秒级,而传统虚拟机却远远达不到。当有多个任务期望在同一台服务器上运行时,传统的方法是将一台服务器分成多个虚拟机,同时对虚拟机进行操作,并在各个虚拟机中运行相应的程序[19]。但是这样做的主要问题在于启动速度非常慢,虚拟机的启动速度是分钟级别的,它需要一定的时间去启动整个操作系统。

启动一个操作系统实例需要占用大量资源,甚至耗费几分钟的时间。Docker容器技术虽然也提供和虚拟机相似的功能与技术,但是它的启动速度却很快,这是因为Docker使用了基于轻量级的LXC,所以它的启动速度可以达到毫秒级。容器技术优化了运行方式,使容器的启动就像系统启动一个应用进程一般快。同时,Docker在系统资源利用率方面具有极大的突破,同一台服务器上允许同时运行成千个Docker容器。这是因为容器除了运行其中的应用之外,几乎不消耗其他附加的系统资源,具有应用性能高、开销小的优势。

Docker作为当前云计算环境中最具前沿性的技术,它的优势让许多开发者投身其中。Docker对应用程序运行过程中的环境底层设置极具抽象化,使程序开发、维护人员无需担忧运行环境方面的问题,如版本兼容、环境配置等问题。

容器技术的诞生标志着软件开发、测试、交付、部署有了新的定义,这使得开发人员只需要关注服务的性能和效率,无需关注网络、存储空间、CPU等物理资源的管理与配置[20]。因此,将Docker作为平台搭建的主要技术是开发领域的研发重点。容器云技术具有以下优点。

(一)应用程序的额外冗余环境较小,资源利用率得到提高

容器技术被广泛认可并将项目落地的主要原因在于其优秀的资源利用率。不同于传统虚拟机需要建立资源监视层Hyper,容器技术使虚拟化的层次提升了一个级别:由原来需要通过运行操作系统执行任务到现在直接运行任务。也就是说,容器技术不用像虚拟机技术那样在运行虚拟环境时加载整个系统,只需要加载特定的环境与应用,减少了额外的环境,并且在运行应用程序时,在每一台物理机上可以构建的容器实例数目在很大程度上多于虚拟机的数目,这意味着可在服务器上运行的任务量增加了。

(二)镜像所占磁盘空间减少,带宽需求降低,部署效率提升

使用容器技术搭建的容器云平台支持运行和开发由多种不同的编程语言编写的程序,因为其可以根据不同的应用建立不同依赖环境的容器镜像。此外可以通过镜像仓库共享相对通用的基础镜像,从而开发灵活的应用程序。因为容器不同于虚拟机,每个运行的应用程序都不需要完整的操作系统,所以用来存储应用程序镜像的硬盘空间减少,节省了磁盘空间[21]。同样,更小的镜像意味着在部署应用服务时通过网络进行跨主机传输镜像时所需的时间大大减少,从而降低了带宽部署成本。

(三)集群规模弹性伸缩更便捷,可有效地节约物理资源

容器云平台可更好地支持弹性服务,其允许在短时间(一般是毫秒级别)内进行容器的启动、运行、重启、销毁操作,可以根据用户需求进行动态申请与释放资源。这使得在运行应用的过程中,容器可以根据应用对资源需求的变化进行动态增减。容器云平台尤其适用于容易出现需求峰值的服务,当出现需求峰值时,可通过水平拓展方式启动大量的容器以满足需求,而当峰值过后,可以快速关闭空闲容器,重新调整负载情况,这大大降低了资源计算成本。

(四)数据备份更加方便,数据迁移更容易

容器技术通过存储卷的方式进行数据与日志文件的持久化处理,在启动容器时,会把数据卷挂载到容器中,所有数据卷的读写操作直接在宿主机的文件系统上执行,不受存储驱动管理。由于容器中的任务是进程级别的,因此需进行迁移备份的数据减少,容器的数据备份与迁移过程更加方便快捷。

1.2.5 容器云的发展

2013年,Docker横空出世,在短短的3年里,容器技术从幕后走到了台前,迅速成长为云计算相关领域中不可忽视的一颗“明星”。Docker的诞生标志着云计算领域迈入新的阶段[22]。它使容器技术从理论研究阶段转向实际应用阶段。Docker问世后,一种新的云计算服务模式——容器即服务(Container as a Service,CaaS)诞生了。这种软件交付模式可以为用户重新构建软件的开发与交付过程,可以大大缩短云端的交付周期,降低了开发商的运营门槛。云计算平台的服务模式如图1.3所示。

图1.3 云计算平台的服务模式

CaaS与PaaS的相似之处在于它们都是介于IaaS与SaaS之间的服务模式,都能够为软件开发人员提供服务。但是PaaS本身具有局限性,在设定PaaS的时候由于技术原因,为了能够屏蔽硬件,对硬件进行整体包装,需要通过定义标准来抽象底层资源,这造成开发人员不能灵活地设计软件,进而导致用户体验不友好。而CaaS的优势在于操作的灵活程度更大,它引入了快速迭代这一模式,拓展了开发者的自由度,解决了PaaS结构化平台固有的问题。也就是说,CaaS再次定义了PaaS。

Docker[23]最大的贡献是使容器技术从理论研究阶段转向商业阶段。理论研究商业化的理念最早在1979年被用在Unix系统的chroot中,并被作为根目录的切换功能,对系统起到一定的隔离作用,但是由于隔离性有限,没有具体的推广价值,因此只是提出了一种容器理念。

2000年,FreeBCD将chroot进行了拓展,FreeBCD Jails将进程封装,并加入了文件系统与网络空间等功能,从而形成一个虚拟的运行环境。

2007年,在Linux内核中加入Namespace和cgroups。

2008年,LXC开源项目建立。

2011年,VMware通过在Cloud Foundry上使用warden来解决其搭载PaaS应用问题。

2013年,Google研制了lmctfy,通过它对容器进行整体管理。

2013年,Docker面世。

Docker公司是Docker的开发设计公司,同时也经营PaaS平台[24]。它在LXC的基础上开发高级容器引擎,期望服务可以快速构建、交付,并且允许进行分布式操作。Docker问世不久就因为其多环境、方便迁移的特点迅速被众多大公司引进,这也促使容器技术蓬勃发展。容器云平台将容器作为最小的运行单元,使用容器来分配调度物理资源,在每个容器中集成运行时环境。用户通过该平台进行任务的搭建与交付。

作为一种更优质的资源虚拟化技术,容器技术自然会被业界广泛地认可和青睐,目前互联网公司(如Amazon、阿里巴巴、腾讯、微软、Google等公司)基于自身拥有的丰富的云资源,在云产品中都添加了容器服务。VMware、UCloud等IaaS提供商将容器技术作为其本身产品的补充与加强;PaaS厂商(如金山云、IBM等公司)则侧重于用容器技术重构其原本的PaaS,以提供更好的用户体验;CaaS服务商则将目光投至个人标准容器服务与企业容器定制化服务。随着容器技术的兴起,各大公司都采用各自的方式将其引入自己的环境中。

容器凭借其灵活、高效、快速的特点促使容器云快速发展,缓解了有限计算资源、有限扩展预算和应用需求激增之间的矛盾,使云计算的高弹性、高可用性、高利用率等特征更加显著。使用者借助容器云可以更高效地利用海量计算资源,从而弹性地进行业务扩展,充分满足用户平常时期与爆发时期的业务需求。

容器云具有大量密集部署、动态添加、迁移部署的特点,因此容器云可以有效地应对突发的访问事件。使用了Docker技术的容器云可以支持大多数运行环境,使用户能够方便快捷地将应用程序迁移到任意环境中,体现了其强大的兼容性。

容器云以容器虚拟化技术为核心。容器技术出现后,研究者发现虽然裸机、虚拟机、容器各有特点,但容器虚拟化技术带来的性能提升不可忽视。在同等规模的物理资源上,可以部署的容器化应用数量远远大于虚拟机化应用数量。容器技术在启动速度上远远超过虚拟机,迁移代价也十分微小。容器技术高效、灵活、轻量的特点使得容器任务的启动、运行、停止速度很快,容器镜像占用空间小、迁移传输快捷,有利于更好地实现高效利用资源、节约能源、快速应变、弹性收缩以及灵活计费等特性。容器技术将逐渐发展成虚拟化技术中的主导技术。

容器技术促进了“微服务(MicroServices)”和“无服务”架构平台的发展,也促进了容器云的产生。容器云随着Kubernetes的成熟及市场认可而占据重要地位。国内外各大公有云服务提供商纷纷在原来的虚拟机服务基础上推出容器云支持,如AWS、Google GCE、阿里云等。基于容器云的创业公司也出现爆发性增长,如时速云、道客云、青云等。一些开源的容器云解决方案也在不断更新和成长,如Google Kubernetes、Docker Swarm、Mesosphere等。