如今,虚拟化技术在数据中心内已经生根发芽,应用非常普及,无论是在服务器、还是网络、存储等设备中都是如此。虚拟化技术起源于服务器,后来在网络设备中也出现,虽然都叫虚拟化技术,但是实现的原理是完全不同的,网络设备中的虚拟化也不能像服务器中的虚拟化可以虚拟化出数百或上千的虚拟设备,实现的技术也完全不同。本文着重讲述的是服务器中的虚拟化技术。服务器是数据中心最为重要的组成部分,所有的应用服务都要安装在服务器上,并运行,所以服务器上的虚拟化技术与应用最为密切相关。从早年的虚拟机技术到如今的容器技术,都是虚拟化技术的典型代表。
虚拟机技术,很多人可能都不陌生。不少人自己也在PC上安装过虚拟机,这也是实现虚拟化的一个实践。虚拟机技术可以分为两大类:硬件虚拟化技术和指令集虚拟化技术,硬件虚拟化技术的典型代表是VMware、Xen等,指令集虚拟化技术的典型代表时Qemu、Boch等。虚拟机技术在数据中心早已深入人心,在数据中心也已普及应用多年,正是应用普遍,可以衍生出了不少细分技术,俨然已经成为数据中心虚拟化技术的重要代表之一。通过虚拟机技术,可以在一台物理服务器上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如可以安装操作系统、安装应用程序、访问网络资源等等。对于使用者而言,它只是运行在你物理计算机上的一个应用程序,但是对于在虚拟机中运行的应用程序而言,它就像是在真正的计算机中进行工作。因此,当在虚拟机中进行软件评测时,可能系统一样会崩溃,但是,崩溃的只是虚拟机上的操作系统,而不是物理计算机上的操作系统,并且使用虚拟机的恢复功能,可以马上恢复虚拟机到安装软件之前的状态。
容器技术是通过虚拟化操作系统的方式来管理代码和应用程序,是在2013年才开始出现并迅速兴起的一种虚拟化技术,容器技术主要是由一些技术型创新企业设计开发的,比如: BlueData、CoreOS、Docker、Kismatic、PortWorx等等,其中最为出名的要属Docker技术,Docker几乎成为了容器技术的代表。容器技术是让你可以将更多的计算工作负载塞入到单单一台服务器上,并且让你可以在一瞬间为新的计算任务提高增加容量。从理论上来说,这意味着你可以购买较少的硬件,自建或租赁较少的数据中心场地,并且雇用较少的人手来管理这些设备。每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。为了能达到这种效果,容器技术使用了一系列的系统级别的机制诸如利用Linux namespaces来进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件,通过cgroups来确定每个容器可以利用多少资源。此外容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。
虚拟机和容器两大技术,从描述上看目的都是虚拟化,但是技术热点和实现方式则完全不同。虚拟机提供了专用操作系统的安全性和更牢固的逻辑边界。如果是虚拟机,虚拟机管理程序与硬件对话,就如同虚拟机的操作系统和应用程序构成了一个单独的物理机。虚拟机中的操作系统可以完全不同于主机的操作系统。而容器具有轻量级特性,所需的内存空间较少,提供非常快的启动速度,创建容器的速度比虚拟机要快得多,那是由于虚拟机必须从存储系统检索10GB至20GB的操作系统。容器中的工作负载使用主机服务器的操作系统内核,避免了这一步,容器可以在二十分之一秒内启动完毕。拥有这么快的速度让开发团队可以激活项目代码,以不同的方式测试代码,或者在其网站上推出额外的电子商务容量――这一切都非常快。虚拟机和容器都具有高度可移植性,但方式不一样。就虚拟机而言,可以在运行同一虚拟机管理程序(通常是VMware的ESX、微软的Hyper-V或者开源Zen或KVM)的多个系统之间进行移植。而容器不需要虚拟机管理程序,因为它与某个版本的操作系统绑定在一起。但是容器中的应用程序可以移到任何地方,只要那里有一份该操作系统的副本。容器技术使得应用程序以标准方式进行了格式化,之后才放到容器中。开发人员可以使用同样的工具和工作流程,不管目标操作系统是什么。一旦在容器中,每种类型的应用程序都以同样的方式在网络上移动。这样一来,容器酷似虚拟机,它们又是程序包文件,可以通过互联网或内部网络来移动。当然,容器技术没有虚拟机技术那么成熟。虚拟机是一项高度发展、非常成熟的技术,事实证明可以运行在最关键的业务工作负载。容器技术也开始在谷歌、阿里等互联网公司中得到应用推广,随着技术的成熟与稳定,大有取代虚拟机技术之势。当然不能忽略的是,容器技术也面临着一些未解决的问题。比如:安全问题,相邻的容器共享处理器、内存和磁盘等资源,这种行为让安全专业人员深为担忧。容器技术在一个计算机上只能运行一个应用程序,限制了应用程序的处理规模。所以容器是值得使用的技术,不过要谨慎使用,需深思熟虑,而不是贸然行动。
在数据中心的虚拟化进程中,到底采用虚拟机还是容器?这最终还是取决于你的需求。如果你只是希望将应用运行的实例进行隔离,那么对于管理应用运行环境、启动应用实例以及控制资源 开销方面容器将是一个极为高效的工具。如果你从服务器虚拟化的角度来寻找最好的环境隔离方案,那么系统级的虚拟化是更好的方案:和容器相比,邻居租户对系统的影响在虚拟化的方案下将不是一个问题。尽管现在很多容器都在专注于提高其隔离能力,但是虚拟机的隔离还是要优于容器。从物理服务器过渡到虚拟服务器是一个很自然的过程,并且现在针对虚拟服务器的管理的生态系统也很完善。当然两者并不是对立的,我们可以在一个容器中运行一个虚拟机,也可以在一个虚拟机中运行一个容器,还可以在一个虚拟机中运行多个容器,两种技术走向融合,这样才能让两种虚拟化技术在数据中心里发挥更大的作用。