2010年7月,Rackspace和NASA合作发布了OpenStack。OpenStack每几个月就会发布一个新的版本,并以首字母从A到Z的顺序命名。OpenStack峰会和中国OpenStack黑客松活动也随之诞生。
本节以KVM为例简要介绍虚拟化技术。
Ⅰ型虚拟化:Hypervisor(管理程序)直接安装在物理机上,一般是一个特殊定制的Linux系统,虚拟机则在Hypervisor上运行。
Ⅱ型虚拟化:物理机上首先安装常规的操作系统,Hypervisor作为程序在操作系统上运行,并对多个虚拟机进行管理。
理论上来讲,Ⅰ型的性能要高,但Ⅱ型更为灵活。
Libvirt:KVM(Kernel-Based Virtual Machine,一种Ⅱ型虚拟化技术)的Hypervisor。包含后台服务程序Libvirt,可用于处理请求;API库,供高级开发使用;virsh,KVM命令行工具。
CPU虚拟化
KVM的虚拟化需要CPU硬件的支持,使用如下命令,如果有输出vmx或者svm,就说明当前CPU支持KVM虚拟化。
egrep -o'(vmx|svm)' /proc/cpuinfo
一个虚拟机在宿主机中以qemu-kvm进程的形式存在
,与其他进程一样服从调度;虚拟机中的每一个vCPU就是对应qemu-kvm进程中的一个线程
。vCPU的数量超过宿主机的物理CPU数的情况称为CPU超配(overcommit)。
内存虚拟化
KVM通过虚拟内存来共享物理内存,实现对虚拟机的动态分配。虚拟机操作系统中内存管理(以段页式为例)的虚拟内存映射关系为:VA(虚拟地址)->LA(线性地址)->PA(物理地址),此时的PA为虚拟机虚拟化的地址,不是实际上的物理地址;KVM需要负责实现PA(虚拟机)->PA(宿主机)的映射关系
。同样的,内存也存在超配的情况。
存储虚拟化
KVM的存储虚拟化是通过存储池(storage pool)和卷(volume)来管理的,存储池是宿主机上可见的一部分存储空间,卷是存储池中的一块空间,由宿主机以硬盘的形式分配给虚拟机。其中存储池可分为以下几种常见类型:
新建卷的常见格式与优点见下表:
文件格式 | 优点 |
---|---|
raw | 默认的原始磁盘镜像格式,移植性好,性能好,但不节省空间 |
qcow2 | 推荐使用格式,写时复制节省空间,支持多种功能 |
vmdk | VMWare的虚拟磁盘格式,兼容VMWare虚拟机 |
KVM通过/etc/libvirt/storage来得到所有存储池的相关信息,每个可用存储池都会在该目录下有个xml文件,默认会存在default.xml
网络虚拟化最为复杂,因此独立成节单独讨论。
Linux Bridge是Linux上用来做TCP/IP二层协议交换的设备,可简单理解为是虚拟机网卡与宿主机网卡连接的桥梁,会将来自宿主机的数据转发给特定虚拟机的网卡,也可以将虚拟机的数据转发到宿主机,并凭借宿主机的物理网卡与外网通信。
LAN(Local Area Network,本地局域网),通常使用Hub和Switch连接局域网内的计算机。一个LAN表示一个广播域,LAN中的所有成员都会收到任一成员发出的广播包。
VLAN表示Virtual LAN,一个带有VLAN功能的Switch能将自己的端口划分为多个LAN,逻辑上产生系列交换机。即实际上在同一个物理网内,但被逻辑地分为不同的网络区域,不同区域不能通过广播通信,但可以使用IP互通。
VLAN的隔离是二层上的隔离,即广播包无法跨越VLAN边界
目前的交换机都支持VLAN功能,但有不同的端口配置模式:
eth0是宿主机的物理网卡;与外网相连,eth0.1就是VLAN设备,其VLAN ID就是VLAN 1;veth0是虚拟网卡,eth0.1与veth0均挂在名为 br vlan1的Linux Bridge上。其他虚拟机同样的。其中VM0和VM1在同一个VLAN内,与VM2在不同的VLAN。
Linux Bridge+VLAN就相当于一个虚拟交换机,两者分别承担了交换和隔离功能的实现。
现阶段的云计算是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果,云计算基本涉及IT基础设施的所有服务,包括计算、存储、网络、虚拟化、高可用、安全等等领域,涉及范围广泛,不宜不易展开,在此仅作概述,留坑待补。
组件名称 | 简要介绍 |
---|---|
Nova | 计算服务,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求提供虚拟服务,负责虚拟机的创建、挂起、调整、销毁等操作,配置CPU和内存等信息。 |
Swift | 对象存储服务,通过内置冗余和高容错机制在大规模可扩展系统实现对象存储,允许进行存储或检索文件,可为Glance提供镜像存储服务,为Cinder提供卷备份服务。 |
Glance | 虚拟机镜像查找检索系统,支持多种虚拟机镜像格式,可创建上传镜像、删除镜像、编辑镜像基本信息等。 |
Keystone | 为OpenStack提供身份验证、服务规则和服务令牌,管理Domains、Projects、Users、Groups、Roles。 |
Neutron | 提供网络虚拟化技术,为其他服务提供网络连接,为用户提供接口。 |
Cinder | 块存储,为虚拟机运行提供稳定的数据块存储服务 |
Horizon | UI界面,各种服务的Web管理门户。 |
Ceilometer | 测量,为计费、监控以及为其他服务提供统计数据支撑。 |
Heat | 部署编排,提供模板定义的协同部署方式,实现云基础设施软件运行环境的自动化部署。 |
Trove | 数据库服务,为用户在OpenStack的环境提供可扩展和可靠的关系与非关系数据引擎服务。 |
Neutron、Nova、Glance和Cinder分别为VM(虚拟机)提供网络、计算、镜像和存储服务,相当于实体机的网卡、CPU与内存、操作系统和硬盘。Cellometer则计量各种资源的使用情况并提供统计信息给其他服务使用。用户可以通过Horizon的UI界面便捷管理虚拟机,Keystone则提供认证服务,给用户不同的访问与管理权限。Swift实现对象存储,对用户可实现云存储,对Cinder可提供卷备份服务,为Glance提供镜像存储服务,提高系统的容灾能力。
不同的服务内还有不同的组件,并对外提供了API,用户可以通过Horizon提供的UI界面或者http请求来调用相应服务。不同服务之间的相互调用也是通过http调用的。服务内的不同组件间的调用则是通过RPC(远程调用)实现的。
用户的不同权限访问是通过Keystone内的身份认证实现的,可以以管理员的身份在OpenStack平台上为其他用户进行注册。Nova是OpenStack内部至关重要的一项服务,其内部实现有计算、调度、监管、引导、对象存储组件,并通过高级消息队列协议与Cinder的调度组件进行数据传输。Neutron则分为代理、服务端、提供者、插件等组件,实现网络的交换与隔离的虚拟化。对用户的云存储而言,Cinder提供块存储服务;而Swift则提供对象存储,内部逐层实现记录有账户、容器和对象的数据库。
OpenStack的不同服务可以分布在多个物理节点上,也可以集中在一个物理节点。一般而言,根据不同物理节点的功能不同,将其分为四种:控制节点、网络节点、计算节点和存储节点。其中不同物理节点需要支持的服务和网络接口一般不同。
根据节点的名称,网络、存储、计算节点主要实现OpenStack平台的三大主要资源:网络(Neutron)、存储(Cinder和Swift)和计算(Nova,也可以扩展Celimeter审计资源使用情况);而控制节点则需要支持其他功能,例如身份认证(Keystone)、UI界面(Horizon)、镜像服务(Glance)等,同时控制节点需要支持数据库,以保存各类记录,为了更为便捷的部署与编排,控制节点可以扩展实现Heat服务。
网络接口的不同则是依据不同节点数据交换方的需要而确定。网络节点需要提供外部网络对整体服务的访问,故需要实现外部接口;而控制节点仅执行对其他节点的控制管理功能,因此只需要实现管理接口;控制节点外的其他节点除了接收控制信息的管理接口外,还会彼此之间传递数据,因此需要实现数据接口。
项目内部的不同服务进程之间的通信,必须通过消息总线。oslo(OpenStack Common Libraries).messaging实现了以下两种方式完成项目内部不同服务进程间的通信:
在OpenStack支持的消息类型(RabbitMQ、ZeroMQ等)中,大部分都是基于AMQP(Advanced Message Queue Protocol,高级消息队列)实现的。AMQP是一个异步消息传递所使用的开放层协议,主要包括消息的导向、队列、路由可靠性和安全性。
生产者(左侧)将消息发送给Exchange(Exchange有不同类型,如Direct、Fanout等,不同类型的Exchange使用不同的匹配算法),并由Exchange决定消息的路由,即决定消息发送给哪个Queue,然后消费者(右侧)从Queue中取出消息,进行处理。需要注意的是,Exchange本身不会保存数据,仅查看接收到消息的消息属性、消息头和消息体,并根据绑定(Binding)表转发到相应的Queue。
SQLAlchemy是基于Python的一款开源软件,提供了SQL工具包以及对象关系映射器(Object Relational Mapper,ORM),是联系Python和后台数据库的桥梁。
SQLAlchemy主要分为两部分SQLAlchemy Core和SQLAlchemy ORM。SQLAlchemy Core包括SQL语言表达式、数据引擎、连接池等,所有的实现都是以连接不同类型的后台数据库、提交查询和更新SQL请求、定义数据库类型以及定义schema等为目的。SQLAlchemy ORM提供数据映射模式,即把程序语言的对象数据映射成数据库中的关系数据,或者把关系数据映射成对象数据。
RESTful是一种互联网软件架构,其核心概念是资源,网络里的任何东西都是资源,每个资源有一个特定的URI(统一资源定位符),并用它来标识访问获取资源。资源的不同表现形式体现为资源的文件格式。网络中,在客户端和服务端之间互动传递的只是资源的表述,这个互动使用无状态协议HTTP,客户端的基本操作会使服务端的资源发生“状态转化”,也就是所谓的“表述性状态转移”。
OpenStack的各个项目都提供了RESTful架构的API作为对外提供的接口。API服务进程在接收到客户端的HTTP请求时,一个所谓的“路由”模块会将请求的URL转换成相应的资源,并路由到合适的操作函数上。OpenStack中的路由模块源自对Rails路由系统的重新实现。Rail路由系统采用MVC模式。在收到浏览器的HTTP请求后,Rails路由系统将这个请求指派到相对应的Controller。每个Controller对应一个RESTful资源,代表对该资源的操作集合,其中包含很多个action,每个action都对应一个HTTP的请求和回应。
WSGI(Web Server Gateway Interface,Web 服务器网关接口)是Python语言中所定义的Web服务器和Web应用程序或框架之间的通用接口标准。当处理一个WSGI请求时,服务端会为应用端提供上下文信息和一个回调函数,应用端处理完请求后,会使用服务端提供的回调函数返回响应。
WSGI将Web组件分为:Web服务端、Web中间件、Web应用程序。Web服务端用于接收HTTP请求,封装环境变量。Web应用程序是一个可被调用的Python对象,只接收两个参数,通常为environ和start_response。Web中间件同时实现了服务端和应用端的API,在两端之间起协调作用。
可以利用WebOb对WSGI的请求与响应进行封装,简化WSGI应用的编写。在WebOb中有两个重要的对象,一个是webob.Request,可以对WSGI请求的参数environ进行封装;另一个是webob.Response,包含了WSGI响应的所有要素。此外,webob.exc可以对HTTP错误代码进行封装。
Pecon是一个轻量级的WSGI网络框架,其设计思想并不是解决Web世界的所有问题,而是主要集中在对象路由和RESTful的支持上,并不提供对话和数据库支持,用户可自由选择其他模块相配合。
OpenStack的大部分项目采用所谓的协程(coroutine)模型。一个OpenStack服务只会运行在一个进程中,但可以利用Eventlet产生多个协程,并且协程只有在调用了某些特殊的Eventlet库函数时才会发生切换。
与线程类似,协程也拥有自己独立的栈和堆,与其他协程共享全局变量,但在同一时间只能有一个协程运行。协程的执行顺序和时间完全由程序自己决定。协程的实现主要是在协程挂起时保存当前寄存器,重新工作时再将其恢复,可以被理解为一个线程内的伪并发方式。
Eventlet是Python的网络库,通过协程的方式实现并发。在Eventlet中协程被称为GreenThread。由于Eventlet的局限,OpenStack考虑使用AsyncIO代替Eventlet。AsyncIO提供了一套用来写单线程并发代码的基础架构,包括协程、IO多路复用,以及信号量、队列、锁等一系列同步原语。
参考文献
[1] OpenStack入门科普,看这一篇就够啦!
[2] 《每天5分钟玩转OpenStack》CloudMan编著
[3] OpenStack百度百科
[4] 《OpenStack设计与实现》英特尔亚太研发有限公司 著
部分图源网络,侵删。