容器网络硬核技术内幕 (1) 朝夕相伴触手可及的虚拟

2022-07-27 21:43:00 浏览数 (2)

在《局域网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机制,实现一个开天辟地的创举——容器技术。

从此,清风徐来水波不兴的虚拟化江湖,瞬间龙战于野,天地玄黄。

欲知容器技术的神奇之处,请看下回分解。

0 人点赞