浅谈虚拟化技术

早在几年前接触虚拟化技术的读者,应该还记得当时的虚拟化技术强调的是将实体机器虚拟化。在那个时代背景下有几个趋势:

  1. 云计算正在普及;

  2. 企业开始将部署在私有服务器的服务迁移到云端;

  3. 企业开始选择构建自己的私有云或使用各大科技巨头的公有云。

此时的虚拟化技术可以很简单地理解为:将操作系统虚拟化。不过随着容器化技术的出现,许多人也用旧的虚拟化技术概念去类比容器化技术,这样的类比确实能更快的理解新技术,但却衍生出许多误解甚至不够客观的优劣分析。因此技术团队在考虑是否引入容器化技术时,要特别小心判断。

为了避免落入科技圈鄙视链的思考误区,最简单的判断方法应该由其技术价值为出发点,什么是技术价值?简而言之就是它为何而生?

C 语言的出现是为了取代汇编语言,以便用更高级的编写方式设计程序;Java 是为了降低机器依赖性、跨平台而生;PHP 是作为 HTML 动态生成的模板引擎而生。**每种技术的诞生都是为了解决当时软件工程遇到的种种问题,以解决核心问题为中心扩散成的解决方案。**换句话说,当你的开发项目离核心问题越远,引入这个技术的带来的收益通常是越低的。

言归正传,我们先来谈谈传统的操作系统虚拟化技术是要解决什么问题。

操作系统虚拟化技术

想象一下,如果你有一堆 CPU、RAM 和磁盘存储,如何有效地管理和分配硬件资源?当你只有 10 台电脑时你根本不用烦恼这个问题,但如果你有 1000 台电脑时肯定会衍生出很多问题。这是虚拟化技术想解决的核心问题之一。

而作为此类虚拟化技术的主角就是所谓的虚拟机(Virtual Machine,VM)。虚拟机操作起来就跟一般电脑一样,如下图所示,以操作系统为单位的虚拟化技术强调将硬件资源抽象化后可自由分配给上层的虚拟机使用,用户可以自由决定虚拟机要使用哪种操作系统?分多少的 CPU 与 RAM?而操作系统上运行各种应用程序(App)。

而这种操作系统虚拟化技术会有一个 Hypervisor 的角色,负责管理与分配硬件资源。我们根据管理硬件资源的规模可以概分成:

云级别的 Hypervisor:硬件通常是由机架式服务器组成,其管理的硬件资源包含处理器、内存、存储设备与网卡等各种硬件, Hypervisor 负责将其抽象化或逻辑化供上层的 VM 使用。一般科技公司由于研发与业务需求,需要大量的硬件资源,于是便可以构建一台私有云,以便管理和分配这些硬件资源,而全球性的科技巨头其规模更大,像是 Amazon 的 AWS、Google 的 GCP、Microsoft 的 Azure 除了把硬件资源给自己使用之外,还可以将其分享给其他人使用,也就成了所谓的公有云了。

操作系统级别的 Hypervisor:例如 VirtualBox 这样的工具,是一种能够在宿主操作系统(host OS)层面直接部署并运行的虚拟化管理程序,不需要大量的 CPU 或 RAM 即可运行,这种解决方案通常是给有特殊需求的使用者,例如:

  1. 多系统开发环境搭建:对于软件开发人员而言,特别是在移动应用开发领域,他们时常需要在不同版本的 Android 操作系统上进行兼容性测试和调试工作。开发人员能够轻松创建并运行多个独立的虚拟机实例,每个实例对应一个特定版本的 Android 系统,从而实现无缝切换和并行测试,极大地提高了工作效率和应用质量。

  2. 跨平台应用支持:以 MacOS 用户为例,借助如 Parallels Desktop 这样的 Hypervisor 软件,他们能够在 Mac 环境下原生运行 Windows 操作系统,解决了跨平台应用兼容性问题,极大地扩展了 Mac 用户的生产力工具集,实现了不同操作系统间的资源共享和无缝协作。

虚拟化技术可以说是云计算的基础,因为它解决了怎么把硬件资源分享出去的问题,因此才有办法做到所谓的「按需付费」,我们使用 AWS、GCP 或 Azure 时,可以发现我们付费的方式不外乎是使用了多少存储空间、多少 CPU 或 RAM、多少带宽等等。

容器虚拟化技术

容器虚拟化技术想解决的核心问题简而言之是环境配置的问题,这个问题说起来要比操作系统虚拟化技术难理解得多了。

从前,开发团队在创建一套系统时得为这套系统准备正确的执行环境,以前的执行环境很简单,我们可能只关心要准备哪一种操作系统及其版本(比如说 Windows Server 2019 或 CentOS 7.5)。讲究一点,我们会讨论一个系统使用什么样的解决方案堆栈(solution stack)或软件栈(software stack),例如 LAMP(Linux、Apache、MySQL、PHP)。

但近几年新技术如雨后春笋般冒出,工程师可以善用每一种语言或其生态提供的优势,以便更快速地实现各种功能,我们可能使用 Matlab 或 Python 来开发机器学习或人工智能算法,再用 C#或 Golang 或 Node.js 去开发后端的 API,数据库可能是 Mongo、MySQL、Oracle 或 Reids。

正所谓一沙一世界,每个技术虽然在整个项目里只扮演一部分的角色,却都有其生态性与版本兼容性问题,贸然地升级版本都可能导致系统出错,就像大多数的问题一样,很多时候分开处理都好好的,合在一起就坏了,工程师们慌恐地处理这些系统的执行环境配置问题,直到容器化技术的出现才让他们解脱。

