近日,Linux Journal上发布了一篇文章,“Containers—Not Virtual Machines—Are the Future Cloud”,引起了业内的广泛讨论。作者David Strauss是Pantheon公司(一家做Drupal PaaS服务的供应商)的CTO,他认为,VM的好处在于可以上下扩展,可控的计算资源,安全隔离,并可以通过API进行部署;但其缺点在于,每一台VM都消耗了一部分资源用于运转一个完整的操作系统。所以,另一种方式更适合一个云平台,就是Linux Containers。
Containers可以作为OS层面的虚拟化的一个替代方案,你可以在一个宿主机上运行多个隔离的系统。在单一的操作系统下运行container更加高效,因此,container将会替代VM,成为未来云计算基础架构中的主导技术。
Container并不是一项新鲜技术。根据2009年在IBMdW上的“LXC: Linux container tools”一文当中的介绍:
Container这项技术发展已久,Solaris Zones和BSD jails都是非Linux系统上的containers实现。Linux上的container技术也已经有很多实现,如Linux-Vserver,OpenVZ和FreeVPS。虽然以上这些技术都进入了成熟期,但他们都没有打入Linux内核的mainstream。
另一方面,由IBM开发者Daniel Lezcano研发并维护的Linux Resource Containers项目则通过大量努力进入了Linux内核的mainstream,从而为更加成熟的Linux container解决方案提供了一个公共的支持平台。
Oracle Technology Network上在2012~2013年间发布了一个系列文章,The Role of Oracle Solaris Zones and Linux Containers in a Virtualization Strategy,内容比较新一些。其中对Linux Containers是这样介绍的:
Linux Containers从根本上提供了原生的性能,你可以实时进行资源分配的管理。Linux Container当中运行的二进制程序实际上是直接在宿主机的内核上运行的一个普通的进程,跟其他进程没什么两样。这同时也意味着CPU和I/O的规划更加公平,而且可以进行微调。Container下拿到的磁盘I/O性能是系统虚拟化所无法比拟的(即使在Xen下使用paravirt模式也无法达到)。你可以在Linux Container当中运行磁盘I/O较重的应用,如数据库。
跟系统虚拟化和Oracle Solaris Zones不同的是,LXC无法运行其他非Linux系统。不过,你可以在同一个宿主机内核下的不同containers里面运行不同的Linux发行版。
这个名为lxc的项目是这样描述自己的:
lxc Linux Containers
container namespace cgroup virtualisation
LXC是针对Linux Containers的用户空间控制包。这是一个轻量级的系统虚拟化机制,有时被描述为“chroot on steroids”(类固醇上的chroot,意思是功能类似chroot,但比chroot提供了更多的隔离功能)
LXC基于chroot实现了完整了系统虚拟化,并在Linux现有的进程管理架构上添加了资源管理和隔离的机制。
lxc的实现为:
通过cgroup实现的“进程管理组”进行资源管理;
通过为clone(2)系统请求添加的flag实现资源隔离,可以为PID、网络路由等创建数种新的命名空间;
提供了数种不同的隔离机制,如devpts文件系统下可以使用“-o newinstance”的flag。#p#
LXC将上述Linux内核机制结合在一起,提供了一个用户空间层面的container对象——一个轻量级的虚拟系统,对系统、应用的资源有完全的隔离和掌控。
如果以上内容听起来比较难以理解,CodeBox提供了一个更容易理解的解释:
一般说来,VM是指全虚拟化/半虚拟化,即传统意义上的虚拟机,其机制是虚拟出硬件来,guest os跑在这些虚拟硬件上。
而container是在OS级别的资源隔离和命名空间,本质上guest和host是一个OS。container 是namespace+cgroup,有些公司仅仅用cgroup做资源的隔离,比如说:
你在一台机器上同时运行MySQL和Apache,你又怕他们相互影响,所以用cgroup就可以很方便地设定MySQL用40%的cpu和2G的内存,Apache用60%的cpu和1G的内存。就是所谓的资源隔离。
相比系统虚拟化技术,Container技术的优势在于省资源。然而在2005年,这项技术在安全隔离和资源隔离方面还无法满足需求。根据David的描述,当时的chroot是这样的:
“nice”模式下,赢者恒赢,弱者拿不到资源。“fair”模式下,内核又太平等,饥饿的非重要任务往往和饥饿的重要任务分到了一样的资源。内存和文件描述符(file descriptor)提供的功能太简陋,在正常运行和崩溃之间完全没有缓冲区。
而与此同时:
当时的Linux如果想把80%的CPU分给应用A,20%的CPU分给应用B,VM是唯一的解决方案。内存、磁盘I/O、网络I/O和其他可分配资源也是同样。而且,VM在效率上一直在提升,现在使用VM造成的CPU消耗只有很少的几个百分点。
但是即使如此,VM毕竟还是会造成资源消耗,而且还有较长的OS启动的等待时间。比如,256MB的内存运行一个应用是足够了,但由于OS跟应用抢资源,导致RackSpace不得不放弃了256MB内存的实例。使用VM部署一个新的应用,平均需要5~10分钟的等待时间。
如果用container,256MB的内存就够用了,而且部署新应用的等待时间只有5~15秒。
David还表示,containers将进入下一个红帽企业级Linux的大版本,即RHEL 7。
应用方面,目前在国外,Heroku和Cloud Foundry都用到了containers:Heroku上的一个dyno实际上就是一个container,而Cloud Foundry则专门开发了Warden用于containers的管理。
国内的阿里、腾讯、搜狐等,也都已经开始在内部使用container构建云平台,尤其是阿里与腾讯,使用规模已经不小。根据章文嵩博士的介绍,2011年底开始建设的、基于container的阿里T4云,截止到2012年底已经部署了200台左右的物理机,instance的规模达到了两千以上。2013年,阿里T4的instance规模已经达到了四千,正计划将T4的规模继续扩大到千台以上规模的物理机,并逐渐将核心的交易、商品业务迁移到该平台上。
腾讯方面,其开放云PaaS平台CEE现在已经达到2000多个container实例。