硬件发展推动虚拟化技术发展。随着科技的进步与发展,硬件制作工艺的提高,计算机性能也越来越高。在单台计算机性能提高后,单个业务无法完全使用过剩的计算资源导致大量的浪费,企业投入与产出比无法满足企业管理者的诉求,如何更好的提升硬件资源利用率成为软件发展的一个重要方向。
资源共享是提升资源利用率的核心思想。从早期操作系统从单任务到多任务,以及从物理机到虚拟机,然后再到容器技术,主要就是在解决资源共享问题,以及资源共享后衍生出来的安全问题、性能损耗问题以及隔离等问题。
本文先介绍资源共享的几个核心阶段,然后再解释为什么容器化与虚拟化并非二选一,以及未来的发展方向。
- 批处理系统与分时系统阶段
- 虚拟化阶段
- 容器化阶段
- 容器化与虚拟化并非二选一
- 未来的发展方向
批处理系统与分时系统阶段
早期单道批处理系统。内存里一次只放一个作业。这个作业运行完,才换下一个。虽然减少了人工换纸带的麻烦,但CPU和I/O设备(输入输出设备)经常互相等待,资源利用率不高。
进阶的多道批处理系统。内存里同时存放多个作业。当一个作业需要等待读写磁盘时,CPU会立刻切换去执行另一个准备好的作业。这种"多道程序设计"技术,极大地提升了CPU的性能,是操作系统发展史上的一个里程碑。
分时系统。为了更充分地利用CPU资源,分时技术把CPU的时间切成极小的"时间片",轮流分配给各个用户(进程)的终端。这让每个用户(进程)都感觉自己在"独占"机器,开启了交互式计算的时代。1961年 IBM709 机实现了分时系统。
分时系统里程碑1是1969年,贝尔实验室诞生了UNIX,它是第一个使用C语言编写的操作系统,具有极佳的可移植性,其"一切皆文件"的设计思想影响了后世几乎所有操作系统。
分时系统里程碑2是1991年,林纳斯·托瓦兹(Linus Torvalds)发起并开源了Linux操作系统内核。Linux 遵循 Unix 的设计哲学,以及免费开源的特性,至今仍然是服务器操作系统的最主要选择。
虚拟化阶段
虽然分时系统可以极大的提升CPU资源的利用率,但是仍然存在一些问题:在同一个操作系统内核中运行多个进程会存在隔离问题,涉及运行环境隔离、资源隔离、安全隔离、资源分配等问题, 这些问题在虚拟化软件出现后得到有效的改善。
软件虚拟化的目的是使用逻辑资源来表示物理资源,从而摆脱物理限制的约束,提高物理资源的利用率。在2007年 KVM 虚拟化能力被正式包含在 Linux Kernel 2.6.20 版本中,成为了 Linux 内核的一部分,极大地推动了 KVM 的发展。
目前主流的虚拟化技术及软件常见有:VMWare Workstation(VMWare公司)、VirtualBox(Oracle公司)、Hyper-V(Microsoft公司)、KVM(Redhat公司)、Xen(剑桥大学)、OpenStack( Rackspace 和 NASA)等。其中 OpenStack 同时包含了虚拟化(基于 KVM)、网络、存储、安全、虚拟化管理、虚拟化监控等功能,并且具有开源免费、成熟稳定等特点,使其成为自建私有云的首选方案。
在进行虚拟化的同时引入一个比较严重的问题:在虚拟化过程中虚拟机本身会消耗较多的资源,这部分资源消耗是无法生产业务价值的。
为了解决资源虚拟化时自身的损耗,各大厂商/平台都想方设法来降低这部分的损耗,Xen 走半虚拟化的路,部分设备直接访问,减小性能损耗。Intel、AMD 等硬件厂商对指令集进行优化,专门给虚拟化提升性能或降低虚拟化的损耗,但效果都不太理想。
容器化阶段
虚拟机目的是在一台强性能的物理机上虚拟出多个互相之间完全独立的虚拟机。主要优势就是能大大提升物理资源利用率的同时,又能将不同的应用完全独立开来,能够进行资源的隔离,资源的共享。
但缺点也比较明显,就是在进行虚拟化的同时会消耗大量的资源,这部分资源的消耗并没有产生任何业务价值。而新兴的 容器技术 刚好能够解决虚拟化的这些问题。
2013年3月20日,DotCloud 发布了 Docker 的首个版本,并将 Docker 源码进行开源。Docker 是一种开源的容器化平台,旨在通过容器技术实现应用程序的高效迁移、部署、运行和管理。它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器/镜像中,每个容器都运行在独立的环境中,实现了应用程序与底层操作系统的解耦,从而确保应用程序在不同环境中具有一致的行为。
Docker 的核心思想是通过容器化技术共享宿主机的操作系统内核,为应用提供的独立的运行环境,解决传统虚拟化技术的资源浪费和复杂性痛点,提供一种比传统虚拟机更高效、更灵活,且更低成本的解决方案。
至此Docker风靡全球,成为容器技术的典型代表。虽然在 2020 年 Kubernetes 在 v1.20 版本之后将废弃 Docker 作为容器运行时,Docker的发展受到一定的影响,但是依托于Docker早期构建生态(如 Docker Hub、Docker Compose、Docker Swarm Docker Desktop、Docker Buildx等)仍然不失 Docker容器技术的典型代表 的定位。
容器化与虚拟化并非二选一
前面提到对物理资源的利用率提升时,涉及运行环境隔离、资源隔离、安全隔离、资源分配等问题,虽然容器化技术相比虚拟化技术虽然在资源隔离、安全隔离、资源分配等方面确实优异,但是在环境环境隔离方面还是无法完全替代虚拟化。
这主要是因为容器技术是共享操作系统内核,而虚拟化的虚拟机都有各自独立的内核。这个差异会导致两个典型的场景问题:
其一,在容器中,当操作系统内核有Bug或者某个容器安全加固不足导致内核被攻击时,将会影响整个服务器上所有的容器。
其二,在虚拟机中,独立内核可以运行不同CPU架构、不同内核的操作系统,如在ARM64服务器上虚拟机中运行X86_64的Windows系统。
这两个场景决定了容器技术无法完全替代虚拟机,虚拟化和容器化都是正确的方向并且会长期同时存在,不需要二选一。
未来的发展方向
很多技术流行并非短期的爆发,而是有着多年的技术积累。比如 chroot 是容器技术的鼻祖,在1979年在 Unix 中诞生, 在 1992~1993年Linux进行了支持;Docker的核心底层技术 Linux Namespace 也是在 2002 加入的 Linux 内核;有了这些早期的技术储备,Docker技术才能在2013年爆发流行起来。
基于目前服务器软件技术储备,并没有发现一种跨越性的突破技术能重新定义资源利用率提升的方向。
新的方向从服务器软件方向变更到平台软件方向发展,更多的聚焦在以 Kubernetes 为核心的容器云平台,以及以云厂商为核心的公有云共享资源的云平台。