OpenStack 学习手册 

OpenStack是一种免费的开源平台,帮助服务提供
商实现类似于亚马逊EC2和S3的基础设施服务。
OpenStack当前有三个核心项目:计算(Nova),对象
存储(Swift),镜像管理(Glance)。每个项目可以独立
安装运行,该文档将帮助您快速学习OpenStack。 


目录 
OpenStack背景现状 
OpenStack是什么?
OpenStack核心项目 
OpenStack版本信息 
OpenStack 功能 
OpenStack架构 
OpenStack项目架构一: Compute(Nova)的软件架构
Nova组件的作用 
Nova的硬件架构  
Nova功能介绍  
OpenStack项目架构二: Swift 架构 
Swift功能 
OpenStack项目架构三 – Glance架构 
Glace组件架构 
Glace组件架构特性 
OpenStack功能
Openstack创建instance 的流程 
OpenStack在企业中的应用 
新浪云计算加入开源云计算项目OpenStack
展望未来:OpenStack 发力



OpenStack背景现状 

OpenStack是由Rackspace Cloud和NASA(美国航天局)于2010年7月开始共同开发支持,
整合了Rackspace的Cloud Files platform和NASA的Nebula platform技术,目的是能为任何
一个组织创建和提供云计算服务。 

目前,超过150家公司参与了这个项目,包括Crtrix Systems, Dell, AMD, Intel, Cisco, HP等。 
OpenStack最近发布了Austin产品,它是第一个开源的云计算平台,它是基于Rackspace的
云服务器加上云服务,以及NASA的Nebula技术发布的。 似乎是作为对此的响应,Amazon
为新用户提供一年的AWS免费使用方式。在OpenStack发布Austin之后,微软也宣称Windows 
Server 2008 R2 Hyper-V可以与OpenStack整合。 微软会为Cloud.com提供架构和技术上的
指引,它会编写必要的代码,从而OpenStack能够在微软的虚拟平台上运行。 这些代码会
在OpenStack.org上提供。 

OpenStack是什么? 
OpenStack核心项目 
OpenStack是一种免费的开源平台,帮助服务提供商实现类似于亚马逊EC2和S3的基础设
施服务。OpenStack当前有三个核心项目:计算(Nova),对象存储(Swift),镜像管理(Glance)。
每个项目可以独立安装运行。另外还有两个新增项目:身份验证(Keystone)和仪表盘(Horizon)。 

OpenStack计算是一个云控制器,用来启动一个用户或一个组的虚拟实例,它也用于配置每
个实例或项目中包含多个实例为某个特定项目的联网。 

OpenStack对象存储是一个在具有内置冗余和容错的大容量系统中存储对象的系统。对象存
储有各种应用,如备份或存档数据,存储图形或视频(流媒体数据传输到用户的浏览器),
储存二级或三级静态数据,发展与数据存储集成新的应用程序,当预测存储容量困难时存储
数据,创造弹性和灵活的云存储Web应用程序。 

OpenStack镜像服务是一个查找和虚拟机图像检索系统。它可以配置三种方式:使用
OpenStack对象存储来存储图像;使用亚马逊S3直接存储,或使用S3对象存储作为S3访问
中间存储。 


OpenStack版本信息 
目前为止共有四个版本: 
1. Austin 
2. Bexar 
3. Cactus 
4. Diablo 
OpenStack 功能 
OpenStack能帮我们建立自己的IaaS,提供类似Amazon Web Service的服务给用户: 
1、普通用户可以通过它注册云服务,查看运行和计费情况 
2、开发和运维人员可以创建和存储他们应用的自定义镜像,并通过这些镜像启动、监控和
终止实例 
3、平台的管理人员能够配置和操作网络,存储等基础架构 

OpenStack 的优势是平台分模块化,由每个独立的组件组成,每个nova组件都可以单独安
装在独立的服务器上,各个组件之间不共享状态,各个组件之间通过消息队列(MQ)来进行
异步通讯。也可以通过选用合适组件来定制个性化服务,便于应用改进。使用apache协议
可以支持企业使用。 


OpenStack架构 
OpenStack项目架构一: Compute(Nova)的软件架构 
下图是Nova的软件架构,每个nova-xxx组件是由python代码编写的守护进程,每个进程
之间通过队列(Queue)和数据库(nova database)来交换信息,执行各种请求。而用户通
过nova-api暴露的web service来同其他组件进行交互。Glance是相对独立的基础架构,nova
通过glance-api来和它交互。 



