第2章 虚拟化与IaaS

2.1 虚拟化定义

虚拟化是云之基石,是云实现的底层技术支撑。虚拟化是在程序直接调用硬件接口的环境下,中间插入一层虚拟化层,将物理资源通过虚拟化软件模拟硬件接口,欺骗上层的操作系统或者应用,达到共享物理硬件的目的。无论是操作系统,还是其他应用程序,都需要依赖外部接口。这种基于接口的设计为虚拟化提供了理论基础。通常,操作系统并不感知使用的接口到底是来自真实的物理硬件,还是虚拟化软件,只要其符合接口规范即可,例如,任何实现了USB2.0规范的设备都可以被操作系统的驱动识别,无论它是物理U盘,还是通过磁盘模拟的虚拟设备。

虚拟化的应用并不仅仅是在云计算领域,从软件运行层次上看,每个地方都能看到虚拟化的影子,如图2-1所示。在硬件方面,当前的主流CPU都支持硬件辅助虚拟化,通常大部分客户机的指令都可以直接在宿主机的CPU上面运行,只有特权指令才需要CPU和虚拟化软件做特殊处理。假设读者熟悉Docker,对操作系统层次的虚拟化就不需要做过多解释,namespace、cgroup、pivot_root等技术可以在一个操作系统之上模拟出多个运行环境。喜欢hack的读者对函数库的虚拟化应该深有感触。在Linux系统上面运行的QQ是多么糟糕,那么怎样在Linux上面运行Windows版QQ呢?通过Wine可以将Linux的函数库包装成Windows函数库,从而在Linux上面运行Windows的应用程序。应用程序虚拟化最典型的就是JVM,通过JVM可以做到Java代码的一次编译,处处运行。一方面JVM去适配各种操作系统的API,另一方面提供JVM的规范,任何符合JVM规范的程序都可以在JVM里面运行,如Java、SCALA等,无论是CPU指令的虚拟化,还是应用程序的虚拟化,都是遵循一种契约和接口规范。

图2-1 从软件运行层次上看虚拟化应用

虚拟化从资源角度出发,主要分为计算虚拟化、存储虚拟化,以及网络虚拟化,这些技术是IaaS的核心,虚拟化定义如图2-2所示。

图2-2 虚拟化定义

计算虚拟化主要是针对CPU和内存的,提供虚拟机的交付方式。在物理服务器上面虚拟出多台虚拟服务器,每个服务器拥有独立的CPU、内存空间和系统盘。这些宿主机可以由不同的硬件厂商提供,并且,虚拟机可以运行在不同的操作系统。

存储虚拟化主要是将硬件存储通过虚拟化提供统一的存储接入,并且这些存储能够挂载到任意虚拟机,完成计算和存储的分离。通过存储虚拟化可以在普通服务器上构建高性能、高可靠的存储。

网络虚拟化摆脱了传统物理网络拓扑的限制,允许用户动态地自定义网络的拓扑结构,通过虚拟交换机、虚拟负载均衡器、虚拟防火墙等虚拟的网络设备构建出高度灵活的网络架构。

这些虚拟化方案将在后面的章节里面详细介绍。