在《局域网SDN硬核技术内幕》的开篇中,我们提到过,在云资源池中,存在着很多很多的虚拟机。
利用虚拟机技术,可以将一台服务器进行切片,给不同的应用使用,也可以把几十个处理器核切片成多个同样的服务实例,并通过LVS、Nginx、HAProxy等负载均衡技术,让多个服务实例分担负载,实现充分利用处理器的多核心。
虚拟机技术的另一个应用是业务的快速部署。我们可以快速克隆虚拟机,在几分钟时间内创造一大批相同的虚拟机,实现业务的快速扩容。
因此,虚拟化技术在2008年以后飞速发展,以VMWare和CAS为代表的虚拟化平台市场迅速扩张。不夸张地说,虚拟化技术对于IT架构、开发、运维工程师们而言,是朝夕相伴触手可及的,像歌词中那样……
你是我朝夕相伴触手可及的虚拟
陪着我像纸笔像自己像雨滴
……
然而,虚拟化技术也有无法突破的局限。
我们发现,Tensorflow,GlusterFS,MAPR等大型分布式计算与存储框架,都是在物理机上应用的。
这是为什么呢?
让我们看一个例子:
这是VMWare WorkStation上,一个虚拟机的基本设置。
但实际上,这台虚拟机所在的宿主机,并没有以太网网卡和SCSI硬盘这两种硬件。可想而知地,这两种硬件是虚拟出来的。
以Linux系统读写文件为例,我们看看虚拟机与物理机对硬件操作的区别:
在物理服务器上,Linux系统读写文件的控制流和数据流如下图:
应用程序调用open等posix API访问文件,操作系统调用对文件所在的文件系统API,文件系统会调用块设备驱动接口。如果这个块设备是本地磁盘设备(如RAID卡连接的SAS硬盘),那么它将会把块设备驱动的读写命令转换为SCSI命令字,最后完成对磁盘的存取。而对远端FC存储设备则是调用FC HBA卡驱动,将块设备驱动读写命令转换为SCSI命令字,通过FC网络存取共享存储的LUN卷。
但是,当挂在了SCSI虚拟磁盘的Linux虚拟机读写一个文件时:
如图,当虚拟机读写虚拟磁盘时,实际上虚拟机操作系统会调用VMDK的驱动,并调用虚拟机的BIOS读写VMDK磁盘。
虚拟机的BIOS一方面向操作系统驱动完美模拟一个SCSI磁盘的行为,另一方面将所有的读写行为写入宿主机上的VMDK文件。这一过程是虚拟化平台调用Windows操作系统的文件API完成的。
事实上,这台宿主机安装的是一块NVMe的SSD盘,并没有任何SCSI盘的存在。可见,对于磁盘读写,虚拟机操作系统看到的实际上是一个假冒的磁盘。
再让我们打开这台Windows宿主机的网络设置。
我们看到,这台宿主机真正的网络适配器只有一个无线网络适配器。在安装了VMWare后,VMWare在操作系统中增加了两个虚拟网卡 VMNet1和VMNet8,它们会分别模拟一个交换机和一个NAT网关的行为。虚拟机上的虚拟以太网设备最终将与这两个虚拟网卡交互,并连接到外部网络。
显然,虚拟机看到的网卡也是一个假冒的网卡。
那么,让我们设想需要RDMA的场景:
可想而知地,如果在宿主机上安装了一块支持RDMA(点这里看RDMA的意义)的网卡,而虚拟机只能使用假冒的虚拟网卡,并通过虚拟化系统内部的虚拟交换机与RDMA物理网卡桥接。显然,虚拟机无法利用网卡的RDMA功能实现直接存取远端虚拟机的内存数据,运行大规模存储和计算应用时,也就难以充分发挥分布式系统的性能了。
我们需要一个比虚拟化更为真实的计算资源调度技术。
它能够实现计算资源的有效隔离、灵活调度和快速扩容,还能够让应用直接访问真实的硬件驱动。
工程师们想到了利用Linux的NameSpace机制,实现一个开天辟地的创举——容器技术。
从此,清风徐来水波不兴的虚拟化江湖,瞬间龙战于野,天地玄黄。
欲知容器技术的神奇之处,请看下回分解。