Nova组件的作用 
nova-api是Nova的中心。它为所有外部调用提供服务,除了提供OpenStack本身的API规
范外,他还提供了兼容EC2的部分API,所以也可以用EC2的管理工具对nova进行日常管
理。 

nova-compute负责对虚拟机实例进行创建、终止、迁移、Resize的操作。工作原理可以简单
描述为:从队列中接收请求,通过相关的系统命令执行他们,再更新数据库的状态。 

nova-volume管理映射到虚拟机实例的卷的创建、附加和取消。 

nova-network从队列中接收网络任务,然后执行任务控制虚拟机的网络,比如创建桥接网络
或改变iptables 的规则。 

nova-scheduler 提供调度,来决定在哪台资源空闲的机器上启动新的虚拟机实例 

Queue为守护进程传递消息。只要支持AMQP协议的任何Message Queue Sever都可以,当
前官方推荐用RabbitMQ。 

SQL database存储云基础架构中的各种数据。包括了虚拟机实例数据,网络数据等。 

user dashboard是一个可选的项目。它提供了一个web界面来给普通用户或者管理者来管理、
配置他们的计算资源。 


Nova的硬件架构 
Nova采用无共享、基于消息的架构,我们能安装每个nova-xxx组件在单独的服务器上,这
样可以根据不同目的进行不同的配置安装 

单结点:一台服务器运行所有的nova-xxx组件,同时也驱动虚拟实例。这种配置只为尝试
Nova,或者为了开发目的进行安装。 
单结点:一台服务器运行所有的nova-xxx组件,同时也驱动虚拟实例。这种配置只为尝试
Nova,或者为了开发目的进行安装。 


1控制节点+N个计算节点:一个控制结点运行除nova-compute外的所有nova-services,然
后其他compute结点运行nova-compute。所有的计算节点需要和控制节点进行镜像交互,
网络交互,控制节点是整个架构的瓶颈,这种配置主要用于概念证明或实验环境。 


多节点:增加节点单独运行nova-volume,同时在计算节点上运行nova-network,并且根据
不同的网络硬件架构选择DHCP或者VLan模式,让控制网络和公共网络的流量分离。 

Nova功能介绍 
用户通过访问horizon(dashboard)请求资源,horizon会调用nova-api。OpenStack首先对用户
进行身份认证,这个功能通过keystone模块来完成。然后通过任务调度器(nova-scheduler)
确定在哪一个计算节点上创建新的虚拟机。所有的任务都会通过MQ来进行异步通讯。 

云管理员用户也可以通过Euca2ools来管理和创建虚拟机,因为OpenStack支持EC2和S3
接口。 

OpenStack项目架构二: Swift架构 
OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一。前身是
Rackspace Cloud Files项目。OpenStack对象存储是一个在具有内置冗余和容错的大容量系统
中存储对象的系统。对象存储有各种应用,如备份或存档数据,存储图形或视频,储存二级
或三级静态数据,发展与数据存储集成新的应用程序,当预测存储容量困难时存储数据,创
造弹性和灵活的云存储Web应用程序。 



Swift功能 
Swift使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。 
Swift提供的服务与AWS S3相同,可以用以下用途: 

1. 作为IaaS的存储服务 
2. 与OpenStack Compute对接,为其存储镜像 
3. 文档存储 
4. 存储需要长期保存的数据,例如log 
5. 存储网站的图片,缩略图等 

OpenStack项目架构三 – Glance架构 
OpenStack镜像服务提供OpenStack Nova虚拟机镜像的发现,注册,取得服务。通过Glance,
虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储(比如OpenStack
中swift项目)。 

Glace组件架构 
 Glance目前提供的参考实现中Registry Server仅是使用Sql数据库存
储metadata。 
 前端通过API Server向多个Client提供服务。 
 可以使用多种后端存储。Glance目前支持S3,Swift,简单的文件存储及
只读的HTTPS存储。 
 后续也可能支持其他后端,如分布式存储系统(SheepDog或Ceph) 
Glace组件架构特性 

1.基于组件的架构 :便于快速增加新特性 
2.高可用性:支持大负荷 
3.容错性:独立的进程避免串行错误 
4.开放标准: 对社区驱动的API提供参考实现 

