之所以使用虚拟机,其出发点是我们可以利用虚机将一台大的伺服器隔离成多个小的虚机,每个虚机跑独立的应用,这样便于我们管理;举个例子,假设没有虚拟机,我们将多个应用跑在一台伺服器上,多个应用间很有可能会出现埠冲突,或者多个应用使用同一个软体的版本不一样(例如使用不同版本的Python,JDK版本不一样等等),即在一台机器上运行多个应用可能产生冲突,所以可以考虑将一台伺服器隔离成多个资源隔离的虚拟机,应用跑在每个独立的虚机里面,例如一个虚拟机只跑一个应用,而另一个虚机跑另一个应用。 这样就避免了应用之间的冲突。此外某些应用可能存在不易察觉的BUG,例如在特定的场景下触发后会疯狂的吃内存。如果多个应用运行在一台物理伺服器上的话,一个应用的BUG会影响其他的应用和服务的运行。而此时既然我们有虚机了,就没有必要在一台大的物理伺服器上跑多个应用,此时就可以将大的硬体伺服器隔成多个小的虚机,在每个小的虚机里运行不同的单一的应用,避免相互之间的干扰和冲突。如图所示:

图中底层是一台大的物理伺服器,在伺服器之上使用虚拟化技术。

但是经过一段时间的使用,人们逐渐意识到这种应用场景存在有一个很严重的问题:虚拟机占用的资源过多,导致伺服器资源利用率低。

虚机里都要跑一个Gust OS,例如跑一个Windows的虚机或者Ubuntu的虚机就是在虚机里面起一个操作系统且这个操作系统跟宿主机的操作系统通常不一样(当然也可以一样)。例如我一台硬体伺服器上首先安装redhat的操作系统,且使用KVM或XEN做了虚拟化,在其之上虚拟出多个虚机出来。之后要做的事情就是在每个虚拟机里面运行我们的应用服务。但是后来人们逐渐发现一个问题,就是这个宿主机的Guest OS即宿主机的Gust操作系统 ,占用资源太多。每个虚机里跑的应用占用的资源本身并不多,大量的资源被Guest OS即虚机里面跑的操作系统占用了。例如我只需要在虚拟机里跑一个小的服务,服务本身也就需要几十M,最多几百兆的内存,但是需要为他启一个Windows的虚机,而Windows一启动就是一大坨,只要Windows一启动那至少1、2个G的内存就没了。原本想要的是把伺服器隔得越小,灵活性越好,可管理性越好,避免服务之间的干扰。但事实是,我隔得越小导致我浪费的资源越多。 因为隔得越小我需要跑的Guest OS就越多,资源浪费也就越多。

然而,仔细想一想我们为什么要使用操作系统呢?操作系统主要干的事情是管理计算、存储、网路等等这样一些硬体设备 ,并且能在里面调度进程。实现一些具体的应用。然而操作系统干的事情,跟我们之前的需求:利用虚拟化将一个物理伺服器隔离成多个资源之间彼此隔离的虚拟机,将应用放在一个个小的虚拟机环境里面去运行,应用之间相互之间不影响可以很灵活的调度资源。所以我们想要的理想的情况就是:我们可以随时创建一个小格出来(前面就是指虚机),且随时可以销毁释放资源,且各个小格子之间还有隔离型,互相之间不影响。虚机之所以被广泛应用就是因为虚机可以满足这样的需求,而不是因为虚机可以模拟一个完整的机器。这里就引出一个对虚拟机的反思,我们使用软体完全实现一个物理世界的硬体环境,有没有太大的必要 ? 之前曾提到过,为甚么要模拟一个真实存在的IO设备呢,你的真正目的是为了实现IO,实现输入输出。如果我们纯粹为虚拟化设计一个虚拟的IO设备行不行呢?当然是可以的,我们只需要将操作系统的驱动改成虚机化的IO的驱动就可以了。其实我们要的并不是实现一个完整的把所有物理的硬体都模拟一遍的虚拟伺服器,而是一个相对完整的操作系统环境

举个例子,假如一个小格里面只跑一个Hadoop的DataNode那我有没有必要再给这个东西接个显示器?你接个显示器干嘛呢??桌面虚拟化可能需要接显示器,但是DataNode接个显示器你能看什么?完全没有必要。这样就少了一个外部设备。还有一些其他的诸如此类的考虑。最后你就会发现其实我们要的只是一个相对完整的操作系统的环境,而不是一个完完全全的跟物理伺服器一样的包括所有物理硬体的模拟的环境 。既然我们只需要一个相对完整的操作系统的环境 ,那能不能直接利用在物理硬体上跑的那个操作系统(我们称之为Host OS)来支持呢?即因为我们只需要一个相对完整的操作系统,那我们能否直接虚拟操作系统,不需要虚拟那些物理的硬体。最后,总结一下就是两个问题:

  1. 资源的隔离,使得应用之间对资源的使用相互之间不干扰。
  2. 提供一个相对完整的操作系统的环境,而不是一个完整的模拟的硬体环境。

此时人们就在想,能不能直接使用Host OS,来模拟一个相对完整的操作系统,而不需要再在Host OS上跑Guest OS,于是就发展出来了操作系统级的虚拟化技术,就是利用操作系统本身的功能来实现虚拟化,这就是Container技术 。Container技术其实也是一条完整的线,经过了很长时间的发展,到今天他跟虚拟机的HyperVisor之间的发展也是错综复杂的一个关系,并不是说Container技术出现了HyperVisor技术就利用起来了 ,Container很早就出现了,HyperVisor也一直在发展。目前提及Container大多指的就是 Docker,毕竟太火了没办法。下篇文章将介绍Container技术。


推荐阅读:
相关文章