当前位置: > 主机 > 云容器的虚拟化和迁移技术,什么是基于容器的虚拟化

云容器的虚拟化和迁移技术,什么是基于容器的虚拟化

云容器的虚拟化和迁移技术

什么是容器环境中基于容器的虚拟化?它需要首先安装主机操作系统容器层(与LXC或libcontainer相比),然后安装主机操作系统(通过Linux变体)。安装容器层系统后,计算资源被分配给容器实例和企业应用程序部署容器。每个容器应用程序共享相同的操作系统(单主机操作系统)。与虚拟机容器相比,它具有更高的资源利用效率。

什么是基于容器的虚拟化

对于容器环境,首先需要安装主机操作系统,然后需要在主机操作系统(通常是Linux变体)上安装容器层(例如LXC或libcontainer) 安装容器层后,可以从系统的可用计算资源中分配容器实例,并且可以在容器中部署企业应用程序 然而,尽管容器技术和虚拟化技术各有不同,云计算的基石是虚拟化技术 从观察的角度来看,虚拟化技术和容器技术分别代表了两个不同的方向。虚拟化技术从上到下看,而容器技术从下到上看。 由于Docker的原因,马克·舒托沃尔斯在十多年前就启动了Ubuntu inux项目,现在他负责提供Ubuntu支持服务的Canonical公司的战略和用户体验。 他认为新一轮服务器虚拟化不同于前一轮。 在他的指导下,像其他Linux组织一样,在其发布版本中,交换可以在广泛的环境中进行虚拟化,但是为了在虚拟化容器之间迁移交换实例,微软增加了一个特殊的支持指南。 在交换服务器2003 SP2之前,交换未经认证,不能在虚拟化环境中运行 微软交换只为虚拟交换版本提供技术支持 容器技术作为一种全新的应用部署方式,在短时间内受到了广泛关注,但这种技术也有一定的局限性,与虚拟机有本质的不同。 虚拟化技术改变了现代计算方法,可以提高系统资源使用效率,消除应用程序,

什么是基于容器的虚拟化

什么是容器环境中基于容器的虚拟化?它需要首先安装主机操作系统容器层(与LXC或libcontainer相比),然后安装主机操作系统(通过Linux变体)。安装容器层系统后,计算资源被分配给容器实例和企业应用程序部署容器。每个容器应用程序共享相同的操作系统(单主机操作系统)。与虚拟机容器相比,它具有更高的资源利用效率。

什么是基于容器的虚拟化

云容器的虚拟化和迁移技术范文

本文的目录导航:

[标题]探索云存储容器的动态迁移技术??
[第1章]云环境中容器动态迁移技术研究简介
[第2章]云容器虚拟化和迁移技术
[第3章]基于最小迁移量的迁移算法优化
[第4章]基于预拷贝的迁移算法优化
[第5章]云容器动态迁移原型系统的设计与实现
[第6章]云数据动态迁移技术的结论与参考

