摘要 虽然网上有许多介绍OpenStack的文章,但是总感觉写得不够详细,或者说存在一些较难理解的部分。OpenStack有较好的官方文档,但是有近262页,笔者(渔童_ISLUB享有版权)在阅读官方文档的时候做了一些笔记,对文档提出了一些自己的看法和理解,有助于大家迅速的了解OpenStack的内部结构和工作流程。
背景知识
1 ************1、开始使用OpenStack************
1.1 【简介】
OpenStack:适合于为私有云或者公有云搭建大规模云配置平台
1.2 【Why Cloud】:
有些东西不是对我们一直有用,我们追求按需分配云的5个必备特征:
1、自给自足:尽可能少的人员干预
2、网络访问:所有的机器可以相互通信
3、资源池:许多人公用
4、可迅速简单扩容:因为数据在不断增长
5、可以度量的服务:因为需要按量收费
1.3 【三种服务类型】
云计算根据用户需要提供三种不同的服务类型。
1、SaaS(Software as a Service):把在线软件作为一种服务,比如邮箱。
2、Paas(Platform as a Service):把平台作为一种服务,比如在线的java编译器等
3、Iaas(Infrastructure as a Service):把硬件设备作为一种服务,比如网络虚拟机。
1.4 【云的分类】
1、私有云:单一的服务组织,可以在线也可脱机处理
2、公有云:为多个组织公用,一般有专门的云服务商提供
1.5 【What is OpenStack】
OpenStack is on a mission: to provide scalable, elastic cloud computing for both public and private clouds, large and small. At the heart of our mission is a pair of basic requirements:clouds must be simple to implement and massively scalable.
OpenStack为私有云和公有云提供可扩展的弹性的云计算服务,这种服务云必须是简单部署并且扩展性强。
1.6 【OpenStack的部件构成】
1、Object Store(Swift)提供对象存储
2、Image(Glance)为虚拟机镜像提供目录和存储空间,这一项服务是可选的
3、Compute(Nova)根据需要提供虚拟服务器
4、Dashboard(Horizon)为所有OpenStack服务提供基于网页的用户界面
5、Identity(Keystone)提供授权,并且为同一个特定的OpenStack下云服务提供服务目录
6、Network(Quantum)可插拔网络服务,连接多个OpenStack之间的网络
7、Block Storage(Cinder)提供连续的块级存储
1.7 【概念上的体系结构】
1、Dashboard(Horizon)提供一个web页面
2、Compute(Nova)存储和检索虚拟磁盘(images)并且连接上存放在Image(Glance)上的元数据。
3、Network(Quantum)为Compute(Nova)提供虚拟网络
4、Block Storage(Cinder)为Nova提供存储卷
5、Image(Glance)可以存放真实的虚拟机磁盘文件在Object Store(Swift)6、所有的服务授权都是通过Identity(Keystone)
以上只是一个简化的体系结构图,实际上要比这复杂得多
1.8 【逻辑体系结构】
1、终端用户可以通过web界面(Horizon)或者直接通过每一个服务的API进行通信。
2、所有的服务都是通过一个共同的源进行授权认证,以保证安全和一致性
3、单个的服务通过他们之间公用的API进行通信(除非他们之间需要管理员权限)
1.9 【Dashboard(Horizon)介绍】
Horizon使用的是Django web应用程序为用户和管理员提供一个管理OpenStack服务的接口。
1、Horizon通常通过Apache中的mod_wsgi搭建。代码分为可重复使用的python模块(和不同的OpenStack API进行交互)和展示模块(方便定制)
2、一个数据库,因为这主要用来存放其他服务的数据,存放自己的数据很少。
3、Horizon服务需要用户自己定制,要保证能够和每一个服务的公用API能够通信。
1.10 【Compute(Nova)】
Nova是OpenStack中最为复杂和分布式的部件。大量的进程合作,把终端用户的API请求运行在虚拟机中。下面是这些进程和他们的函数:
1、nova-api 接收和相应终端用户计算API的调用。支持OpenStack API,EC2 API和一些特殊的管理API。Nova-api还用于初始化一些事件(运行实例),执行一些策略(quota检查)。
2、Nova-compute进程主要是一个工作daemon,通过超级管理员API,创建和终止虚拟机实例(instance)。简单概括工作流程就是从队列中接收任务,然后执行一些列的系统命令,最后得出结果并且更新数据库中的状态。
3、Nova-volume 管理计算机实例(instance)的持久卷的创建,安装和拆卸。可以支持iscsi或者Rados Block Device in Ceph。Cinder已经替代Nova-volume的功能。
4、Nova-network用于从队列中接收网络任务,然后执行任务来管理网络(比如设置桥接或者修改iptable规则)。这个功能已经移植到Quantum,一个独立的OpenStack服务。Nova-network和Quantum有很多重复的功能(为什么要这样?)
5、Nova-schedule进程,从虚拟机实例请求队列中接收请求,然后决定在哪里执行。(具体讲就是那一台计算服务器host来执行)
6、队列为daemon之间传递的消息提供一个中心管理机制。目前使用RabbitMQ(一种消息管理队列),其他任何AMPQ消息队列都可以使用。
7、SQL数据库存放每一个云基础架构的编译和执行时的状态。包括可用的实例,正在用的实例,可以用的网络和工程。理论上讲,OpenStack Nova支持任何一种SQL-Alchemy支持的数据库,但是目前使用的是sqlite3,MySQL和PostgreSQL。
8、Nova提供Console服务,允许终端用户通过代理来访问他们虚拟实例(instance)的控制台。这个涉及到多个daemon(nova-console,nova-novncproxy 和 nova-consoleauth)
Nova和OpenStack很多其他服务进行交互,比如Keystone,Glance,Horizon。Glance的交互式核心。API进程可以上传和查询Glance,nova-compute则会根据需要下载镜像。
1.11 【Image Store】
Glance主要有四个部分:
1、Glance-api 接收image(镜像)的API调用,用于image的发现,恢复和存储。
2、Glance-registry (注册表)存放、处理和恢复image相关的元数据。
3、一个数据库,用于存放image的元数据。和Nova一样,用户可以选用自己偏爱的数据库(比如MySQL或者SQlite)
4、一个用于存放image文件的存储仓库(storage repository)。Swift就是image的存储仓库,但是这个也是可以配置的。除了Swift,Glance还支持普通的文件系统,RADOS块设备,Amazon S3 和HTTP。注意的是,这些选择都应该限制为只读(为什么?)
还有一些运行在Glance上的进程是为了支持Caching(缓存机制)。其中最重要的是replication(复制)服务,这是为了确保一致性和可用性。
在上面理论上的系统结构中可知,glance处于中心地位,它可以从终端用户或者Nova部件为image接收API请求,可以把磁盘文件存放在对象存储服务中(Swift)。
1.12 【Identity】
Keystone为OpenStack的策略(policy),目录(catalog),标示(token)和认证(authentication)提供一个整合。
1、keystone处理API请求,并且提供catalog,policy,token和identity的配置服务
2、每一个Keystone函数都有一个可插拔的后端,允许不同的方法来使用特定的服务。大部分支持标准的后端,比如LDAP或者SQL,还支持Key Value Stores(KVS)
大部分人通过使用这个作为他们目前认证服务的定制点。
1.13 【Network】
Quantum具有高可配置性,因为Quantum采用的是插件结构。插件结构能够适用于不同的网络配置和软件。简单的Linux网络插件如下
1、quantum-server 接收API请求,route他们到相应的quantum插件中执行。
2、Quantum 插件和代理执行实际的行动。比如安装和卸载端口,创建网络或子网和IP地址。常用的代理是L3(layer 3),DHCP和特定的插件代理。
3、大部分的Quantum安装都会使用一个消息队列来route(寻路) quantum-server和不同代理之间的信息。数据库也会为特定的插件存放网络状态。
Quantum会和Nova进行通信,Quantum会为instance提供网络和链接服务。
1.14 【Block Storage】
OpenStack Compute 中有关持久块存储的功能分离出来构成了Cinder。OpenStack 的块存储API允许操作卷,卷类型和卷快照。
1、cinder-api 接收API请求,把这些请求route到cinder-volume中进行处理
2、cinder-volume 读写Cinder数据库来保持状态,通过一个消息队列和其他进程进行交互,直接在块存储之上提供硬件或者软件。Cinder-volume可以通过驱动和不同的存储设备进行交互。
3、Cinder-scheduler,和nova-scheduler一样,选择合适的提供块存储的节点来创建卷(volume)。
4、Cinder的部署,也会使用一个消息队列来route(寻路) cinder进程之间的信息,数据库也会存放卷状态。
和Quantum一样,Cinder会和Nova相连接为instance(实例)提供卷
2 ********OpenStack Compute的详细介绍**********
OpenStack Compute(Nova)提供了一个构建云的工具,包括运行instance实例,管理网络,以及通过用户和工程控制云的接口。Nova提供的软件可以实现Iaas云计算平台,这很类似于Amazon的EC2和Rackspace的云服务器。Nova没有包含任何虚拟化软件,它只是定义了操作系统底层虚拟化机制的接口驱动,然后把这些功能通过网络API暴露(expose)出来。
2.1 【Hypervisors管理程序】
OpenStack Nova需要一个管理程序,并且Nova可以通过API服务器来控制这个管理程序。进程选择一个管理程序,通常是权衡优先级,并且根据预算,资源限制,必须支持的功能和所需的技术规格来做出决定。大部分都是通过KVM和基于Xen的管理程序。
通过OpenStack Nova,我们可以在不同的区域(zone)中使用多个管理程序来建立云。能够使用的虚拟化标准包括:
KVM-----Kernel-based Virtual Machine基于内核的虚拟机
LXC------Linux Containers(通过libvirt)
QEMU---Quik EMUlator
UML-----User Mode Linux
VMWare ESX/ESXi 4.1 update 1
Xen------Xen, Citrix XenServer and Xen Cloud Platform(XCP)
2.2 【User and Tenants(Projects)】
OpenStack Compute系统设计于为很多不同的用户提供服务,这些用户共享一个系统,使用基于角色的访问分配。不同的角色可以有不同的访问权限,这些权限都是管理员通过policy.json文件来进行配置的。用户能够访问的镜像有租用人(tenant)决定,但是每个用户都会有一个用户名和密码。用户对instance访问权限由键值对(key pairs)来保证,而对硬件资源的占有量是由租用人租用的资源大小来决定的。
说明:早期的OpenStack使用”Project”来代替”Tenant”的概念,因此,有些命令工具使用project_id来获取一个tenant的ID。
原版的EC2 API只支持使用users这个概念,但是OpenStack Compute中加入了tenants这个概念。Tenants是一个独立的资源容器,形成了计算服务中主要的组织结构。用户可以通过project_id就能获取tenant名。如果API请求中没有指定tenant,Compute会使用和user具有相同ID的tenant作为指定的tenant。
对于tenants,可以对以下内容进行定额限制:
1、可能创建的volume数目
2、所有卷的总容量(单位GB)
3、将要launch的instance数目
4、分配的处理器的核的数目
5、公开访问的IP地址
2.3 【images and Instances】
这一节将要对“什么是image和instance”和“云中的一个典型虚拟机系统的生命周期描述”进行更深层次的探讨。有很多种方法可以用于配置OpenStack云的细节和安装云中的虚拟机系统。
Image是为虚拟机文件系统提供模板的磁盘镜像。Glance是用于存放和管理镜像的。
Instance是一个运行在物理计算结点的独立的虚拟机。Nova用于管理这些Instance。很多不同的instance可能从相同的镜像中启动。每一个Instance都是基本Image的一个拷贝,所以Instance的运行时间的改变不会影响到基本Image镜像的时间。运行中的instance的快照将会根据当前特定实例的磁盘状态创建一个新的Image。
当启动一个Instance时,必须选择一组虚拟资源(Flavor)。Flavor定义了一个实例拥有多少个CPU,RAM的容量以及短暂的硬盘容量。管理员可以定制flavor的一系列参数。
额外的资源,比如持久卷和公用IP地址,可以从运行中的instance中增加或者删除。
下面的例子显示了一个OpenStack云搭建的典型虚拟系统,用于展示上面提到的观念。
2.3.1 【初始化状态】
2.3.2 【运行一个实例】
2.3.3 【结束状态】
2.4 【系统结构】
OpenStack Compute包括一系列主要部件:
1、一个云控制器:它包含很多部件,展示了全局的状态并且和其他所有的部件通信。
2、一个API服务器:为云控制器提供网络服务前端。云控制器提供计算服务资源和典型的计算服务。对象存储部件提供存储服务。
3、一个认证管理器:提供授权认证服务。使用keystone来区别不同权限的服务。
4、一个卷控制器:为每一个计算服务器提供快捷永久的块级存储
5、一个网络控制器:提供虚拟网络,使得计算结点直接可以进行通信,也可以和公有网络进行通信。
OpenStack是建立在一个无共享,基于信息的架构之上。你可以运行大部分部件在多个服务器上,包括一个计算控制器,卷控制器,网络控制器以及对象存储(或者镜像服务)。一个云控制器通过HTTP(Hyper Text Transfer Protocol)和内部的对象存储通信,但是它通过AMQP(Advanced Message Queue Protocol)。为了避免每一个部件在等待响应的时候相互阻塞,OpenStack Compute使用异步调用机制,当收到响应的时候会触发一个回调函数。
为了实现在同一个部件的多个拷贝上实现无共享特性,OpenStack Compute 把所有的云系统状态都保存在同一个数据库中。
【快存储和OpenStack Compute】
OpenStack提供了两种块存储。一个是短暂存储和持久存储卷。短暂存储只是存在于每一个实例的生命周期中,