服务器虚拟化
如今,大多数企业将每台服务器用于一个特定的任务或者应用程序,因为这些不同的应用或者程序并不适用于同一个系统中,但问题是,但多数服务器在运行计算时只会使用他们整体处理能力的一小部分,不能充分利用服务器的处理能力。
虚拟化就解决了这个问题,将多台服务器整合到一台服务器中,运行多个虚拟环境,每个VM都有自己的操作系统(这些操作系统可以是不同的),可以在其上安装应用程序。
虚拟机的设计原理彼此间是隔离的,并且与虚拟主机隔离,这意味着一个应用程序中的安全问题不会影响在另一个虚拟机中运行的另一个应用程序。同样,如果一个应用程序崩溃并需要重新启动服务器,那么可以重新启动它的VM,而不影响任何其他VM的运行。不过,这种隔离偶尔也可能被打破——这种现象称为VM逃逸。
虚拟化还有利于可扩展性,因为VM是可移植的,例如,可能存在这样一种情况:两个应用程序在一个虚拟主机上的VM中运行,但是其中一个应用程序需要更多的资源,以至于这两个VM不能再在同一主机上共存。
如果没有虚拟化,将一个应用程序移动到一个新服务器将是一项艰巨的任务。但是VM是以计算机文件的形式存在的,因此这个文件可以很容易地通过网络(甚至通过存储介质)复制或移动到新的虚拟主机上。事实上,VMware的vMotion和微软的Live Migration等特性甚至允许虚拟机在运行时将其移动到新的主机,以确保它们所提供的服务不会中断。
除此之外,这对灾难恢复来说也有重要意义。如果发生灾难,虚拟机可以转移到辅助站点,且无需镜像主站点。基本上需要的只是在辅助站点上有足够数量的虚拟主机。
Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件(有时也称为虚拟机监视器)。这可以是“裸机”hypervisor(也称为Type 1 hypervisor),例如包含自己的OS内核并直接在物理服务器上运行的VMware ESXi,也可以是内置于操作系统中的hypervisor(也称为Type 2 hypervisor),例如在Windows Server和Windows 10上运行的Microsoft的Hyper-V。
IBM在20世纪60年代开发了第一个hypervisor,如今流行的hypervisor包括Hyper-V、ESXi、KVM和Nutanix AHV。
容器
与虚拟化相反,容器主机需要运行自己的操作系统以及容器系统。
容器由单个应用程序(或微服务)以及需要运行的其他重要文件组成,利用容器主机的操作系统内核、二进制文件和库来运行。这些共享文件作为只读文件公开给容器。在容器主机上运行的其他容器也共享主机的内核、二进制文件和库。
由于容器比虚拟机“轻”得多,并且启动速度也快得多,这也使得它们成为运行微服务的理想工具,当对微服务的需求扩大时,可以启用容器,当需求减少时可以删除。它们也可以在公有云和私有云以及传统数据中心之间轻松移动。
目前最受欢迎的容器环境是Docker,其他还有rkt,Apache Mesos,lxc,containerd, Hyper-V Containers, and Windows Server Containers。
诸如Red Hat的Fedora CoreOS之类的专用操作系统是专门为安全、大规模地运行容器化工作负载而构建的。
虚拟机与容器
由于多个容器之间使用的还是同一个宿主机的操作系统内核,因此导致了容器与虚拟机之间存在一些重要区别:
- 容器比虚拟机小得多或“轻”得多,通常由几兆字节组成,并且所需的硬件资源也少得多。这意味着一台物理服务器可以承载的容器比虚拟机要多得多。
- 容器可以在几秒甚至几毫秒内启动。相比之下,虚拟机的启动时间比较长。
- 由于容器都共享其主机的操作系统,因此所有应用程序都必须在同一操作系统上运行。相比之下,运行在虚拟主机上的虚拟机可以运行不同的操作系统(例如Linux,Unix和Windows)。
- 使用容器时,只需要对容器主机的操作系统进行补丁和更新。而虚拟机则需对每个操作系统都进行补丁和更新。
- 如果一个容器导致容器主机的操作系统崩溃,则在该主机上运行的所有容器都将失败。
- 容器主机的操作系统内核中的安全漏洞将影响其所托管的所有容器。
虚拟机和容器的使用场景
虚拟机非常适合传统的资源密集型单片应用程序,尤其是准备将这些应用程序移至云中时。
容器更适合承载Web服务中使用的微服务,特别是在对可扩展性要求很高的情况下。当以这种方式使用容器时,通常由容器编排系统对其进行管理,以自动执行计算机应用程序的部署、扩展和管理。这些通常基于Kubernetes,Kubernetes是最初由Google设计但现在由云原生计算基金会维护的开源系统。
不仅如此,容器和虚拟机也可以共存,容器可以在虚拟机中运行,企业可以利用现有的虚拟化基础设施(例如虚拟机管理系统)来管理其容器。
原文:Virtualization vs. Containerization: What is the Difference?