浅析openstack虚拟化技术
OpenStack
Openstack:OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface. 以上是官网对 OpenStack 的定义,OpenStack对数据中心的计算、存储和网络资源进行统一管理。 由此可见,OpenStack 针对的是 IT 基础设施,是 IaaS 这个层次的云操作系统。
虚拟化
虚拟化是云计算的基础。虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。Host将自己的硬件资源虚拟化并提供给 Guest 使用主要是通过一个叫做 Hypervisor 的程序实现的。
Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)。Hypervisor是所有虚拟化技术的核心。非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。
根据Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:
1型虚拟化和2型虚拟化
1型虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和VMWare 的 ESXi 都属于这个类型。
2型虚拟化
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和VMWare Workstation 都属于这个类型。
理论上讲:
1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
KVM
下面重点介绍KVM这种2型虚拟化技术。
基本概念
KVM 全称是Kernel-Based Virtual Machine。即 KVM 是基于 Linux 内核实现的。OpenStack 对 KVM 支持得也最好。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。
而IO 的虚拟化,比如存储和网络设备由Linux 内核和Qemu来实现。
即KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和Qemu。
Libvirt简单说就是 KVM 的管理工具。
其实,Libvirt除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。OpenStack底层也使用 Libvirt,所以很有必要学习一下。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API库和命令行工具 virsh
1. libvirtd是服务程序,接收和处理 API 请求;
2. API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具,后面我们也会介绍;
3. virsh 是我们经常要用的KVM 命令行工具,后面会有使用的示例。 作为 KVM 和OpenStack 的实施人员,virsh 和virt-manager 是一定要会用的。
CPU 虚拟化
KVM 的虚拟化是需要CPU 硬件支持的。
虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。看下图
即虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。 KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源。但在使用overcommit 的时候,需要对虚机的负载情况有所了解,需要测试。
内存虚拟化
KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。看下图
为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。虚机 OS 控制虚拟地址到客户内存物理地址的映射(VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。
内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存。但使用时也需要充分测试,否则性能会受影响。
网络虚拟化
这是 OpenStack 官网上给出的计算节点(可以理解为 KVM 的宿主机)虚拟网络的逻辑图,上面的网络设备很多,层次也很复杂。
网络虚拟化中最重要的两个东西:Linux Bridge 和 VLAN