第二章 容器的虚拟化和迁移技术2.1 云计算技术
20世纪以来,随着人们对计算能力的巨大需求,云计算技术迅猛发展。云计算就是把计算资源定义为基础IT设施,用户可以根据自己的需要去购买这些计算资源,是分布式计算、并行计算和网格计算发展到一定程度的产物。云计算概念的落地则是通过一个庞大的高性能服务器集群组成的数据中心来实现。对于这么庞大的数据中心,需要有很多的平台和系统去充分利用好这些计算资源,从而衍生出了很多像Hadoop、Spark这样的基础架构和计算平台。
Spark技术在Hadoop技术的基础之上做了很多改进。
Hadoop技术有三个核心组件,分别是HDFS、YARN和Map Reduce.
HDFS是一种分布式的文件系统,它很好的把数据分割成一个或多个块,存储在服务器集群的各个节点上。
YARN是一个集群管理和调度软件,负责运行用户提交的应用程序。
Map Reduce定义了集群上数据处理的基本操作,它把原始数据进行批量操作之后,转换成另一批数据。对于量非常大的数据来说,其内部算法可以很快的处理这些数据,并返回结果。
而随着Spark这类云平台技术的逐渐成熟,越来越多的相关技术被重视起来,Docker容器技术就是代表性的技术之一。用户发布的应用程序很大概率上会依托特定的运行环境,如果应用发布到其他环境中,很有可能运行失败。
Docker容器技术则可以把应用程序和环境打包成容器在云平台上运行,这可以极大的提高开发和运维的效率。
2.2 容器虚拟化技术
容器技术就是一种应用容器引擎,用户可以选择打包他们的任务和相关的依赖到一个可迁移的容器中,然后发布到用户的服务器集群上,就可以实现轻量级部署。例如Docker容器,其采用的是沙箱[22]的模式,容器与容器之间是处于隔离状态的,其通信由容器的守护进程去完成。所以启动一个容器是非常迅速的,可以很方便的部署在物理服务器集群之中。另外,他们不依赖于系统,虽然Linux容器发展的更为成熟,Windows容器也开始利用用户基础开始流行。
Docker容器是Linux容器的一种具体的实现,它完美的解决传统虚拟化的太过重量级的缺陷,使得部署更灵活。
2.2.1 传统虚拟技术
虚拟化是一种来源已久的方法,从根本上来说,是从实际的物理资源利用效率较低的情况出发,从逻辑的角度来对物理资源进行了重新的分配。是对实际物理资源的一种逻辑上[23]的抽象。而从用户的角度出发,虚拟化技术可以分离软件跟硬件,而这一切对用户是透明的。
用户不用关心虚拟化的具体实现,而只需在虚拟出来的环境中运行自己的计算任务。当这些计算任务在执行的时候,看起来是和物理机上跑任务的效果相同,因为这种虚拟大多是操作系统级别的虚拟化,看起来跟真机无异。
VM是虚拟化技术[24]的具体实现。此外,为了管理虚拟机,必需设置一个VMM.VMM的作用是为每个虚拟机分配一部分内存空间来存储它们的状态数据。比如虚拟处理器的寄存器信息,内存的使用百分比数据[25],虚拟设备的状态等等。
VMM调度虚拟机时,会把其中一部分的状态数据存储到主机系统中。主机处理器直接运行虚拟操作系统的机器指令。虚拟化技术在很多层面都有应用,例如服务器虚拟化、存储虚拟化、网络虚拟化[26],其中,服务器虚拟化与常用的云平台架构关系最为密切。传统的虚拟架构如图2.1所示。
图2.1展示传统的虚拟技术架构。服务器一般指代物理的机器架构。可以是个人的电脑,也可以是数据中心的服务器,或是云中心的主机这类基础设施。在服务器之上搭载的是主机的操作系统,也是配套的操作系统,一般云服务器集群采用的是Linux操作系统。再往上则是虚拟机管理系统,负责对不同的虚拟机的管理。
服务器虚拟化根据虚拟机管理系统的功能不同,分为三种,完全虚拟化、半虚拟化和操作系统层虚拟化。这三种虚拟化方式的代表性产品分别是KVM、Hyper-V和VM Workstation.
(1)完全虚拟化这种级别的虚拟化一般是通过虚拟机管理系统建立一个抽象层,并把这一层插在在虚拟机和底层的硬件之间。虚拟机管理系统得到指令之后,把这些指令传送到物理硬件中。这种虚拟化技术的最大优点是覆盖性比较强,基本上可以在VM中运行各种各样的操作系统,并且运行的效果与在真机上没有太大差别。但是它的缺点也比较明显,完全的虚拟,会导致启动速度慢,虚拟机管理系统的运行花费会比较大。
(2)半虚拟化半虚拟化的应用场景也很普遍,因为完全虚拟化技术是非常耗时的技术,虚拟机管理系统的运行开销很大,它必须不停管理物理机上运行的虚拟机,且保持虚拟机之间的独立性。
为了减轻这种花销,可以从虚拟机操作系统的角度出发,让它知道自己处于虚拟环境中,然后与虚拟机管理系统相互协作。这种方式就是半虚拟化技术。它的优势就是性能较完全虚拟化技术要高。在准虚拟化处理之后,虚拟机可以和虚拟机管理系统一起工作,其响应能力在较快的时候,可以和物理机保持在同一水平。
(3)操作系统层虚拟化最后,还有一种虚拟化的方法,就是在操作系统层面进行优化。就操作系统层的虚拟化而言,不再让虚拟机管理系统层[27]
去管理每一个虚拟机,而是直接让主机的操作系统为多个虚拟机分配所有资源,并且保证这些虚拟机的独立性。也就是说,这种情况下的虚拟机依托于宿机的操作系统,所有的虚拟机的操作系统必须和宿机的操作系统保持一致。虽然在这种设计的情况下,操作系统层的虚拟化会丧失灵活性,但虚拟机的性能会提高不少。所以,操作系统层的虚拟化所针对的场景更适合目前的云计算大数据平台。因为数据中心一般都会采用同一种系统,例如Linux系统,所以这种虚拟方式反而更好管理。容器化技术就是这种类型的虚拟化实现。
2.2.2 容器化技术
早在20世纪70年代,UNIX chroot就衍生出了容器技术的概念。UNIXchroot是一套“UNIX操作系统”,它的设计初衷是把root目录和其它子目录放到文件系统内的其他地方,并且保证只有特殊的一些进程可以访问到这些地方。这是容器化的最初形态,已经可以保证为每一个进程提供一片独立的磁盘空间。
发展到2008年,第一套完整的LXC管理实现方案被研究出来。LXC[28]作为操作系统层面的虚拟化技术,它的目的就是在Linux物理主机上分割出隔离性Linux环境。与传统的虚拟机不同,容器共享同一套主机操作系统[29]内核,同时利用虚拟操作系统的依赖库来完成相应的功能。因为不必虚拟出操作系统,容器在启动速度比虚拟机要快的多。
2013年,Docker容器开始流行。到目前为止,Docker依然是最为完善的容器管理系统。与其它容器平台不同,Docker有很多的相关开源项目,Docker社区正在不断的完善之中。其中包括一套高效的分层式容器镜像模型、一套全局及本地容器注册表、一个精简化REST API以及一套命令行界面等等。在后期发展阶段,还提出了一套名为Docker Swarm的容器集群[30]
管理解决方案。容器技术架构(以Docker为例)如图2.2所示:
可以从图2.2看出,和传统的虚拟化技术相比,容器不再从宿主机中虚拟化不同的级别的操作系统,而是让所有的容器共享宿主机的的操作系统内核。另外可以看到,容器技术不再采用之前的虚拟机管理系统,而是采用相应的容器守护进程。例如在Docker中,采用的就是Docker社区开发的守护进程,它是一种在后台运行的进程,在容器整个生命周期中都会负责对容器的管理。对于Docker,应用的所有依赖都打包在镜像中,容器是基于镜像[31]
创建的应用。应用的源代码与它的依赖都打包在镜像中,不同的应用需要不同的镜像。守护进程可以直接与主操作系统进行通信,为各个容器分配资源。它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而容器可以在秒级启动。由于没有繁琐的虚拟机操作系统,可以节省大量的资源花销。
下面以Docker为例,简单阐述容器技术的各个模块。总的来说,Docker容器技术分为4个重要组成部分,客户端和守护进程、镜像、容器和仓库。
(1)客户端和守护进程在现代的容器技术中,都会有客户端的概念。不管是用命令行的方式,或是一个视图界面,都是为了方便用户发送一些请求,对容器做一些操作。例如Docker社区的Kubernets和Docker UI[32],都会有客户端,方便监控和操作容器。
如图2.3所示,在Docker中,REST风格的客户端会与守护进程进行通信。客户端负责发送容器命令,而守护进程负责接收命令。守护进程执行命令后会返回相应的处理信息。另外,Docker客户端可以选择去连接本地或者远程的守护进程。
(2)镜像镜像是容器的先决条件,容器是在镜像的基础上运行的。与面向对象的设计相似,一个镜像相当于一个类文件,而若干个容器可以理解为类的若干实例。根据类才能生成对象。类只有一个,而实例可以有多个。镜像是一个层叠的只读文件系统。容器则是在其上增加的自己的存储层。镜像可以从公共仓库中拉取,也可以自己制作。利用Dockerfile等[33]制作镜像时,相当于在原始镜像上,添加了一些进程操作。
(3)容器容器是镜像中一条条指令运行之后的实体。镜像是把应用的对应指令构建和打包成一个文件,容器则是对这些指令的启动和执行后运行的进程。容器的规模一般较小,一个物理服务器可以生成上千个容器,它生命周期较短,一般运行细粒度很小的应用。每一个容器都是相互隔离的,而容期间的通信则由守护进程保证。
(4)仓库Docker社区完善了容器的体系,提供了公共仓库,方便用户拉取需要的镜像。
Docker根据镜像不同的类别提出仓库的概念,同一类镜像放在同一个仓库。此外,每个仓库中,根据版本或是构建时间等条件分成不同标签的镜像。用户也可以选择从公共库拉取,也可以建立自己的私有仓库。仓库和本地服务器的关系如图2.4所示:
2.3 容器迁移技术
目前,随着云计算产业的飞速发展,以及容器化的进一步推广,容器的迁移技术越来越受到人们的重视,尤其是容器的动态迁移,更是跟企业的服务质量息息相关。如果容器的动态迁移能够做到实时化,稳定化,那么这将是一个重大的突破。因为容器的灵活性是建立在自身高性能的特性上的,如果迁移的方式不够优秀,则会破坏容器的高性能优势,如何平衡性能和用户体验这两点,是研究的重点。静态迁移的优点就是非常简单,不需要耗费太多资源,而动态迁移所需考虑的东西则较多。在介绍动态迁移之前,首先简单介绍一些容器的静态迁移。
2.3.1 容器的静态迁移
容器的静态迁移就是在迁移的时候,立即停止当前的容器服务,并把当前的容器从源服务器迁移到目标服务器中。在静态迁移的概念里,容器的迁移实际上就是容器的备份和恢复两个过程的组合。静态迁移还细分为有状态迁移和无状态迁移。
有状态迁移和无状态迁移[34]的最大区别是迁移哪一个部分的容器。上一小节已经描述过了容器和镜像的关系和区别,容器是在镜像的基础上有一层自己的存储层,也可以称为用户层。无状态迁移是放弃对存储层的迁移,直接选择迁移原始的镜像文件,而有状态迁移则会把当前的容器直接执行备份操作,打包成一个新的镜像,再传到目标服务器。当然,无论是有状态,还是无状态,其本质都是把镜像文件传到目标服务器之后,重新启动该容器。而传送的方式可以上传公共仓库,或者线下保存,再拷贝到目标服务器。如图2.5所示:
静态迁移在大多数容器中是支持的很好的,比如Docker容器,可以用简单的命令去完成相应的操作,另外,因为直接关闭容器应用,不需要考虑用户的服务体验,传送的方式就可以用比较直接的方式,比如Linux的远程拷贝命令等等。静态迁移最大的弊病,就是在对用户服务质量要求比较高的云环境中,无法保证实时的迁移。
2.3.2 容器的动态迁移
容器的动态迁移则要智能的多,要求也要更高一点。所谓的动态迁移,就是尽量让用户察觉不到服务的停止,即减少宕机时间为目的,同时保证迁移所花费的资源较少。容器的拷贝实际上是一种进程级别的拷贝,其拷贝的内容主要包括容器的用户内存,对应的文件系统和状态数据。容器动态迁移的应用场景很多,主要分为硬件升级场景和负载均衡场景[35].
企业进行容器化服务器的升级,或者调换了云设备服务商时,此时需要大量的容器迁移操作。如果选择停止服务,在半夜活动人群较少的时段进行升级,需要调配资源。即使提升人力进行迁移,也需要耗费很多资源去操作,把成千上万的容器迁移到备用集群中。即使写脚本去控制迁移,也会花费大量的时间,所以停止服务的方式很不合适。
在负载均衡的场景也需要动态迁移,此时跟硬件升级完全不一样,负载均衡对实时性的要求极高,不可能通过静态迁移的方式,必须让服务器集群实时去判断负载均衡率,然后去触发容器的迁移动作,让集群重新回到均衡的状态。这也是研究的一个重点。
动态迁移的研究点主要分为两个方面,一个是容器的调度问题,尽可能选择最合适的一批容器去进行迁移,避免一个容器出现多次迁移的情况,减少不必要的迁移次数。同时选择一批合适的服务器集合,作为容器迁移的目标主机。另一方面就是容器从源服务器到目标服务器进行迁移的算法策略研究。第一个方面的研究较少,一般在实际的企业环境中采用给服务器打分的方式,然后轮询选择。第二个方面,在企业运营实际中,通常采用的是CRIU工具。下面分别介绍这两个研究点的迁移思路。
(1)容器调度如图2.6所示,在容器调度的过程中,分为两个步骤。第一个步骤是选择出一批需要迁移的容器,第二个步骤是确定容器迁移的目标服务器。在源服务器中,要对容器的一些信息做采集,分析出哪些容器需要被迁移。然后对剩余的服务器的状态数据做监控,用一些算法去挑选出最合适的那个候选服务器,作为最终容器迁移的目标服务器。
第一个步骤是研究的重点,因为如何选择一批需要迁移的容器,会影响到最终的效率。
如果一个容器在将来的一段时间,CPU占有量等会减小,此时把它迁移出去是没有必要的。
这部分内容会在第三章中做详细的描述。第二个步骤通常采用的是轮询法,或是以轮询为基准做的变种的方法。
(a)轮询的方式轮询的方式是最简单直接的方式。首先,收集剩余所有服务器的状态数据,根据每个服务器的CPU,内存,带宽占有量,计算负载情况,给这些候选服务器做排序。然后对于每一个待迁移容器,每次选择负载最小的那个服务器作为目标服务器。注意,对于同一个源服务器中的一批待迁移容器,采用的不是同一个负载数据。这样的方式为了及时更新负载数据,防止同一批次容器都迁移到了同一个目标服务器。
在服务器集群规模不大时,这样的做法是可以应付的。但是当集群规模达到一定的规模时,并发性的问题会凸显出来。同一时刻,会有多个不同服务器中的容器选择到了同一个目标服务器,简单的轮询方式会导致集群的稳定性较差。
(b)轮询为基准的变种方法基于大规模集群中,轮询方式产生的问题,很多变种的方法被提出。常用的解决方法是采用概率的方式[36]
来随机选择。在候选服务器已经做了排序之后,再根据容器的内存要求,筛选出符合迁移条件的一组服务器。根据一个概率算法的公式,得到选中的目标服务器。假设筛选出来的有k个服务器,则第i个服务器被选中的概率可由公式2.1计算:
2.7所示,CRIU主要分为冻结状态和恢复状态两大步骤。在冻结状态时,会先根据进程和其对应的子进程的关系,形成一个树形结构,然后当前的进程会被冻结。接下来进程所涉及到资源会被收集并存储下来,收集的代码会被视为废弃代码并删除分离。在恢复状态时,需要先读取相关的资源文件并恢复在冻结状态中收集的进程树。对于Docker容器来说,需要搭建必要的命名空间。最后激活整个进程,让容器重新运行起来。
2.4 本章小结
本章主要讲解了容器的虚拟化技术以及动态迁移的机制。首先阐述了容器技术的来源,容器技术是在系统级别对传统虚拟技术的一种改进。然后以Docker为例,详细解释了容器的工作原理。最后,通过对容器调度方式和CRIU迁移步骤的分析,阐释了容器迁移的一些技术背景。