Linux虚拟化与容器化

来源:互联网 发布:java身份证号判断性别 编辑:程序博客网 时间:2024/06/08 00:51

虚拟化

随着云计算的不断发展,计算资源不断集中于大规模的服务器集群上。为了充分发挥硬件潜力,提高服务器性能,虚拟化技术由此诞生。

所谓虚拟化技术,是指将计算元件和硬件隔离开来,隐藏底层的硬件物理特性,为用户提供抽象、统一的模拟计算环境,从而可以适应庞大的硬件资源而不至于浪费性能。如Intel-VT和AMD-V技术可以单CPU模拟多CPU运行,允许同一平台同时运行多个操作系统,且应用程序和服务在相互独立的空间内运行而不影响,从而尽可能的压榨硬件性能并提高工作效率。
虚拟化级别可分为:硬件抽象层、指令集层、操作系统层、基础运行库层、应用程序层。

  • 指令集层:使用类似代码解释的方法实现不同平台计算资源的通用,但是效率极低,如Bochs,可以实现Unix like系统中模拟X86平台(指令集、I/O、内存、BIOS等等),例如在Android上运行Windows。
  • 硬件抽象层:将底层硬件虚拟化,如VMware ESXi,Windows Hyper-V,Xen,Linux KVM等,可以使同一硬件平台上运行多个不同的操作系统;又可分为全虚拟化和半虚拟化(下文详解)。目前I/O和内存的虚拟化较为成熟,CPU方面由于指令集在设计时未考虑到特权指令(hypervisor)和非特权指令(用户)区分的原因(主要是X86)会造成性能下降,因此开发出了Intel-VT等CPU虚拟化技术(硬件辅助虚拟化),但是性能仍然会受到影响。
  • 操作系统层:在操作系统层面为多个用户或应用创建不同的容器或实例,分别拥有自己的进程、文件系统、IP、用户、命名空间等,但是仍然共享一个操作系统。例如Docker一类的容器和各种VPS、VE。相对硬件虚拟化,操作系统层级的虚拟化解决了:物理机器和虚拟机实例数可以动态改变;初始化虚拟机几乎不消耗时间;几乎没有硬件性能损失,不需要额外资源开销等问题。但是只能使用Linux系统,在资源隔离级别和资源管理上较为简单。非常适合云计算环境。
  • 运行库层:由于大部分应用调用的是用户级别的API而不是系统级别,因此可以通过API钩子控制应用程序和其他系统部分之间的连接;例如使用WINE在Unix like系统上运行Win32程序。
  • 应用程序层:将应用程序虚拟化为一个虚拟机,如早期的JVM(现在的JVM加入了即时编译功能)。
实现级别 性能 灵活性 实现复杂度 资源隔离级别 指令集层 1 5 3 3 硬件抽象层 5 3 1 4 操作系统层 5 2 3 2 运行库层 3 2 4 2 应用程序层 2 2 1 5

现在国内的云计算服务主要采用的是KVM(腾讯云)和Xen(阿里云,正在向KVM迁移),主要是由于VMware和Windows Hyper-V是收费的并且不开源。于此同时,以Docker为代表的操作系统级别的虚拟化也火热了起来。

容器与Docker

顾名思义,容器就是装东西用的,比如我们都学过C++ STL的基本容器类型,在操作系统级别,容器就是操作系统为不同的用户或进程分配的具有一定相互独立空间(包括内存分页空间、CPU时钟分配、硬盘空间、进程空间、运行库等、IP地址)。Docker就是容器的一种,在早期版本使用的是Linux自带的LXC(Linux Container),现在使用的是libcontainer来实现。

使用Docker的时候,不同的容器可以部署不同的开发环境,运行不同的应用;由于开发环境和操作系统分离,Docker的可移植性非常高(Docker的宣传口号是 Build ,Ship ,and Run Any App ,Anywhere),在不同的服务器之间转移非常便捷。同时,官方和开发者也共同构建出了一个巨大的模板镜像库(被墙了,需要使用加速器访问),足够满足很多naive的需求。

进行虚拟化时,很重要的一部分工作就是计算资源的分配和不同虚拟机/容器之间的通讯,在创建Docker镜像时,不仅可以显示地为每个镜像分配资源,同时还会根据分配的比例不同确定各自的权重,从而可以在系统负荷高的时候保证权重高的镜像不会被权重低的镜像阻塞,在负荷低的时候,权重低的镜像也能得到足够的资源应对突发的压力。弹性的分配机制保证了硬件的最大利用效率。

要注意的一点是,有的云服务提供商会进行限制(如阿里云),由于其本身就已经是进行了硬件层级的虚拟化,因此在虚拟机上再次进行操作系统级的虚拟化通常是不被允许的;所以Docker的用户通常是云服务提供商以及自身拥有一定规模服务器的企业或个人

原创粉丝点击