OpenStack简介
# OpenStack简介
对OpenStack有所了解的从业者都知道,OpenStack是一个虚拟机管理平台,它是通过调用Linux系统上的API接口来创建虚拟机,也是通过相关的API接口来管理虚拟机,那么在学习OpenStack之前,我们先来看一下Linux上是怎么实现虚拟化技术的。
# 虚拟化和云计算
虚拟化技术最早是在1959年的国际信息处理大会上,由Christopher Strachey在他的报告《大型高速计算机时间共享》里第一次提到。
从20世纪60年代到20世纪70年代的大型机时代虚拟化技术开始被研究,那个时候比较出名的就是IBM的Systm/360大型机,因为那个时候的大型机还无法支持现代操作系统的多人多任务,大家使用机器资源的时候还需要提申请排队来使用。同时那个时候大型机的价格非常昂贵,只有一些大型科研院所、大公司等机构才能使用的起。为此IBM投入了大量的时间和精力来开发分时解决方案(Time sharing System)。实现用户能够同时共享一台大型机的计算资源,来提高机器的资源利用率。因为每个人跑的任务都不一样,你的任务不一定能把机器所有的资源都消耗完同一时间多余的资源其他人又用不了,那资源就浪费了。如果多个人可以同时使用机器的资源,那每个人平摊下来的机器成本就比单人使用机器资源更低了,大家甚至可以直接去租用资源,而不需要去购买一台昂贵的大型机。这个概念听起来是不是很熟悉?有点像现在云资源的使用模式了。
IBM当时开发的这套系统叫做虚拟机监视器(Virtual Machine Monitor,简称VMM),这个软件可以作为计算机硬件层上面的一个软件抽象层,可以把计算机硬件分割成一个或多个虚拟机,可以让多个用户能够同时交互地访问大型机的资源。这技术大大促进了大型机使用成本的降低以及大型机的普及, 使得IBM成为了20世纪的IT行业霸主。
# 20世纪80年代到20世纪90年代
随着大规模集成电路技术的高速发展,计算机开始快速小型化,同时计算机硬件也越来越便宜,让个人计算机得以快速普及,为共享大型计算机资源而生的虚拟化技术开始没落,只在部分高档服务器上存在。这个时候一家小公司都买的计算机给自己的员工使用,谁还愿意去租用别人的资源?
# 20世纪90年代末
随着x86技术的快速发展,x86平台处理能力与日俱增。1998年Intel针对服务器和工作站推出了专门的至强系列处理器(Xeon),性能极为强大,促进了企业数据中心的发展。但是随着基于X86架构的服务器硬件不断的升级,出现了新的难题:X86服务器的利用率太低,企业数据中心中平均利用率仅为总容量的10%到15%。而且企业通常在每台服务器上只运行一个应用程序,以避免出现应用程序出现故障或漏洞影响同一服务器上其他应用程序可用性。如果企业业务快速发展时,就需要不断采购新的服务器来支撑新的业务需求,物理采购成本和IT管理成本不断攀升,企业急需寻找一个新的保障IT投资最大化利用的解决方案,这个时候虚拟化技术又进入了企业的眼帘。
# 1999年
VMware公司成立,并于同年在x86平台上推出了可以流畅运行的虚拟化软件VMware系列,旨在解决X86服务器利用率低下的问题,将X86系统转变成通用的共享硬件基础架构。而同一年,伦敦剑桥大学的Ian Pratt和Keir Fraser在一个叫做XenoServer的计算项目中,开发了Xen虚拟机。Xen后面被思杰(Citrix)公司收购,推出了我们熟悉的XenServer。
# 2003年
Xen在2002年被正式开源后,在2003年面世,同年微软收购Connectix获得虚拟化技术,并将它集成到自己的WindowsServer系列,即我们熟悉的Hyper-V。
# 2005年
Intel发布新的志强7000系列处理器,x86平台历史上第一个硬件辅助虚拟化技术-VT(VanderpoolTechnology)诞 生。
# 虚拟化层级
在这几十年的发展过程中,虚拟化技术的演变过程大概可以分为这样3个阶段:
- 软件完全虚拟化
- 半虚拟化
- 硬件完全虚拟化
而这些阶段都是和CPU技术发展息息相关的(x86技术的发展),从前面的虚拟化简史中我们可以看到,虚拟化技术的大爆发,是发生在x86平台上,它的根本原因我认为是x86平台的设计,让它的资源部署可以更加灵活。同样一家数据中心,使用IBM的大型机一间机房里可能放不了几台,而x86平台则可以部署几十个机柜,资源部署和管理比大型机要灵活的多。
# CPU运行级别
在具体解释虚拟化各个阶段之前,我们先来看一下CPU运行级别这个概念。X86架构CPU默认提供4个特权级别给操作系统和应用程序访问硬件,根据权限从高到底排列依次是:
- Ring 0,操作系统运行在这个级别,可以使用特权指令、控制硬件中断、修改内存页表、直接访问硬件设备等。
- Ring 1
- Ring 2
- Ring 3,应用程序在这个级别,不能做受控操作。
应用程序要访问硬件,比如说读写硬盘上的文件,需要使用操作系统提供的函数接口来间接访问。在调用系统函数时,CPU运行级别会从Ring 3切换到Ring 0,跳转到对应的内核代码位置执行,内核帮你完成硬件设备的访问。访问完成后再从Ring 0切换到Ring 3级别,这个过程也称为用户态和内核态的切换。
但虚拟化在这个位置就遇到问题了,宿主机操作系统是直接运行在硬件上的,所以宿主机是在Ring 0级别,那么虚拟机就无法运行在Ring 0级别。同时它自身也不知道,只要你把它启动起来,它就会认为自己是在Ring 0级别,该执行什么指令还是执行什么样的指令。所以就需要虚拟机管理程序VMM来帮它解决这个问题。 虚拟机怎么通过VMM来实现对硬件的访问,就是虚拟化技术发展的3个阶段。
# 软件完全虚拟化
首先是软件完全虚拟化阶段,软件完全虚拟化指的是计算机里的CPU、芯片组、磁盘、网卡等设备全部都使用软件来模拟,因为是软件模拟的,所以理论上可以模拟任何硬件,甚至是不存在的硬件。但是因为所有指令都要经过软件转换,这种虚拟机的性能比较差,一般只用于理论研究,最具代表性的产品就是QEMU。
从图中可以看到,这个阶段,虚拟机操作系统是运行在Ring 1级别,当它在执行一些特殊指令的时候,就会触发异常,这个时候VMM负责捕获这些异常,并模拟它要执行的指令,将结果返回给虚拟机,让虚拟机能够正常运行。
那么有没有什么办法可以绕过这个模拟过程,让虚拟机可以直接访问底层的硬件呢?这样不就可以极大的提高虚拟机的性能吗?
# 半虚拟化
基于这样的思想,就出现了半虚拟化。半虚拟化指的是对虚拟机的操作系统内核进行改造,让虚拟机自己可以通过超级调用(hypercall)直接和底层的VMM通信,VMM也提供了超级调用接口来满足其他关键的内核操作,比如说内存管理、硬件中断和时间保持等等。代表产品就是思杰公司的Xen。
这种方案创建的虚拟机需要使用一个特殊的定制版内核,才能够正常和底层的VMM进行通信,因此只适用于Linux/Unix系统,不支持Windows系统,毕竟Windows是一个闭源系统,而且他还有自己的虚拟化工具,没必要主动去适配其他平台;
这种方案配置比较麻烦,因为每一个操作系统发行版更新以后,都需要Xen官方为你需要的操作系统及平台开发了对应的定制版内核以后才能使用。但是使用起来效率比软件全虚拟化要高的多,接近物理机的性能,因此这套方案目前很多大企业内部还在使用中。
# 硬件完全虚拟化
随着虚拟化市场的扩大,以及CPU技术的发展,在2005年的时候,Intel在志强7000系列处理器中引入了VT技术,VT技术在CPU上提供了两种模式VMX 特权操作(root operation)和VMX 非特权操作(non-root Operation),这两种模式都支持Ring 0 ~ Ring 3 共4个级别,这样VMM运行在VMX 特权操作模式下,虚拟机操作系统运行在VMX 非特权操作模式下,都可以运行在Ring 0级别,这两种模式可以互相转换。
运行在 VMX 特权操作模式下的 VMM 通过显式调用 VMLAUNCH 或 VMRESUME 指令切换到 VMX 非特权操作模式,硬件自动加载 Guest OS 的上下文,于是虚拟机操作系统可以运行,这种转换称为 VM entry,一般发生在虚拟机启动或者执行完虚拟机操作系统要求执行的特殊指令之后。虚拟机操作系统运行过程中遇到需要 VMM 处理的事件,例如外部中断、访问硬件设备,或者主动调用 VMCALL 指令调用 VMM 的服务的时候(与系统调用类似),硬件会自动挂起虚拟机操作系统,切换到 VMX 特权操作模式,恢复 VMM 的运行并执行虚拟机操作系统的请求,这种转换称为 VM exit,执行完成后调用VMRESUME再切换回VMX非特权模式。
和半虚拟化相比,硬件完全虚拟化不需要修改虚拟机操作系统,可以全面支持Linux、Windows、Unix等各种操作系统,就像直接在硬件上面运行虚拟机一样,因此得到了快速广泛的使用。虽然需要CPU在两种模式之间进行切换,需要一定的性能开销,但是它的所有操作都是在硬件上完成的,性能已经非常接近半虚拟化了。 这个方案典型的代表产品有:KVM/VMware ESXi/Microsoft Hyper-V等。Xen新产品系列也开始由半虚拟化转向使用硬件完全虚拟化。
# KVM的出现
KVM最初是由以色列的Qumranet开发,在2016年10月出现在Linux内核的邮件列表中,在2007年2月正式合入到 Linux 2.6.20版本内核中去,和内核一起发行。大家注意一下这个时间线,从2005年Intel发布VT技术支持硬件虚拟化开始,到2007年KVM合入内核,只用了不到2年左右的时间,就已经出现了一个支持硬件虚拟化技术且生产可用的虚拟机管理程序。西方的计算机技术积累厚度可见一斑。
在2008年9月,红帽收购了Qumranet公司,并开始在RHEL发行版中使用KVM来代替原来的Xen。从RHEL 6开始,KVM成为默认的虚拟化引擎。除了红帽以外,还有一个熟悉的产品Proxmox VE,简称PVE,它也是在KVM的基础上开发的一款虚拟化管理软件。
# KVM的架构
KVM依赖于CPU提供的硬件虚拟化功能,但是这里需要注意,因为KVM它只是一个虚拟化管理软件,是位于Linux系统内核中。从上面硬件完全虚拟化的架构中我们可以看到,它主要是和CPU打交道,用来处理一些特殊硬件指令相关的操作。而如果要运行虚拟机操作系统,光有CPU还是不够的,还需要内存、磁盘、IO设备等等。能不能自己开发?当然可以,但是有没有现成的工具可以使用呢,当然有,就是上面软件完全虚拟化方案的代表qemu,它可以模拟出各种设备,通过它和kvm的结合,就可以组合出一台可以运行的虚拟机操作系统了。因此现在kvm的发行包里都附带了qemu-kvm这个依赖包。
# Libvirt
到这个时候为止,能够实现虚拟机创建的技术已经有很多了,例如kvm、xen、hyper-v等等,那么如何实现对这些VMM创建的虚拟机进行统一管理呢?就像Linux操作系统上有多种文件系统格式,比如说ext4、xfs、brtfs等等,都可以通过VFS来对外提供统一的操作接口。而Libvirt就是这样一款工具,它是由红帽开发的,用来提供一个通用、稳定的抽象软件层,方便整个系统上统一管理节点上运行的虚拟机,不管你这个虚拟机是kvm创建还是xen、hyper-v等VMM创建的,都可以使用Libvirt提供的命令行工具virsh来进行统一管理,同时它还对外提供支持各种编程语言的API接口,让你可以开发出自己的虚拟机管理平台。
到这里,大家是不是就看到了一点云计算的雏形了?
# KVM的优势
到KVM成为RHEL 发行版默认虚拟化引擎的时候,市面上已经有很多虚拟化的商业产品,例如VMware ESXi、XenServer、Hyper-v等等,但是为什么KVM能够快速发展起来呢?从目前来看,KVM主要有以下优势:
- 开源免费,KVM是一个开源的项目,且现在已经跟随内核一起发行,使用起来没有成本,大家都可以基于它开发自己的虚拟机管理平台。而其他虚拟化产品大多是收费的,例如VMware、Hyper-V等,都有自己绑定的管理平台。
- 强大的技术支持,KVM随内核一起发行后,背靠Linux这颗大树,有无数的技术人员在给它提供免费的技术支持,同时还有红帽这样的大公司提供商业性的技术支持,对于大中小企业来说都值得信任。
- 性能,KVM一开始就是基于硬件完全虚拟化的方式来开发的,因此代码更加简洁,性能更加强大,它的总代码行数只有2万多行,同时使用它不需要针对虚拟机操作系统做任何修改。相对于同样免费且性能强大的Xen虚拟化方案,优势更加明显。
简单点说就是,比它体验好的都收费,对比之下当然是免费的更香。比它性能好的,没它使用简单,而且还可以自己管理,受自己控制的平台当然比受别人控制的平台要强。
# OpenStack的出现
随着虚拟化技术的快速发展,各大公司都陆续推出了自己的虚拟化产品,同时期国内实际上已经有很多云服务厂商基于KVM开发出了自己的云服务并推出了自己的商业化产品,例如当时国内比较有名的云厂商西部数码。他们的产品就是在KVM之上开发出的一套虚拟机管理系统并对外提供云资源的售卖。
但是在2010年,RackSpace公司和美国国家航空航天局(NASA)合作,RackSpace公司贡献出了自己的云文件平台代码,NASA贡献出了自己的Nebula平台代码,以Apache许可证开源了OpenStack。此后随着OpenStack的快速迭代,除了少数自研的厂家,国内外的云服务厂商都陆陆续续切换到了OpenStack平台上,进行二次开发,推出了自己的云产品。
随着OpenStack的快速发展,OpenStack的各大服务组件陆续成熟,形成以6大组件为核心,其他组件为附加的格局。
6大核心组件是:
- 认证组件Keystone
- 计算组件Nova
- 网络组件Neutron
- 存储组件Cinder
- 镜像组件Glance
- 面板组件Horizon
附加组件则是根据自己公司实际需要来采用,例如:
- 计量和监控项目Telemetry
- 编排组件Heat
- 物理机管理组件Ironic
等等,目前维护的附加组件多大几十个,我们肯定不会每一个组件都会学习。本次课程,我们先学习核心组件的基本使用,手动搭建出一个可以正常运行的OpenStack集群,然后再深入学习OpenStack核心组件的配置,理解它里面每个组件的原理。
# OpenStack的架构
OpenStack 6大核心组件协同工作的基本架构图如下所示:
从图中可以看到,中间是虚拟机,几大核心组件都围绕着他为他提供服务,Nova提供虚拟机的管理服务,Neutron为虚拟机提供网络服务,Glance为虚拟机提供镜像服务,Cinder为虚拟机提供存储服务。Horizon提供这些核心服务的管理面板,Keystone为这些核心组件提供认证相关的服务。这些组件互相协同,形成了这样一个虚拟机管理平台。
# 课程内容框架
整个课程内容框架如下所示:
- OpenStack简介
- OpenStack实验环境准备
- OpenStack计算节点安装和配置
- OpenStack认证服务Keystone服务详解
- OpenStack归置服务Placement服务详解
- OpenStack镜像服务Glance服务详解
- OpenStack存储服务Cinder服务详解
- OpenStack网络服务Neutron服务详解
- OpenStack计算服务Nova服务详解
- OpenStack创建虚拟机示例
- OpenStack虚拟机管理
- OpenStack面板服务Horizon服务详解
- OpenStack高可用集群配置
- 其他常用服务; 我们先讲解OpenStack组件安装配置需要的基本环境,然后依次讲解各个核心组件的安装和配置,搭建出一个控制节点,搭建完成后再配置一台计算节点,用来运行虚拟机,演示虚拟机的基本管理功能。然后我们再深入讲解OpenStack各大核心组件的内部结构组成以及它们的作用。
熟悉了所有核心组件后,带大家使用OpenStack官方提供的自动化配置工具kolla,搭建一个生产可用的高可用OpenStack集群,最后再介绍一些常用的附加组件。
KVM虚拟机管理实践
通过KVM来创建一个虚拟机,
通过python接口来创建一个虚拟机
通过上面的实例可以看到,在Linux上创建一个虚拟机已经非常简单了,在了解虚拟机的创建过程以后,我们就可以基于这个基础开发自己的虚拟机管理平台。OpenStack也是基于这样的理念开发出来的一套开源虚拟机管理平台。