虚拟化技术:虚拟机、Docker、K8s
虚拟机
什么是虚拟机
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。
简而言之,就是虚拟出一台计算机。
设计虚拟机的目的是方便程序开发与测试人员测试特定的软件。例如:
- 有些软件需要特定的操作系统
- 有些软件需要多台计算机环境
双系统与虚拟机
在容器化技术出现之前,一台 Windows 电脑想要使用 Linux 有两种方法:
方法 | 优点 | 缺点 |
---|---|---|
双系统 | 每个系统都可以使用全部硬件资源 | 1、安装 Linux 系统还需要解决驱动等各种问题,对新手不友好; 2、切换系统需要重启电脑,使用不方便 |
虚拟机 | 1、像 Windows 中的软件一样使用虚拟机,对新手友好,使用方便; 2、环境独立,当不需要或者搞崩了的时候可以直接删除虚拟机镜像文件; 3、虚拟机镜像文件可以拷贝到其他机器上打开即可运行 Linux,便携性好 |
1、虚拟机启动慢; 2、虚拟机占用硬件资源(CPU、内存等),硬件配置低可能会卡顿 |
毕竟是虚拟出来的一套 Linux 计算机,要占用一定得硬件资源,而且最常用的 VMware(专业得重量级虚拟机软件) 还是收费的。当然也有免费的轻量级虚拟机软件 VirtualBox。
如果是 Windows10 及以上版本,更推荐安装微软官方出品的 WSL(Windows Subsystem for Linux,Windows下的 Linux 子系统),体验更好。
虚拟机技术
虚拟机技术是虚拟化技术的一种,所谓虚拟化技术就是将事物从一种形式转变成另一种形式,最常用的虚拟化技术有操作系统中内存的虚拟化,实际运行时用户需要的内存空间可能远远大于物理机器的内存大小,利用内存的虚拟化技术,用户可以将一部分硬盘虚拟化为内存,而这对用户是透明的。又如,可以利用虚拟专用网技术(VPN)在公共网络中虚拟化一条安全,稳定的“隧道”,用户感觉像是使用私有网络一样。
我说给你分配的是内存,它就是内存(实际上可能事硬盘),指鹿(硬盘)为马(内存)。
Docker
什么是 Docker
dock 是码头、船坞的意思,MacOS 的扩展坞(如下图所示)就是 dock。
docker 是码头工人的意思,负责装卸船上的货物,常见的是集装箱船。
我们所说的 Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的 Linux 机器上,也可实现虚拟化。看看 Docker 得图标,是不是和集装箱船很像。
在传统的开发过程中,一般都是本地开发,然后打成 jar 包(不会吧,现在还有人用 war 包?)放到服务器上,服务器上部署好相关环境(JDK、Nginx、Redis、PostgreSQL、MQ 等),而且要保证每个环境得配置一致。很容易导致的问题是:为什么在测试环境可以运行,上线后却出现问题,版本更新后为什么服务不可用。
基于以上问题,Dokcer 提出了解决方案。
Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker 的第一句口号是:『Build, Ship and Run』,也就是搭建、发送、运行。
Docker 的第二句口号是:『Build once, Run anywhere』,一次搭建,到处能用,类似于 Java 的『Write once, Run anywhere』,一次编写,到处运行。
Docker 技术的三大核心概念,分别是:
- 镜像(Image):是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们说的 Build 就是搭建镜像。
- 仓库(Repository):管理与存放镜像的地方。我们说的 Ship 就是将镜像发送到仓库。
- 容器(Container,也有集装箱的意思):容器是镜像的运行时所创建的实例。我们说的 Run 就是运行镜像。
虚拟机与 Docker
特性 | 虚拟机 | Docker |
---|---|---|
隔离级别 | 系统级 | 进程级 |
隔离策略 | Hypervisor | CGroups |
系统资源 | 5~15% | 0~5% |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB 级 | MB 级 |
集群规模 | 单机几十个 | 单机上千个 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
K8s
什么是 K8s
Kubernetes 这个单词来自于希腊语,含义是舵手或领航员。
K8s(Kubernetes,类似于 i18n 的缩写) 是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
尽管 Docker 为容器化的应用程序提供了开放标准,但随着容器越来越多出现了一系列新问题:
- 如何协调、调度和管理这些容器?
- 如何在升级应用程序时不中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
解决这些问题需要容器编排技术,可以将众多机器抽象,对外呈现出一台超大机器。现在业界比较流行的有:k8s、Mesos、Docker Swarm。
Docker 与 K8s
Docker 和 K8s 是互补关系:
- Dockers 属于下层——容器引擎层;
- K8s 属于上层——编排调度层。
在 CRI(Container Runtime Interface,容器运行时接口) 出现之前(也就是 K8s v1.5 之前),Docker 作为第一个容器运行时,Kubelet 通过内嵌的 Dockershim 操作 Docker API 来操作容器,进而达到一个面向终态的效果。在这之后,又出现了一种新的容器运行时 - rkt,它也想要成为 Kubernetes 支持的一个容器运行时,当时它也合到了 Kubelet 的代码之中。这两个容器运行时的加入使得 Kubernetes 的代码越来越复杂、难以维护。之后 hyber.sh 加入社区,也想成为第三个容器运行时。
此时就有人站出来说,我们能不能对容器运行时的操作抽象出一个接口,将 Kubelet 代码与具体的容器运行时的实现代码解耦开(依赖倒置原则,依赖于抽象而不能依赖于实现),只要实现了这样一套接口,就能接入到 K8s 的体系中,这就是我们后来见到的 CRI。
所以 K8s 并不是只能运行 Docker 容器,也可以运行实现了 CRI 的容器。
应用部署方式对比
方式 | 优点 | 缺点 |
---|---|---|
传统方式 | - | 每台机器需要手动安装软件,运行应用,工作量很大,很容易出错。 |
Docker | 安装过程只需要拉取镜像,启动即可,不用关心软件的配置、版本等信息。 | 1、如果容器很多,工作量依然很大; 2、容器间的依赖关系、网络通信、数据持久化等非常复杂。 |
Docker-Compose | 1、减少了多容器的部署的工作量; 2、不用考虑容器间各种复杂的关系。 |
只能单机编排容器,不能实现多机编排 |
Docker Swarm | 支持分布式下环境下的容器编排 | 1、只有分布式编排这一个功能,没有动态伸缩、可视化等功能; 2、市场占有率低。 |
K8s | 1、支持分布式下环境下的容器编排以及各种高级功能; 2、市场占有率高。 |
- |