让整个软件系统的执行环境可以搬迁

与其为每一个软件系统配置执行环境,倒不如让整个软件系统的执行环境是可以搬迁与重复利用的」这是容器化技术解决问题的方式。因此 容器(Container)就是一种可以搬迁与重复利用的执行环境。下图为一个以 Docker 作为容器虚拟化技术的示意图:

容器(Container) :以应用程序(App)为单位的虚拟化技术,应用程序与其依赖性资源(Dependency)会被封装在容器(Container)中,使其可以重复利用与搬迁,容器间彼此独立运行,互不干扰。

依赖性资源(Dependency) :它包括了二进制执行文件(binaries)和函数库(libraries),这两者对于应用程序的成功运行至关重要。二进制执行文件是指那些可以直接由操作系统加载并执行的预编译程序,比如 MySQL 服务器的可执行文件、Node.js 运行环境等;而函数库则是一系列预先编写好的、可以被应用程序调用以实现特定功能的代码模块,如.NET Framework 类库、各种开发语言的程序库,以及 Windows 系统中的动态链接库(DLL)等。

Docker Image:就像传统虚拟化技术将 OS 封装成 *.iso 镜像文件(image),Docker 也将 Dependency 封装成 Docker Image,使其可重复利用与移植。

Docker Engine :类比 Hypervisor 在硬件的上层配置一个可以运行虚拟机的环境,Docker 也相同需要在 Host OS 上配置一个可以运行容器的环境,Docker Engine 就是这样的角色,其可将 Docker Image 转换成 Container。

值得一提的是,Docker 允许将这些 Docker Image 公开在网络上存取,就如同 Github 之于 code 一样,Docker Hub 之于 Image 也是一样的概念,Docker Hub 让这些 Image 可以被分享、重复利用、下载与更新。我们也可以配置自己的 Image 管理库,以便存放不便公开在网络上的 Image。通过这样的生态系与核心技术可以有效解决软件搬迁的问题。

总结

我们应该要明白,容器化技术并不是用来取代传统操作系统虚拟化技术。下图将上述涉及的虚拟化技术整合在一起:

原则上,越上层的虚拟化技术所需要的硬件资源越低且分配到的硬件资源越少,且 Container 和 VM 是互补而共生的。

两种虚拟化技术的差异:

  1. 以代表性服务为例:Docker 是以应用程序为单位的虚拟化技术;VMWare 是以操作系统为单位的虚拟化技术。

  2. 容器虚拟化技术不是用来取代操作系统虚拟化技术的技术:操作系统虚拟化技术可以很容易地部署好一台 VM,但仍需安装各种执行环境所需要的程序并设定正确的环境参数才能执行 App,也就是说,在安装操作系统之后与执行应用程序之前,仍有需多环境配置工作,Docker 的主要优势在于透过 Image 和 Container 大幅简化并自动化这些工作。

  3. 容器不是 VM:容器是一个封装了依赖性资源与应用程序的执行环境;VM 则是一个配置好 CPU、RAM 与 Storage 的操作系统。

  4. 容器虚拟化技术以共享 Host OS Kernel 的方式来执行 App:容器依赖 Host OS 的核心(kernel)来运行容器,因此 Windows 容器必须在 Windows OS 上运行;Linux 容器必须在 Linux-base OS 上运行。

  5. 容器(container)是执行环境的实例(instance);VM 是操作系统的实例(instance)。

  6. 容器化技术更面向 DevOps 的需求,容器化技术通常会与 Kubernetes 或 Docker Swarm 之类的容器调度技术整合,再配合 Drone、Jenkins 之类的 CI/CD 工具,使其可以将系统的部署工作完全自动化处理,有效降低后端维护的成本。而传统的操作系统虚拟化技术并不是处理这种问题的主要技术,虽然像 VMware 这类的工具也会有负载平衡、故障转移、电力恢复之类的自动化运维机制,但其保障的是操作系统级别的维护需求。

  7. 硬件资源的分配:Container 因为是以应用程序为单位,需要的硬件资源更少,可以更细致地使用硬件资源,在没有 Docker 之前,我们可能为了部署一个应用程序而为其配置了一台 VM,其操作系统又占用了过多的 CPU、Storage 与 RAM;有了 Docker 之后,我们只要为一个应用程序配置一个 Container 即可。

  8. 应用程序的独立性:Container 间是彼此隔离的,所以我们可以在一台 VM 下同时执行 Nodejs 5,Nodejs 6,Nodejs 7 等各种版本的 Nodejs container,却不会发生冲突,在没有 Docker 之前,我们未来避免冲突,为不同版本的 Nodejs 创建一台独立的 VM,这会造成不少浪费。

  9. VM 简化了硬体资源配置与操作系统安装的工作,但既使如此还有许多执行环境配置的工作要处理,才能顺利部署与执行应用程序,Container 帮我们自动化地走完这最后一里路。也就是说,Container 简化了介于操作系统与应用程序之间的环境配置工作。

相关推荐
kylinxjd1 分钟前
spring boot发送邮件
java·spring boot·后端·发送email邮件
2401_857439693 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux
进击的女IT4 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
一 乐5 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
艾伦~耶格尔8 小时前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
man20178 小时前
基于spring boot的篮球论坛系统
java·spring boot·后端
唐大爹9 小时前
项目实战:k8s部署考试系统
云原生·容器·kubernetes
wusam9 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)
学习·docker·centos
攸攸太上9 小时前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway
罗曼蒂克在消亡9 小时前
graphql--快速了解graphql特点
后端·graphql