1 虚拟化
虚拟化是为一些组件(例如虚拟应用、服务器、存储和网络)创建基于软件的(或虚拟)表现形式的过程。它是降低所有规模企业的 IT 开销,同时提高其效率和敏捷性的最有效方式。
1.1 虚拟化用于程序跨平台兼容
要实现程序跨平台兼容的方法其实很简单,只要操作系统或者物理硬件所提供的接口调用方式一致,程序便不需要兼容不同硬件平台的接口,而只需要针对这一套统一的接口开发即可。
虚拟化技术正是通过其本身适配不同平台的硬件,而加以抽象成统一的接口,来实现程序跨平台运行这一目的的。
1.2 虚拟化用于资源管理
通过虚拟化技术来管理计算机资源的方式,不但让我们对计算机资源的控制变得更加灵活,也大幅提高了计算机资源的使用率。
虚拟化技术能够提高计算机资源的使用率,是指利用虚拟化,我们可以将原来程序用不到的一些资源拿出来,分享给另外一些程序,让计算机资源不被浪费。
虽然我们能够在操作系统里同时运行多个程序,但前提得是这些程序本身不存在冲突。这里的冲突体现在很多的方面,例如不同的程序同时使用了同一个端口;不同程序依赖于同一个工具库的不同版本;程序本身限制了同时开启的进程数等。虚拟化技术通过资源隔离的方式,无形地也可以把这些程序隔离在不同的虚拟环境中,既然虚拟环境不同,自然运行在不同环境中的程序就不会互相干扰或争抢资源了。
1.3 虚拟化的分类
-
硬件虚拟化
所谓硬件虚拟化,指的是物理硬件本身就提供虚拟化的支持。举个例子来说,某个平台的 CPU,能够将另外一个平台的指令集转换为自身的指令集执行,并给程序完全运行在那个平台上的感觉。例如Intel VT、AMD-V -
软件虚拟化
而软件虚拟化则指的是通过软件的方式来实现虚拟化中关键的指令转换部分。依然用 CPU 的例子来说话,在软件虚拟化实现中,通过一层夹杂在应用程序和硬件平台上的虚拟化实现软件来进行指令的转换。
1.4 平台虚拟化分类:
- 完全虚拟化:原来运行在物理硬件上的操作系统和软件,完全不用修改就可以直接运行在虚拟机中。
全虚拟化(FullVirtualization)也称为原始虚拟化技术,该模型使用虚拟机协调Guest操作系统和原始硬件,VMM在Guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor(虚拟机管理程序)来捕获处理。
- 半虚拟化:是一种修改Guest OS部分访问特权状态的代码以便直接与VMM交互的技术。
在虚拟客户操作系统中加入特定的虚拟化指令,通过这些指令可以直接通过Hypervisor层调用硬件资源,免除有hypervisor层转换指令的性能开销。
半虚拟化需要Guest操作系统做一些修改,使Guest操作系统意识到自己是处于虚拟化环境的,但是半虚拟化提供了与原操作系统相近的性能。
- 操作系统虚拟化:是一种轻量级的虚拟化技术,让内核通过创建多个虚拟的操作系统实例来隔离不同的进程,不同实例中的进程完全不了解对方的存在。这些实例也被称之为容器。
1.5 虚拟机
一种叫虚拟机监控程序的软件会把资源与物理机分隔开,以便进行分区并专门用于虚拟机。通常来说就是通过一个虚拟机监视器 ( Virtual Machine Monitor ) 的设施来隔离操作系统与硬件或者应用程序和操作系统,以此达到虚拟化的目的。这个夹在其中的虚拟机监视器,常常被称为 Hypervisor。
当用户发出需要从物理环境中获取更多资源的虚拟机指令时,虚拟机监控程序就会将该请求转发到物理系统并将更改放到缓存中。
从作用上来看,虚拟机就像物理服务器,它会成倍放大应用依赖项和大量 OS 占用空间(而运行单个应用或微服务往往并不需要这么大的占用空间)造成的弊端。
2. 容器
所谓容器技术,指的是操作系统自身支持一些接口,能够让应用程序间可以互不干扰的独立运行,并且能够对其在运行中所使用的资源进行干预。由于应用程序的运行被隔离在了一个独立的运行环境之中,这个独立的运行环境就好似一个容器,包裹住了应用程序,这就是容器技术名字的由来。
容器中包含了微服务或应用及运行所需的一切要素。容器中的所有内容都保存在镜像(一个基于代码且包含所有库和依赖项的文件)上。我们可以将这些文件视为 Linux 发行版的一个安装实例,因为镜像中包含 RPM 软件包和配置文件。由于容器是如此之小,因此通常会有数百个容器松散地耦合在一起,所以要使用容器编排平台(例如红帽 OpenShift 和 Kubernetes)来置备和管理它们。
3. 虚拟机 VS 容器
由于没有了虚拟操作系统和虚拟机监视器这两个层次,大幅减少了应用程序运行带来的额外消耗。
更准确的来说,所有在容器中的应用程序其实完全运行在了宿主操作系统中,与其他真实运行在其中的应用程序在指令运行层面是完全没有任何区别的。
相比虚拟机,容器最适合用于:
- 构建云原生应用
- 封装微服务
- 拓展 DevOps 或 CI/CD 实践
- 在共享同一操作系统的多样化 IT 环境中移动可扩展的 IT 项目
与单个容器相比,虚拟机能够运行更多的操作,因而它们一直是(现在也是)封装单体式工作负载的惯用方式。但是,由于对操作系统、应用和库的依赖性,这种扩展功能也令虚拟机的可移植性大大降低。相比容器,虚拟机最适合用于:
- 存放传统的单体式工作负载
- 隔离存在风险的开发周期
- 置备基础架构资源(如网络、服务器和数据)
- 在另一个操作系统内运行不同的操作系统(例如在 Linux 上运行 Unix)
参考资料
《开发者必备的 Docker 实践指南》