OpenStack功能 
1、 Dashboard提供资源池管理功能, 通过资源池的方式对物理资源进行重新组织。 
2、 提供基于命令行的虚拟机在线迁移功能,拟机生命周期管理,例如创建、启
动、休眠、唤醒、关闭、迁移、销毁虚拟机。 
3、 将常用的运行环境保存为虚拟机模板,可以方便地创建一系列相同或者是相
似的运行环境,只能手动创建所需用户模板,类似Eucalyptus。 
4、 在计算资源允许的情况下提供高可用性、动态负载均衡、备份与恢复 
5、 对所有的物理机和虚拟机进行监控,生成报表并在必要的情况下发出预警,
监控和报表功能据说可以采用外围组件实现。 
Openstack创建instance的流程 
1. 用户向nova-api发送请求 

用户发送请求到nova-api,这里有两种: 
a.通过openstack api 
从 server.py's controller.create(): 
Python代码 
1. self.helper.create_instance(req, body, self.compute_api.create) 

create_instance_helper.CreateInstanceHelper() 查表获取基本信息 
b.通过ec2 api 
从cloud.py.run_instances() 

统一调 computer.api.create() 将新的数据插回去 
Python代码 
1. self._ask_scheduler_to_create_instance(context, base_options, 
2. instance_type, zone_blob, 
3. availability_zone, injected_files, 
4. admin_password, image, 
5. instance_id=instance_id, 
6. requested_networks=requested_networks) 


2. API 将处理好的数据通过MQ 转发给scheduler .(code from Computer.api) 

Python代码 
1. rpc.cast(context, 
2. FLAGS.scheduler_topic, 
3. {"method": "run_instance", 
4. "args": {"topic": FLAGS.compute_topic, 
5. "instance_id": instance_id, 
6. "request_spec": request_spec, 
7. "availability_zone": availability_zone, 
8. "admin_password": admin_password, 
9. "injected_files": injected_files, 
10. "requested_networks": requested_networks}}) 

3. Scheduler 获取信息并作出决定 哪一个host 可以来run instance. 

Python代码 
1. def __getattr__(self, key): 
2. return functools.partial(self._schedule, key) 

Python代码 
1. def _schedule(self, method, context, topic, *args, **kwargs): 
2. ....... 
3. rpc.cast(context, 
4. db.queue_get_for(context, topic, host), 
5. {"method": method, 
6. "args": kwargs}) 
7. LOG.debug(_("Casted to %(topic)s %(host)s for %(method)s") % locals()) 

4. Computer 从池中获取信息 并让 Networker 去准备一个ip ,让volume 准备卷, 然后初始
化相应的信息,例如创建image,映射device,创建domain, 并将domain 放入running pool中,
然后就进入等待直到instance 的状态变为running. 

a. networker 分配ip 
Python代码 
1. network_info = self.network_api.allocate_for_instance(context, 
2. instance, vpn=is_vpn, 
3. requested_networks=requested_networks) 

Python代码 
1. def allocate_floating_ip(self, context): 
2. return rpc.call(context, 
3. FLAGS.network_topic, 
4. {'method': 'allocate_floating_ip', 
5. 'args': {'project_id': context.project_id}}) 

b 让 volume 准备卷 
Python代码 
1. bd_mapping = self._setup_block_device_mapping(context, instance_id) 
2. def create(self, context, size, snapshot_id, name, description, 
3. volume_type=None, metadata=None, availability_zone=None): 
4. rpc.cast(context, 
5. FLAGS.scheduler_topic, 
6. {"method": "create_volume", 
7. "args": {"topic": FLAGS.volume_topic, 
8. "volume_id": volume['id'], 
9. "snapshot_id": snapshot_id}}) 

c call nova.virt.libvirt.firewall.IptablesFirewallDriver 建立网络规则 

d call libvirt 创建domian 并launch 
Python代码 
1. domain = self._create_new_domain(xml) 
2. def _create_new_domain(self, xml, persistent=True, launch_flags=0): 
3. if persistent: 
4. # To create a persistent domain, first define it, then launch it. 
5. domain = self._conn.defineXML(xml) 
6. domain.createWithFlags(launch_flags) 
7. else: 
8. # createXML call creates a transient domain 
9. domain = self._conn.createXML(xml, launch_flags) 
10. return domain 


