KVM内核虚拟化技术以及Docker容器技术的原理浅谈?

KVM虚拟化技术

随着云计算、大数据和分布式技术的发展和演进,我们需要在一台服务器上虚拟化出更多的虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移。

而虚拟化技术正是这些能力的基石。这一节课,就让我们一起探索一下,亚马逊、阿里、腾讯等知名公司用到的云虚拟主机,看看其中的核心技术——KVM 虚拟化技术。

虚拟化技术是微内核的产物,在计算机层级中加上了一个中间层。

微内核和宏内核区别和类似于集群和分布式,可自行了解,此处不作概述。

虚拟机是运行在真实硬件上的产物,因此对于虚拟机的使用,无疑是要使用硬件资源的,比如CPU、RAM和I/O设备,这就是硬件虚拟化。

软件虚拟化此处不作概述。

软件虚拟化的思想是把虚拟机看成一个运行在真实硬件上的进程,而其中客户端对于硬件资源的使用可以看成是一个个进程中的线程,而该中间层就负责把这些线程映射到真实的硬件上去,这个中间层我们一般叫做Hypervisor/Virtual Machine Monitor(VMM)。

在这里插入图片描述
CPU虚拟化

Intel 定义了 Virtual Machine Extension(VMX)这个处理器特性,也就是传说中的 VT-x 指令集,开启了这个特性之后,就会存在两种操作模式。它们分别是:根操作(VMX root operation)和非根操作(VMX non-root operation)。

虚拟机中的操作系统和应用程序一般运行在非根操作中,当使用到一些类似于中断的指令时,切换到根指令,根指令对处理器和平台硬件具有完全的控制权限。

内存虚拟化

其中不得不提内存虚拟化,内存虚拟化核心目的是“骗”客户机,给每个虚拟客户机都提供一个从0开始的连续的物理内存空间地址,同时又要保障各个虚拟机之间内存的隔离和调度能力。

是不是有点像虚拟内存地址?其实VMM就是借鉴了该思想,因此其中对于地址转换的机制映射关系表是必不可少的

  • 客户机虚拟地址 GVA(Guest Virtual Address)
  • 客户机物理地址 GPA(Guest Physical Address)
  • 宿主机虚拟地址 HVA(Host Virtual Address)
  • 宿主机物理地址 HPA(Host Physical Address)

I/O虚拟化

I/O 虚拟化是基于 Intel 的 VT-d 指令集来实现的,这是一种基于 North Bridge 北桥芯片(或 MCH)的硬件辅助虚拟化技术。

运用 VT-d 技术,虚拟机得以使用基于直接 I/O 设备分配方式,或者用 I/O 设备共享方式来代替传统的设备模拟 / 额外设备接口方式,不需要硬件改动,还省去了中间通道和 VMM 的开销,从而大大提升了虚拟化的 I/O 性能,让虚拟机性能更接近于真实主机。

提到虚拟化技术,不得不提到现在比较火热的docker容器技术。

docker容器技术的实现机制

容器:轻量、拥有一个模具(镜像),既可以规模生产出多个相同集装箱(运行实例),又可以和外部环境(宿主机)隔离,最终实现对“内容”的打包隔离,方便其运输传送。

容器和虚拟机的对比

在这里插入图片描述
为了让虚拟机的应用程序达到和物理机相近的效果,使用了KVM,他允许多个操作系统共用一个CPU,但是却带来了极大的开销,由于虚拟机带着全套的OS,调度和资源占用都非常重。

容器是一种更加轻量级的操作系统虚拟化技术,他将应用程序,依赖包,库文件等允许依赖环境打包到标准化的镜像中,通过容器引擎提供进程隔离、资源可限制的运行环境,实现应用于OS平台及底层硬件的解耦。

此处要注意虚拟机和容器的区别:虚拟化技术是模拟出了一个虚拟机,而容器技术只是在与原宿主机的架构中加入一块新的空间,该空间对于硬件资源的使用还是得靠底层硬件,不过不是虚拟化的操作系统了,而是容器引擎技术。

以docker为例,docker是一种C/S架构,主要包括三部分

  • 容器客户端(client)
  • 容器镜像仓库(register)
  • 容器管理引擎进程(host)

其中最值得关注的是容器管理引擎进程,他是docker架构的核心,包括运行docker daemon(守护进程)、image(镜像)、驱动(driver)、libcontainer(容器管理)等。

  • daemon:是一个常驻后台的的进程。负责监听客户端请求,然后执行后续的对应逻辑,还能管理docker对象。
  • docker driver:docker中的驱动。设计驱动这一层依旧是解耦,将容器管理的镜像、网络和隔离执行逻辑从 Docker Daemon 的逻辑中剥离。
  • libcontainer:libcontainer 提供了访问内核中和容器相关的 API,负责对容器进行具体操作。

宿主机对于容器内以及客户机对于宿主机资源的使用已经满足了,但是除了对于硬件资源的使用,为何每个容器内里面能够有独立的资源呢?

容器隔离技术:Linux NameSpace

容器的一大特点就是创造出一个相对隔离的环境。在 Linux 内核中,实现各种资源隔离功能的技术就叫 Linux Namespace,它可以隔离一系列的系统资源,比如 PID(进程 ID)、UID(用户 ID)、Network 等。

有点类似于chroot,把当前目录变成被隔离出的根目录,使得当前目录无法访问到外部的内容,Namespace 在基于 chroot 扩展升级的基础上,也可以分别将一些资源隔离起来,限制每个进程能够访问的资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妖怪喜欢风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值