Openstack是一个跟Eucalyptus,AWS(Amazon web Services)类似的IaaS框架,目前它包括三个主要的项目:Nova,Swift,Glance。下面分别对3个项目做简单介绍:
Nova:提供虚拟服务器后的需求、主要是为虚拟服务器提供自动创建和管理,负责管理所有的资源、网络、认证以及可扩展性。与amazon的EC2和Rackspace的云服务器类似。
Swift:提供对象/blob存储,该项目类似于Rackspace的云文件存储和Amazon的S3.
Glance:是一个镜像项目,为Nova的虚拟机镜像提供发现,检索和存储功能。
从上图,我们可以清晰的看到,该概念性架构层次清晰,用户可能有开发者,普通的用户,及其管理员,分成了5个层次:
表示层:组件这里与用户交互,接受和提供信息。在这一层,框架为非开发人员提供门户网站和为开发人员提供API。
逻辑层(控制层):提供我们的云智能和控制功能。这一层将内部业务流程(对应于复杂任务的工作流程),调度(确定资源工作的映射),政策(配额等),镜像注册表(实例镜像的元数据),日志(对事件进行记录)。
资源层:为整个框架提供提供网络,计算,存储等资源。
管理层:为云框架管理者提供管理和监控功能。
集成:框架提供集成功能,比如服务提供商已经有一个客户的身份和计费系统。任何云架构将需要与这些系统集成。
nova-api :起到Cloud Controller的作用,主要为所有的API查询提供了一个接口(比如Openstack API ,EC2 API),引发多数业务流程的活动(如运行一个实例),并实施一些政策(主要是配额检查)。
疑问:具体如何工作??
nova-schedule :接受一个消息队列的虚拟实例请求,通过算法决定该请求应该在那台主机上运行,这个算法可以由我们指定。即起到调度器(Scheduler)的作用.
nova-compute:是一个非常重要的守护进程,负责创建和终止虚拟机实例,即管理着虚拟机实例的生命周期。该模块内部非常复杂,基本原理是简单的,就是接受来自队列的动作然后执行一些列的系统操作(如启动一个KVM实例),并且更新数据库的状态。
疑问:更新数据库的一些什么状态?
nova-network :该守护进程跟nova-compute and nova-volume 2个模块的功能是相似的。接受来自队列的任务,然后执行相应的任务对网络进行操作(比如:安装网桥接口和改变iptable规则)
疑问:网桥结构是如何的,iptable的内容是什么呢?
Queue:为各个模块之间的通信提供起到一个集线器的作用,即数据交换中心。目前是采用RabbitMQ ,理论上是可以采用任何的基于python ampqlib的AMPQ message queue。
SQL database:存储云基础设施构建时和运行时状态。包括可用的实例类型,正在使用的实例类型,可用的网络和项目。理论上,OpenStack Compute是支持所有基于 SQL-Alchemy的数据库,但目前广泛使用的数据库主要是Sqlite3,Mysql,PostgreSQL。
疑问:具体存储的这些内容的那些具体参数呢?
Glance:该项目独立于Openstack Compute,起到镜像的作用。在该项目中,主要包括三个部分: glance-api, glance-registry and 镜像存储。Glance-api接受API调用,glance-registry存储和检索镜像的元数据。镜像存储Image blobs。存储可以选择不同的存储方案,比如用Swift实现存储。
Dashboard:该项目是一个可选的项目,主要是为开发者等提供API。
针对上面地各个模块,在nova项目包中有相应的源代码结构如下:
nova.api.ec2:实现Amazon EC2 AWS的API。注意euca2ools就是通过这个API接口实现对云平台的管理
nova.api.openstack:实现Openstack的API。nova-manage使用该接口,这是Openstack云管理平台的标准,目前还在制定过程中。Openstack网站上的“OpenStack Compute Developer Guide API 1.1”就是描述的这个部分。由于这一部分还在进化过程中,我们不能完全地据此进行。
nova.auth:与认证和授权的相关内容都在这里。基本按照Amazon EC2的IAM结构进行管理的。
nova.cloudpipe: 为project创建VPN服务器的代码。从代码上看,VPN实际上是云中一个tiny类型的虚拟机,在上面有一个VPN服务器。
nova.compute: 计算节点的相关代码,api.py中定义了compute节点的详细接口。Api.py将请求转化成在AMQP消息发送出去,交给manager.py中的ComputeManager去运行。
nova.console:没太搞明白,这里的console是个什么呢?是ssh的接口吗?
nova.db:数据库操作
nova.image: image管理的代码都在这里。service.py定义了image管理的相关接口,后端有三个driver: glance, local, 和s3. 分别使用不同的后端存储来存放image。service.BaseImageService定义了image管理的接口。每个成员方法都有详细的描述。
nova.ipv6: ipv6地址操作类
nova.network: 与网络相关的配置都在这里
nova.notifier: 事件通知器,就目前的代码来看,这个通知器好像还没有被使用起来。
nova.objectstore:基于本地文件的一个object store,与swift是什么关系呢?
nova.scheduler:各种Scheduler。。。
nova.test:各种test。
从上图可以看出,根据设计该框架的预想,目前还有集成层的计费系统,跟身份系统和逻辑层的日志系统还未实现。其他部分均由了相应的是实现。
根据上图,下面简单对各个模块进行简单的描述:
Cloud Controller:由许多组件构成,代表了全局状态,并且负责和所有其他组建的交互。
API Server:为Cloud Controller担当一个Web Service的前端角色.
Compute controller:提供计算服务。
Object Store:提供存储服务。
Auth manager:提供认证与授权服务。
Volume controller:为计算服务器提供快速,跟持久化块级存储。
Network controller:提供了计算服务器之间及其计算服务器和公共网络之间的交互。
Scheduler :选择一个合适的实例的计算控制器。
OpenStack Compute 是一个无共享,基于消息的框架。Cloud Controller与Object Store之间通过HTTP进行交互,与Network controller,Volume controller,Scheduler 之间采用 AMQP进行交互,为防止阻塞,OpenStack Compute采用异步调用机制。
二. Openstack Compute的一些具体功能及其模块介绍
角色有全局角色和项目角色2种。一个用户对特别的镜像的访问是受项目限制的(即只有一些相应的项目才能访问到相应的镜像),为每一个用户分配密钥跟私有密钥,用户可通过密钥对去访问实例。对项目的资源配额是具体到每一个项目的。
Openstack采用 Role-Based Access Control (RBAC) model 来进行权限管理,分为5种权限:
admin(clound administrator):全局的角色,享有和管理nova的所有访问权限。
itsec(It security): 限于IT安全管理人员,允许隔离所有project的实例。
project manager:项目权限,提供添加用户到一个项目的权限,终止和启动实例,查询project images。
netadmin(network administrator): 项目一级的角色,允许分配和分配IP地址,创建和修改防火墙规则。
Developer :默认的一个角色。
目前,nova支持三种网络,前2种均是将所有的虚拟机连接到一个网桥,没有实现访问权限的控制,第3种为每一个项目建立一个VLAN,每一个项目的虚拟机连接到一个网桥,用户通过密钥等才能访问项目,3种模式具体说明如下:
Flat Network Mode:由网络管理员指定子网。虚拟机实例的ip地址从子网中抓取,并且在启动时是注入到镜像。每个实例从可用地址池中获得一个固定ip(Fixed IP)。一个网络管理者必须在管理网络的网络控制器上和管理实例的云控制器上配置Linux网桥。系统所有的实例都连接到同一个桥,由网管手动配置。
说明:通过对每台虚拟机分配固定ip地址,让他们都连接到一个桥,没有实现访问的权限控制。
Flat DHCP NetworkMode:通过DHCP Server从子网中为虚拟机分配ip地址。虚拟实例的ip地址从网管分配的子网中抓取。像Flat Mode,所有的实例都连接到一个网桥。此外一个DHCP Server 运行服务于所有配置的实例。在这种模式里面,compute做了多一点的配置就是尝试桥接到一个以太网设备上。
说明:用工具DHCPServer为虚拟机分配ip地址,让他们都连接到一个桥,没有实现访问的权限控制。
VLAN Network Mode(默认模式):在这种模式中,Compute为每一个项目创建一个VLAN和网桥。对于多机器安装,VLAN Network Mode需要一个支持VLAN标记的交换机,该项目获得一个范围内的私有ips,该范围的ips仅VLAN内能够访问。为了让一个用户访问在他们项目内的实例,一个专门的VPN的实例(code named cloudpipe)需要被创建。Compute产生一个用户访问VPN的认证跟密钥,并且自动开始VPN。它为每一个项目实例提供了私有网段。这些实例能够通过来自于互联网的VPN被访问。在这种模式里面,每个项目拥有他们自己的VLAN,Linux网桥,和子网。子网由网管分配,当需要时被动态分配到项目。DHCP Server会为每一个项目从相应的子网中为每个虚拟机分配ip。属于一个项目的所有实例被桥接到相同的VLAN,当需要的时候,OpenStack Compute会创建Linux网桥和VLANs。
注:该方式为每个项目建立一个VLAN,项目内所有的实例桥接到该VLAN,用户通过密钥可以访问该项目。
Cloudpipe:是一个特别的VPN实例,在VLAN networking mode 中,Cloudpipe是将终端用户连接到他们的项目实例的一种方法。
Cloudpipe的支持代码实现了管理命令(通过nova-manage)来自动为一个项目创建一个虚拟机,这个虚拟机允许用户进入他们项目的私有网络。访问这个通过项目的网络主机提供的一个公共端口。这允许用户自由地访问项目中得虚拟机而不用把他们的机器暴露给公共网络。
Cloudpipe镜像实际上是一台安装了open的linux实例。它需要一段简单脚本用于从metadata server上获取用户数据,b64解码成一个zip文件,运行zip文件的autorun.sh脚本。
这autorun脚本将配置和运行open,运行使用来自nova的数据。
创建一个Cloudpipe的镜像:
1在一个linux镜像上安装open;
2在/etc/open下安装一个server.conf.template;
3在/etc/open下设置up.sh,down.sh.
4在系统启动时,从/etc/rc.local下载并且运行payload(有效负载)。
5 安装配置/etc/network/interfaces。
6 在flagfile文件(nova.conf)中注册镜像和设置镜像id:
--_image_id=ami-xxxxxxxx
7 在flagfile文件(nova.conf)中配置其他一些s参数:
--use_project_ca
--cnt__clients=5
8 用nova-manage设置一些参数:
设置密钥对
创建一个安全组
为创建一个证书和私钥并且保存在CA/projects/
VPN访问:在VLAN模式,每个私有的第一个IP是为cloudpipe实例保留的。给这个指定ip给该实例目的是让nova-network能够创建来自外部的访问的转发规则。每个项目的网络在网络主机上面为其给了一个高编号的端口。在实例上,这个端口将自动转发到1194端口。
创建网络
1. 创建子网:如nova-manage network create 192.168.0.0/24 1255
Vlan方式网络创建
1. 首先配置nova.conf文件,--network_manager=nova.network.manager.VlanManager。
2. 用命令创建4个vlans网络:
nova-manage--flagfile=/etc/nova/nova.conf network create 10.1.171.0/24 1 256
nova-manage--flagfile=/etc/nova/nova.conf network create 10.1.172.0/24 1 256
nova-manage--flagfile=/etc/nova/nova.conf network create 10.1.173.0/24 1 256
nova-manage--flagfile=/etc/nova/nova.conf network create 10.1.174.0/24 1 256
3. 登录数据库,去设定每个VLAN的网络ID。同时数据库中涉及到的更新字段包括vlan,bridge(br_vlan), gateway, dhcp_start, reserved(属于表fixed_ips)。
4. 为项目创建项目管理器:
nova-manage --flagfile=/etc/nova/nova.conf user admin $username
创建一个项目,并且将上面的user做为其管理员:
nova-manage --flagfile=/etc/nova/nova.conf project create $projectname $username
获得为这个项目分配网络的凭据:
nova-manage --flagfile=/etc/nova/nova.confproject zipfile $projectname
$username
实例的IP地址分配跟关联:将一个保留ip分配给一个实例:
euca-associate-address –i [instance_id] [floating_ip].并且将这个ip从池中删除。当想将ip跟实例断开时:
euca-disassociate-address [floating_ip]
euca-deallocate-address [floating_ip]
关联公共IP:Openstack对于公共IP使用NAT。
将一个网络从项目中删除:nova-manage project scrub projectname。
云管理主要用到2种工具: nova-manage 和 Euca2ools 。前者仅能被拥有管理员权限的人使用,而后者可以被所用的用户使用。
镜像可以用于发现,登记检索虚拟机镜像,镜像服务提供了一个 RESTful API,该API提供了一个查询VM image元数据和检索实际的镜像, Image的框架涉及到2个重要的部分:API Server,Registry Server(s)。通过 euca2ools 对镜像进行添加,绑定,删除操作。有2种方式提供镜像服务OpenStack Image Service(Glance)和 nova-objectstore service,镜像存储可以通过S3,OpenStack Object Storage(Swift),和本地文件系统。OpenStack 只接受 ext4 文件系统格式的镜像。
一个实例就是一台虚拟机。由OpenStack Compute管理实例的生命周期。
Openstack支持多种监视器,常用的涉及到2种虚拟机监视器:XEN,KVM,系统默认选择的KVM。
Nova能够产生2种证书:一种是用于绑定镜像的CA证书,另外一种是用于设置euca2ools工具的环境变量。
配置日志,配置管理系统(Hypervisor)(默认情况下是KVM,可以的配置项有kvm, qemu, uml, xen),ipv6地址,镜像跟存储,live migration,数据库,消息系统,认证跟授权。
三 nova中的数据库跟RabbitMQ
地区(zone):一组可用性区域,构成了单独一个地理上得集群。
可用性区域:相当于数据中心。
共有29张表,包括可用的实例类型,正在使用的实例类型,可用的网络和项目,密钥证书等内容。具体表如下:
表 名 |
表的作用 |
auto_tokens |
所有API事物认证令牌相关参数 |
certificates |
x509证书相关参数 |
compute_nodes |
运行的计算结点服务相关参数 |
console_pools |
|
consoles |
实例控制台会话 |
export_devices |
|
fixed_ips |
分配的固定ip |
floating_ips |
动态ip |
instances_action |
客户端实例的创建,更新,删除等动作和结果相关参数 |
instance_metadata |
实例元数据key/value对 |
instance_types |
实例类型相关,有五种实例:m1.medium,m1.tiny,m1.large,m1.xlarge,m1.small |
instances |
客户端虚拟机实例相关参数,包括相关属性跟动作 |
iscsi_targets |
主机的iscsi 目标器 |
key_pairs |
存储密钥对的相关信息,私钥发给用户公钥存储数据库 |
migrate_version |
|
migrations |
运行实例迁移 |
networks |
网络相关的参数 |
projects |
项目相关的参数 |
quotas |
项目的配额 |
security_group_instance_association |
|
security_group _rules |
|
security_groups |
|
services |
在主机上运行的服务 |
user_project_ association |
|
user_project_role _association |
|
user_role_ association |
|
users |
用户相关参数 |
volumes |
块存储设备 |
zones |
|
2.9该项目涉及到的一些名词
WSGI(Web service gatewayinterface):
RabbitMQ:一个独立的开源实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、 ActionScript、XMPP、STOMP等,支持AJAX。RabbitMQ发布在Ubuntu、FreeBSD平台。
euca2ools:
AMQP (AdvancedMessage Queue Protocol):高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全性要求很严格。
Puppet:
Chef:
Vagrant:
GitHub:
VirtualBox:
VPN:利用公共网络建立虚拟私有网。
NAT: Network Address Translation, 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中.
OpenVPN: VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。OpenVPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1协议。
NAT(Network Address Translation):
iSCSI:iSCSI技术是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。iSCSI 的主要功能是在 TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器 target)之间进行大量数据的封装和可靠传输过程。此外,iSCSI 提供了在 IP 网络封装 SCSI 命令,且运行在 TCP 上。
HDD:
Role-basedaccess control (RBAC):
Django:一个基于Python些的一个开源框架。
Ext4(Ext4是一种针对ex:t3系统的扩展日志式文件系统,是专门为Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版)。
DHCP server:能够指定IP给其它局域网中的电脑,让每一台电脑都连在TCP/IP的通讯协议下,各有其独立的IP,自成一个网段。而透过DHCP Server的管理,你能够设定IP的分配范围,与清楚的了解目前各台电脑被分配到的IP与网卡编号等信息。
Libvirt:一套免费、开源的支持Linux下主流虚拟化工具的C函数库,其旨在为包括Xen在内的各种虚拟化工具提供一套方便、可靠的编程接口,支持与C,C++,Ruby,Python等多种主流开发语言的绑定。当前主流Linux平台上默认的虚拟化管理工具virt-manager(图形化),virt-install(命令行模式)等均基于libvirt开发而成。
公共文件
flags.py:项目全局相关的常数,具体模块的参数由各个模块自己定义。
rpc.py:远程调用,涉及到用rabbitmq实现的一些通信方式。
utils.py:系统级工具和帮助函数。
Scheduler模块:
manager.py:调度服务的所有管理,通过此文件完成。
zone_manager.py:监督所有的和子区域的通信。
chance.py:随机调度器接口。
driver.py:
chance.py:调度器的一种实现方式,即随机调度,可以实现其他不同的算法,实现相应的调度方式。
zone_manager.py:负责子区域(child zone)的信息的操作,包括获取及其更新等。
Db模块
api.py:所有的数据库操作动作,在该文件里调用sqlalchemy/api.py里的相应的方法。
sqlalchemy/models.py:项目的对象关系映射文件。
sqlalchemy/api.py:直接与数据库交互的文件。
sqlalchemy/session.py:数据库操作涉及到的会话处理文件。
Compute模块
Manager.py:处理所有跟实例相关的进程。管理实例的生命周期,运行,暂停,重启动等,检查实例的状态;救援实例;锁定,解锁实例;存活迁移相关操作;连接实例跟卷和断开实例和卷等
Power_state.py:虚拟机运行状态的文件。涉及到运行状态的一些常量。
Virt模块:
Connection.py:虚拟化设备的API文件
Driver.py:连接虚拟化设备的驱动文件(跟数据库类似,连接需要驱动程序)。
Xenapi.py:与xen server 或xen 云平台建立连接文件。
Libvirt_conn.py:通过libvirt建立到监控程序的连接,支持KVM, LXC, QEMU, UML, and XEN。
Vmwareapi.py:建立到VMware ESX 平台的连接文件。
Network模块:默认情况下,ComputeManager使用的网络管理器是VlanManager。
Manager.py:负责为实例分配ip和安装网络。有多种后端驱动处理各种网络拓扑,所有的网络命令都由NetworkManager的子类发出。
Linux_net.py:网络模块的驱动文件,使用linux工具实现了vlans,briges,iptables的相关操作。
Volume模块:
Manager.py:管理创建,连接,分离持久化存储。