e call virt.libvirt.connetion.spwan 等待 
Python代码 
1. def spawn(self, context, instance, network_info, 
2. block_device_info=None): 
3. .......... 
4. def _wait_for_boot(): 
5. instance_name = instance['name'] 
6. try: 
7. state = self.get_info(instance_name)['state'] 
8. except exception.NotFound: 
9. msg = _("During reboot, %s disappeared.") % instance_name 
10. LOG.error(msg) 
11. raise utils.LoopingCallDone 
12. 
13. if state == power_state.RUNNING: 
14. msg = _("Instance %s spawned successfully.") % instance_name 
15. LOG.info(msg) 
16. raise utils.LoopingCallDone 
17. 
18. timer = utils.LoopingCall(_wait_for_boot) 
19. return timer.start(interval=0.5, now=True) 




OpenStack在企业中的应用 
更多的企业不只是谈论OpenStack,而是在实际生产环境中部署它,包括Rackspace基于
Puppet的公有云。OpenStack自研发伊始,一直被视作云计算领域的Linux,其推动开放源
代码服务的努力得到了众多公司的支持。目前就有超过100个机构参与了代码库的建设,或
在其它方面参与该项目。新浪云计算将与OpenStack一起合力打造一套可以管理和配置各种
虚拟化技术的IaaS 平台,在开源代码库的建设方面将有着不小的贡献。 

新浪云计算加入开源云计算项目OpenStack 

新浪云计算宣布正式加入全球开源云计算项目OpenStack,选择OpenStack作为IaaS 平台解
决方案。作为OpenStack中国的积极推动者,这在很大程度上将推动OpenStack云开源代码
项目的发展。 

新浪云计算之所以选择OpenStack有这样几个理由: 

首先,OpenStack是完全用Python编写的唯一开源的IaaS 项目。与C/C++或Java 为基础的
项目比较,Python项目意味着更容易安装,修改,封装和调试。 

第二,因为它是开源的,在部署或升级过程中有错误发生时,通过阅读源代码,我们就可以
迅速找到原因,并修复它。 

第三,由于有Rackspace的参与,OpenStack实际上是由主机托管/服务提供商行业设计的,
因此它非常适用于公有云的大服务器、多租户的工作负载。另外,OpenStack成熟的功能性、
hypervisor无关性设计及其可扩展特性等,都让我们非常欣赏。 

新浪云计算正式加入OpenStack,成为参与这一全球最大的开源云计算服务研发项目的企业
与机构之中领先的IaaS 平台研发与业务运营的积极实践者,其贡献与意义将不言而喻。 


在最近OpenStack Essex的贡献者统计数据中,新浪在bugfix方面的贡献全球排名第九,在
中国公司对bugfix贡献的排名中也是首屈一指。 


而在OpenStack社区的活跃性方面,前三甲分别是其老东家Rackspace、Nebula,以及后来
者RedHat。从数据中看出,新浪云计算在带动国内广大云技术研发和使用者沟通交流方面,
也正积极推动OpenStack社区发展。 

OpenStack社区的活跃性排名 
同时,加入OpenStack,也将为新浪云计算提供更多与全球企业或研发机构交流、合作的机
会与渠道,向全球分享中国云计算技术的步伐将更加稳健。这也将极大的鼓舞国内广大云技
术研发和使用者,未来以OpenStack为代表的开源云端软件在中国将更加普及,国内更多企
业将从中受益。 

展望未来:OpenStack 发力 
IBM 和Red Hat可能很快就会加入到支持OpenStack的阵营当中,这将很大程度上推动这个
云开源代码项目的发展。IBM 对OpenStack表明态度,将要像多年支持Linux那样的级别去
支持OpenStack。 

IBM一直对开源技术有很强的支持力度,之前IBM已经加入OpenStack Foundation,成为其“白
金会员”。IBM 负责软件标准和云的副总裁 Angel Diaz表示,IBM 对OpenStack的支持是不
遗余力的。目前来看,OpenStack也很像Apache,未来可能取得同样的成功。 

Citrix 本周宣布,其CloudStack 开源软件将加入 Apache 软件基金会。同时,OpenStack在
周四也发布了其软件的新版本Essex。 

OpenStack与Puppet Labs整合引关注, 早期使用者认为Puppet的整合会提升OpenStack的
吸引力。“我无论如何都要部署OpenStack,因为我知道我可以用它的API写一个Puppet模
块” Joe Julian——一位Ed Wyse Beauty Supply公司的资深系统管理员在邮件中这样述说。“这
个整合使它更加吸引人因为它会节省我的部署上时间和金钱。” 

总的来说,OpenStack起步比较晚,但是社区活跃度和公司参与度很高,这也使得其技术更
新很快,有很大的上升空间。 

转载于:https://my.oschina.net/u/856651/blog/89197

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