Nova基础知识第二部分 OpenStack 新手指南
Nova?
它是提供云计算服务的IaaS
平台OpenStack
的的主要架构控制器。在美国国家航空航天局(NASA
)迈出了第一步。贡献给了OpenSource
并成为OpenStack
最重要组件。
它由多个组件构成,它们执行不同的任务,将最终用户的API请求转化为虚拟机服务。所有这些组件都运行在一个非阻塞的基于消息的体系结构中,并且可以从相同或不同的位置运行,只需访问相同的消息队列服务。
组件?
Nova
将虚拟机的状态存储在中央数据库中。这对于小型部署来说是最佳选择。Nova
正在向多个数据存储方向发展,以满足大规模的需求。
- Nova API:支持
OpenStack Compute
(计算)API
,Amazon EC2 API
和强大的管理API
(针对特权用户)。它用于启动大部分的编排活动和策略(如配额)。它通过HTTP
进行通信,将请求转换为通过Message Broker
和ObjectStore
的HTTP
进一步联系其他组件。这是一个用于路由和验证请求的WSGI应用程序。
- Nova Compute:
worker
守护进程(daemon
)从其Message Broker
接收命令,并使用Hypervisor
(虚拟机管理程序)的API
执行虚拟机创建/删除任务。它同时也更新数据库中任务的状态。
- Nova Scheduler(调度程序):决定为虚拟机请求分配哪些
Nova
计算主机。
- Network Manager(网络管理器):
worker
守护进程从其Message Broker
中选择网络相关的任务并执行这些任务。OpenStack
的Quantum
现在可以选择使用Grizzly
版本,而不是nova-network
。并且覆盖了维护IP
转发,网桥
和VLAN
等任务。
- Volume Manager(卷管理器):处理持久块存储卷的连接/分离到虚拟机(类似于
Amazon
的EBS
)。这是一个使用逻辑卷管理器的iSCSI
解决方案。这个功能已经被提取到OpenStack
的Cinder
中。网络管理器不干涉Cinder
的任务,但需要设置Cinder
来使用。
- Authorization Manager(授权管理器):为用户、项目和角色使用授权的
api
。它与_OpenStack
的KeyStone_
进行通信以获取详细信息。
- WebUI:
_OpenStack
的Horizo
n与_Nova
API
进行通信。
- Message Broker:
Nova
的所有组件都使用AMQP
协议以非阻塞回调的方式进行通信,该协议得到了RabbitMQ、Apache QPid
的支持。作为消息队列(Message Queue
),还有对ZeroMQ
集成的支持。它类似于所有Nova
组件共享和更新的中心任务列表。
- ObjectStore:这是一个简单的基于文件的存储(如亚马逊的
S3
)的镜像。可以用OpenStack
的Glance
来代替。
- Database (数据库):用于收集构建时间,运行虚拟机的状态。它详细介绍了可用的实例类型,可用的网络(如果
nova-network
)和项目的详细信息。可以使用SQLAlchemy
支持的任何数据库。它是所有Nova
组件的中央信息中心。
API风格
接口大多是RESTful
。 路由(python重新实现Rails路由系统)包将URI
映射到控制器类上的操作方法。
每个需要计算的HTTP
请求都需要特定的身份认证凭证。对于计算节点可以允许多个身份认证方案,提供者决定使用哪一个认证方案。
线程模型
使用了由 eventlet 和 greenlet 库实现的绿色线程(Green Thread
) 。这会导致OS
(操作系统)的单进程线程I / O
阻塞问题。虽然单线程很大程度上减少了竞争资源的条件,使用装饰者 @ lockutils.synchronized('lock_name'
)在可疑场景中进一步消除竞争。
如果任何操作是长时间运行的,那么它应该具有所需的进程状态位置触发eventlet
上下文切换的方法。如果有的话,下面的代码块将会切换到等待线程。如果没有其他线程在等待,将继续在当前线程没有任何运行。
from eventlet import greenthread greenthread.sleep(0)
MySQL
查询使用阻止主进程线程的驱动程序。在“Diablo
”发行版中,实现了线程池,但是由于引起bug
比带好的好处相比更大,而被移除了。
Filtering Scheduler(过滤程序)
简而言之,它是'nova-scheduler
'用来选择合适的nova-compute
主机来生成新的必需虚拟机的机制。它准备一个未经过滤的主机的字典,并考虑创建所需虚拟机请求的成本。然后它选择成本最低的主机。
主机根据虚拟机的配置选项加权。
由于对每个请求计算权重,所以对于客户来说,更好的做法是一起请求大量的所需实例。
消息队列用法
Nova
组件使用RPC与使用PubSub 的 Message Broker
进行通信。Nova
实现了rpc.call
(请求/响应,API
作为消费者)和rpc.cast
(一种方式,API
充当发布者)。
Nova API
和Scheduler
使用消息队列作为Invoker
(调用者),而Network
(网络)和Compute
(计算)则充当工人。Invoker
(调用者)模式通过rpc.call
或rpc.cast
发送消息。Worker
模式从队列中接收消息,并以适当的响应回应rpc.call
。
Nova
使用 Kombu库与RabbitMQ连接。
Hooks (钩子)
通过将命名的(hooks
)钩子添加到Nova
代码中,使开发人员能够扩展Nova
功能,作为装饰器,它会延迟加载插件代码匹配(hooks
)钩子名称(使用setuptools
entrypoints
,这是一个扩展机制)。hooks
类定义应该有前置和后置的方法。
当稳定性是一个变化因素时,不要使用hooks(钩子),因为内部API可能会改变。
Dev Bootstrap(开发引导)
准备开始贡献... 阅读(OpenStack维基百科HowToContribute)的详细信息。
为了跟上Nova
的脚步,系统需要有libvirt
和一个虚拟机管理程序(Linux
主机首选的xen
/ kvm
)。
$ git clone git://github.com/openstack/nova.git$ cd nova$ python ./tools/install_venv.py
这将为您准备使用virtualenv
的nova
codebase
副本,现在任何你想运行在所需的代码库上的命令都有了。
$ ./tools/with_venv.sh
运行我的测试
要运行nose
测试和pep8 checker
,当你完成virtualenv
设置(或者这将首先在这里启动)...在'nova
' codebase
(代码库) 中
$ ./run_tests.sh
术语
- 服务器:在计算系统内部创建的虚拟机,需要Flavor和镜像细节。
- Flavor:表示具有磁盘空间,内存和
CPU
时间优先级的独特硬件配置 - 镜像:用于创建/重建服务器的系统镜像文件
- 重启:软件服务器重新启动发送正常关机信号。硬件重启电源重置。
- 重新构建:删除服务器上的所有数据,并用指定的镜像替换它。服务器的
IP
地址和ID
保持不变。 - 调整大小:将现有的服务器转换为不同的 flavor。所有调整大小需要明确确认,只有这样才能删除原始服务器。24小时后。可能会有延迟,之后有一个自动确认机制。