一、从操作系统对硬件的虚拟化到容器对应用程序的虚拟化
虚拟化将经典的三层架构(硬件、操作系统、应用程序)都虚拟化了一遍。
1、操作系统对硬件的虚拟化
在没有虚拟化之前,或者说在虚拟化这个概念还没有为众人熟知之前,我们的操作系统(Windows、Linux)充当了管理硬件的功能并将硬件资源提供给所需要的应用程序所使用。从今天虚拟化的角度来看,这个操作系统本身就是一个虚拟化的系统,该操作系统将硬件本身的调用接口抽象出来,在自己的抽象中将设备模拟成一个设备上下文,当应用程序需要使用硬件资源的时候,操作系统就将这个设备上下文提供给应用程序。这里的设备上下文,何尝又不是一个虚拟化呢?都是对一个硬件设备的抽象。因此我们可以说,虚拟化技术从哪里来,从最开始诞生操作系统的时候,虚拟化就诞生了。
如下图,最开始的时候,我们的操作系统(这里的论述只基于X86/X64架构)提供给每一个应用程序的硬件资源都是完整的,也就是说从应用程序本身的角色看,应用程序是完全使用该硬件资源的。但是从操作系统的角度看,操作系统是将硬件进行抽象,然后分时分段的将应用程序所使用硬件资源切分出来,由操作系统来定义和分配这些任务逐步的使用该硬件资源来完成应用程序的需求。因此从虚拟化的角度,这个操作系统充当一个虚拟层,上对应用程序提供一个硬件的虚拟化抽象,下对接硬件的调用接口。
这种模式下的计算机体系以及基于这种架构开发的应用程序组成完美的经典组合,开启一个基于个人PC机以及X86服务器的黄金时代。
随着企业规模、信息化程度、硬件服务器的摩尔定律更新以及上述架构体系的瓶颈,学术界和产业界急需寻找一种新的体系架构用于替代现有架构体系,完全利用现有硬件资源、同时提升企业信息化、成本、运维等方面的效率。
上述所说仅就硬件来说,在上述的计算机体系架构下,企业一般一个业务系统部署一台服务器,大部分是时间服务器硬件的资源都是出于闲置状态,如何更好的利用硬件资源,是产业界和学术界一直在思考的问题:既保证资源的完全利用又保障资源的有效隔离?
一个萝卜一个坑,任何事物的发展和诞生不可能凭空而来。新生事物以及新生架构的诞生,必须是依据前人实践的基础之上。不然就是无源之水,无本之木,即会陷于过度幻想,不切实际。但是过度依赖现有体系,又会偏于保守,缺乏创新。我们综观hypervisor现有的这种虚拟化,就会发现此为真理。基于hypervisor虚拟化发展到今天这么成熟的地步,都是经过多年的实践以及积累而成的。
2、hypervisor对操作系统的虚拟化
因此基于现有架构以及体系:上述操作系统的架构体系以及IBM已有的硬硬分区、软分区等虚拟化技术。大胆假设 小心求证。采用将整个操作系统以及其上的应用程序都封装起来,然后将其看作一个整体,类似于传统架构下的应用程序,只不过这个应用程序比较厚重,然后在开发出另外的一款操作系统用以调度这个“厚应用程序”以实现服务器硬件的资源充分利用和资源的有效隔离。(备注:由于X86架构的自身原因,无法像IBM Power架构一样可以使用类似硬分区等虚拟化技术)。因此现有的这种hypervisor虚拟化就出现了。我们仔细想想,它和传统操作系统的区别是什么?看下图:
从整体上来看,还是基本的三层架构。只不过在应用层,我们包含或者说抓取了更多的东西,将整个操作系统都全部抽象出来了。只不过这个比较厚重的应用程序,我们再称呼为传统意义上的应用程序就不行了,换个称呼:虚拟机。这种架构模式下,我们不必花费大量精力去改造原来体系的系统以及应用程序,只需平滑移植到新的平台即可。这个时候没应用程序什么事,关键点都在操作系统与虚拟化层hypervisor之间做文章。经过hypervisor虚拟化发展的这些阶段:全虚拟化、半虚拟化和硬件辅助虚拟化逐渐趋于稳定和成熟。不管是操作系统还是hypervisor,最主要的虚拟主体都是我们的硬件CPU、内存和IO。在操作系统层面,是通过操作系统对硬件进行抽象创建一个设备上下文来实现,而在hypervisor中,仅仅一个设备上下文是无法满足需求的。Hypervisor需要提供给操作系统一个硬件设备,而这个硬件设备是Hypervisor去抽象真实的物理硬件设备提供的。将这些CPU、内存以及IO设备提供给虚拟机的过程,就是Hypervisor虚拟化,和传统意义上的操作系统对硬件的虚拟化是有所区别的。这些实现的技术可以分为CPU的全虚拟化、半虚拟化和硬件辅助虚拟化,内存的全虚拟化、半虚拟化和硬件辅助虚拟化以及IO设备的全虚拟化、半虚拟化和硬件辅助虚拟化。这些技术大家都可以通过网络查到对这些技术具体的实现细节的描述文档。
这种基于hypervisor虚拟化的技术很好的满足了我们之前所说的最原始的需求:资源的有效整合和有效隔离,而且具备更多很好的特性。因此围绕这种新的体系或者架构,建立起了一系列的生态。这个时候我们就进入了一个虚拟机的时代。虚拟机是一个很好的封装,将传统的操作系统和硬件解耦,IT的架构因而达到了前所未有的灵活性。
3、容器对应用程序的虚拟化
不管是操作系统的时代还是虚拟机的时代,都跟应用程序没有多大的关系,至少不是很直接的关系。无论是传统的操作系统还是虚拟机,应用程序都必须和操作系统进行绑定。虚拟机只是将硬件和操作系统进行了解耦,而更加上层的应用程序还是和操作系统有硬绑定关系。但是操作系统和应用程序本身又是独立的,只有在应用程序需要运行时才会使用到和操作系统的绑定关系(运行环境)。因为应用程序和操作系统的这种硬绑定关系,我们在虚拟化时代,保护和使用应用程序,只能按照使用虚拟机的方式去进行。也就是说,企业最终使用的是应用程序而不是操作系统,我们本质上是需要迁移、保护应用程序,因为硬绑定关系使得我们不得不将虚拟机也一起进行迁移、保护。有了容器之后,就将操作系统和应用程序之间的关系进行解耦,将应用程序以及所需的运行环境封装在一个容器中。可以使得应用程序也可以和虚拟机一样,灵活的进行使用和迁移。有了更小化的封住之后,容器也需要向虚拟机一样进行高可用、在线迁移、容灾以及编排等功能的操作。因此我们可以看到,围绕虚拟机的一系列技术,例如网络、迁移、容灾等都需要在容器上重新开发一遍。
容器使得我们开始逐渐远离过去那种面向各个应用程序实例的纯手动、硬编码式实例操作方式——正如我们当初摆脱由单一服务器负责单一操作带来的绑定关系一样。当下令容器拥有如此吸引力的主要趋势之一在于,它们已经不再像十年前那样仅在利基空间中挣扎求存,而是朝着可移植、非状态性应用程序实例进行大规模转变。操作系统所扮演的角色仍然非常关键;现在我们需要使用一套标准化基础镜像来承载自己的全部应用程序,而不再以标准基础镜像为模板针对每款应用作出具体调整。
在这里如果我们将虚拟机比作公共汽车,那么容器就是私人汽车,私人汽车比公共汽车更加灵活,更加方便,因为服务的对象最终是人,就虚拟机和容器来说,最终服务的对象是应用程序,因此通过容器来使用应用程序就如同使用私人汽车,自然比公共汽车更加便利。在现实生活中,公共汽车的作用毋庸置疑不可代替,公共汽车和私人汽车的组合,方是现在出行交通的最佳组合。因此从近期的趋势来看,虚拟机和容器将是共生共存的关系。
二、软件定义重新布局企业IT格局
操作系统将硬件进行了虚拟化,Hypervisor将操作系统进行了虚拟化,容器将应用程序进行了虚拟化,这些虚拟化的发展,将硬件、操作系统、应用程序进行了纯粹的解耦。
解耦之后的操作系统作为一个独立的实体,可以到处运行,完全不在依赖于硬件的能力以及驱动。后面的应用程序也是类似,只不过容器技术才刚刚开始,现在使用的这些容器很有可能只是最初级的,以后还会诞生更多更好的技术来支持容器拥有和虚拟机一样的能力。作为解耦的核心,hypervisor和Container两个组件围绕自身周围,建立起了一系列生态。就和当初操作系统一样,首先操作系统本身就经历过一轮群雄争霸的戏码,到最后Windows以及Linux系统笑道最后。而围绕hypervisor建立的所谓管理层或管理系统,VMware、AWS、Azure和GCE现在看来暂时领先,OpenStack作为最晚出生的小儿子,蹦跳的最为厉害。我们看到其实还是出于群雄争锋阶段,而这个时候容器技术又兴起,LXC,Docker,rkt,LXD,runC各有拥蹇,鹿死谁手,还真不好说,在这个局还没明朗的候,Mesos、Swarm、Kubernetes、Nomad 又出来一堆搅局的,眼下看来最吸引眼球的 Kubernetes 很有hypervisor生态中 OpenStack 角色的感觉,但OpenStack反倒觉得是自己的机会,俨然要做跨界的混合管理平台。这方在这里你方唱罢我登台,卖力吆喝私有云、公有云的时候,中小玩家和硬件厂家只能在旁边看着干吞口水,着急呀!
这个时候软件定义网络SDN逐渐的流行起来,软件定义的概念让这些中小玩家以及硬件厂家看见了希望。软件定义思想最早源于上世纪90年代中期,当时为了推动网络的创新,计划在一个简单的网络硬件数据通路上编程,即所谓的动态网络。但由于未能解决在一个通用的硬件底层与一个开放的上层编程环境之间划定一个界限,而导致这一思想未能得到实施。随着hypervisor虚拟化技术的出现,硬件与软件的分离问题得到了初步解决。软件定义的真正目的是软硬件解耦,解放软件模块的生产力。通过虚拟化技术,我们已经初步达成了这个目标,因此,那些敢看着私有云、公有云市场的中小玩家和硬件厂家既然无法插入这个市场,那就打开另外一个市场。利用软件定义的概念和借助现有开源的趋势,炒作软件定义的概念。什么软件定义网络(SDN)、软件定义存储(SDS)、软件定义数据中心等等不一而足。
这些中小玩家和硬件厂商终于可以借助软件定义的概念,师出有名,包括VMware、IBM、惠普、EMC、思科、华为等行业巨头都纷纷各自的软件定义解决方案,不但如此,中下游小玩家也各种软件定义,并且还玩出了点名堂。上至应用,下至硬件都又各种各样的软件定义产品:比如号称软件定义的芯片:现场可编程门阵列FPGA。FPGA,将软硬解耦,用户自行开发逻辑,可现场更换逻辑,只不过现在还做不到热更换逻辑,还需要进行重启操作。在最高层面上,FPGA是可重新编程的硅芯片。使用预建的逻辑块和可重新编程布线资源,用户无需再使用电路试验板或烙铁,就能配置这些芯片来实现自定义硬件功能。用户在软件中开发数字计算任务,并将它们编译成配置文件或比特流,其中包含元器件相互连接的信息。此外,FPGA可完全可重配置,当用户在重新编译不同的电路配置时,能够当即呈现全新的特性。过去,只有熟知数字硬件设计的工程师懂得使用FPGA技术。而且,高层次设计工具的兴起正在改变FPGA编程的方式,其中的新兴技术能够将图形化程序框图、甚至是C代码转换成数字硬件电路。
FPGA仅仅是一个小的例子,在这个领域收获最大的无疑是Nutanix超融合厂商,其所谓的软件定义存储,利用虚拟化软件和超微的x86服务器或其他任何商业或白牌X86服务器,并搭配自己开发的存储软件堆栈,在这些服务器的本地磁盘之间存放持久性数据,并将这些数据进行联合,实现在这些服务器之间进行流动来提供存储服务。其提出的超融合概念,也是基于软件定义的基础,将硬件进行重构,模块化设计,将计算和存储进行整合,利用虚拟化和软件定义存储以及硬件的重构实现计算、网络以及存储的融合池化,通过软件来定义资源的配置和使用。
软件定义如果真正的做到,其实好处多多。如果厂家对自己的产品实现软硬解耦,将软硬件平台化、模块化、标准化。那么我们可以想象一下,工厂里面的流水线,我们的软件硬件开发是不是就可以拆分,独立开发和优化,而且模块之间还可以进行复用,动态组合包装成各中不同类型的产品,而且维护的时候,只需要进行模块的维护。就Nutanix来说,Nutanix将硬件重构或者模块化,将服务器的硬件整体性的分为主板模块和磁盘模块,当我们的主机出现故障的时候,我们只需要更换相对应的主板模块或者磁盘模块即可,并且由于是软件定义的,硬件本身不会留存和配置任何文件或者参数,只需执行软件主服务下发的相关配置文件即可。这样我们对于硬件的维护上,和传统的IT架构一比,简直不可同日而语。
软件定义也因此,对于硬件厂家以及中小企业来说,无异于云计算时代的救命稻草。我们可以看到,各种硬件厂家不断推出的一体化设备、超融合设备等等都是进行软硬件解耦,同时在硬件上,有些硬件厂家还专门进行了一些“硬件加速”设置,以保障自家的硬件搭配软件能够取得更高的性能,取胜于市场。中小起企业玩家的硬件加速卡,白牌X86设备外加开源软件,套一层壳就开始推出市场,借助软件定义大旗,师出有名。也因此,现在各种白牌硬件厂商的服务器,逐渐的出现在市场上,而老牌的Dell、HP等服务器厂商的标准商用服务器份额也逐步下降。但是这只是低端市场,如果依靠软件定义的大旗,最终获利的还是那些老牌的硬件厂家。这些中下游的企业在逐渐的洗牌过程中,很容易的就被洗掉了。
现在国内很多的企业喊出了软件定义未来、软件定义一切等等口号,软件古人可以定义一切,但是软件在强大还是需要硬件平台的支撑。因此软件定义要想平坦则必要从硬件做起,如果软件定义了我们的未来,那么硬件也将决定软件定义的健康!