目录
简介
Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。
用途与功能 :
(1)实例生命周期管理
(2)管理计算资源
(3)网络和认证管理
(4)REST 风格的 API
(5)异步的一致性通信
(6)Hypervisor 透明:支持Xen,XenServer/XCP,KVM, UML, VMware vSphere and Hyper-V
Nova 处于 Openstak 架构的中心,其他组件都为 Nova 提供支持: Glance 为 VM 提供 image Cinder 和
Swift 分别为 VM 提供块存储和对象存储 Neutron 为 VM 提供网络连接。
Nova组件中各个子服务
1、Nova API :
HTTP服务,用于接收和处理客户端发送的HTTP请求
NOva-api对接受到的HTTP API请求做以下处理:
(1)检查客户端传入的参数是否合法有效
(2)调用nova其他服务来处理客户端HTTP请求
(3)格式化nova其他子服务返回结果并返回给客户端
nova-api是外部访问并使用nova提供的各种服务的唯一途径,也是客户端和nova之间的中间层。
2、Nova Cell :
Nova Cell子服务的目的便于实现横向扩展和大规模的部署,同时不增加数据库和RPC消息中间件的复杂度。在Nova Scheduler服务的主机调度的基础上实现了区域调度。
产生原因
- 当openstacknova集群的规模变大时,数据库和消息队列服务就会出现瓶颈问题。Nova为提高水平扩展及分布式、大规模的部署能力,同时又不增加数据库和消息中间件的复杂度,引入了Cell概念。
- Cell可译为单元。为支持更大规模的部署,openstack将大的nova集群分成小的单元,每个单元都有自己的消息队列和数据库,可以解决规模增大时引起的瓶颈问题。在Cell中Keystone.Neutron.Cinder.Glance等资源是共享的。
架构
Cell结构中主要分为 API Cell(Parent Cell )以及 Child Cell 两种形式,其中,API Cell 主要包含的服务如下: AMQP、Broker、Database、nova-cells、nova-api、Keystone;Child Cell主要包含的服务有:AMQP、Broker、Database、nova-cells、nova-scheduler、nova-network、nova-compute、Keystone。
每一个Cell 包含独立的 Message Broker 以及 Database,其中 API Cell 主要包含 nova-api服务,用于接收用户请求,并将用户请求通过 message 的形式发送至指定的 Cell。Cells 之间的通信主要通过传递 message实现的,API Cell 会将用户的请求合成一个含有指定 Child Cell 的 message,含有请求的 message 会在 Children Cells 中间进行路由,直至指定的 Cell 节点进行处理。Child Cell 包含除 nova-api 之外的所有nova-*服务,实现具体的 Nova Compute 节点服务;API Cell 与 Child Cell 共享 Glance 服务,且各Cells 之间的通信均通过 nova cells 服务进行。
3、Nova Cert :
用于管理证书,为了兼容AWS。AWS提供一整套的基础设施和应用程序服务,使得几乎所有的应用程序在云上运行
4、Nova Compute :
Nova组件中最核心的服务,实现虚拟机管理的功能。实现了在计算节点上创建、启动、暂停、关闭和删除虚拟机、虚拟机在不同的计算节点间迁移、虚拟机安全控制、管理虚拟机磁盘镜像以及快照等功能。
支持方式:
通过Driver (驱动)架构支持多种Hypervisor虚拟机管理器
- 面对多种Hypervisor, nova-compute为这些Hypervisor定义统一的接口
- Hypervisor只需要实现这些接口, 就可以Driver的形式即插即用到OpenStack系统中
功能
定期向OpenStack报告计算节点的状态
- 每隔一-段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compu服务状态。
- nova-compute是通过Hypervisor的驱动获取这些信息的。
实现虚拟机实例生命周期的管理
- OpenStack对虚拟机实例最主要的操作都是通过nova-compute实现的。
创建、关闭、重启、挂起、恢复、中止、调整大小、迁移、快照 - 以实例创建为例来说明nova- compute的实现过程。
为实例准备资源。
创建实例的镜像文件。
创建实例的XML定义文件。
创建虚拟网络并启动虚拟机。
组件图
支持方式
通过Driver (驱动)架构支持多种Hypervisor虚拟机管理器
面对多种Hypervisor, nova-compute为这些Hypervisor定义统一的接口 Hypervisor只需要实现这些接口,
就可以Driver的形式即插即用到OpenStack系统中
功能
定期向OpenStack报告计算节点的状态
每隔一-段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compu服务状态。
nova-compute是通过Hypervisor的驱动获取这些信息的。
实现虚拟机实例生命周期的管理
OpenStack对虚拟机实例最主要的操作都是通过nova-compute实现的。 创建、关闭、重启、挂起、恢复、中止、调整大小、迁移、快照
以实例创建为例来说明nova- compute的实现过程。
为实例准备资源。
创建实例的镜像文件。
创建实例的XML定义文件。
创建虚拟网络并启动虚拟机。
5、Nova Conductor :
RPC服务,主要提供数据库查询功能。以前的openstack版本中,Nova Compute子服务中定义了许多的数据库查询方法。但是,由于Nova Compute子服务需要在每个计算节点上启动,一旦某个计算节点被攻击,就将完全获得数据库的访问权限。有了Nova Compute子服务之后,便可在其中实现数据库访问权限的控制。
6、Nova Scheduler :
Nova调度子服务。当客户端向Nova 服务器发起创建虚拟机请求时,决定将续集你创建在哪个节点上。
架构说明
6、1过滤器(filter)
过滤出可以创建虚拟机的主机。
scheduler_available_filters选项用于配置可用过滤器,默认是所有nova自带的过滤器都可以用于过滤作用
Nova过滤器类型说明
- DifferentHostFilter:选择与一个集合的虚拟机不同位置的主机;
- SameHostFilter:选择与一组虚拟机相同位置的主机;
- GroupAntiAffinityFilter:选择与一个集合的虚拟机不同位置的主机,集合中的每个元素都是一个虚拟机的组;
- AggregateInstanceExtraSpecsFilter:返回能够建立某一类型虚拟机的主机列表
- AvailabilityZoneFilter:通过可用的区域来过滤主机host
- ComputeCapabilitiesFilter:根据host的capabilities判断是否允许创建虚拟机
- ComputeFilter:根据主机capabilities的状态和服务的可用性过滤
- CoreFilter:基于主机的CPU内核数进行过滤
- DiskFilter:基于磁盘使用率的主机host过滤
- IoOpsFilter:过滤掉有过多的I/O操作的主机host
- RamFilter:只返回有足够可使用的RAM主机host
- RetryFilter:跳过已经尝试过的节点
计算权值(weight)
OpenStack源码位置
/usr/lib/python2.7/site-packages
权重源码位置
/usr/lib/python2.7site-packages/nova/scheduler/weights
- 所有权重位于nova/scheduler/weights目录下。目前默认实现是RAMweighter,根据计算节点空闲的内存量计算权重值,空闲越多,权重越大,实例将被部署到当前空闲内存最多的计算节点上
7、Nova Console、Nova Consoleauth、Nova VNCProxy :
Nova控制台子服务。功能是实现客户端通过代理服务器远程访问虚拟机实例的控制界面。
8、DB:
用于数据存储的sql数据库。
总结:Nova 各个子组件之间很松的耦合性。就算其中有些服务不启动,Nova组件也能正常工作。 Nova中要实现基本的虚拟机管理功能,至少需要启动Nova API、Nova Compute、Nova Conductor、Nova Scheduler服务。
部署
创建数据库实例和数据库用户
[root@ct ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE placement;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;
创建Placement服务用户和API的endpoint
创建placement用户
[root@ct ~]# openstack user create --domain default --password PLACEMENT_PASS placement
给与placement用户对service项目拥有admin权限
[root@ct ~]# openstack role add --project service --user
创建一个placement服务,服务类型为placement
[root@ct ~]# openstack service create --name placement --description "Placement API" placement
注册API端口到placement的service中;注册的信息会写入到mysql中
[root@ct ~]# openstack endpoint create --region RegionOne placement public http://ct:8778
[root@ct ~]# openstack endpoint create --region RegionOne placement internal http://ct:8778
[root@ct~]# openstack endpoint create --region RegionOne placement admin http://ct:8778
安装placement服务
[root@controller ~]# yum -y install openstack-placement-api
修改placement.conf配置文件
openstack-config --set /etc/placement/placement.conf placement_database connection mysql+pymysql://placement:PLACEMENT_DBPASS@ct/placement
openstack-config --set /etc/placement/placement.conf api auth_strategy keystone
openstack-config --set /etc/placement/placement.conf keystone_authtoken auth_url http://ct:5000/v3
openstack-config --set /etc/placement/placement.conf keystone_authtoken memcached_servers ct:11211
openstack-config --set /etc/placement/placement.conf keystone_authtoken auth_type password
openstack-config --set /etc/placement/placement.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/placement/placement.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/placement/placement.conf keystone_authtoken project_name service
openstack-config --set /etc/placement/placement.conf keystone_authtoken username placement
openstack-config --set /etc/placement/placement.conf keystone_authtoken password PLACEMENT_PASS
查看placement配置文件
[root@ct placement]# cat placement.conf
[DEFAULT]
[api]
auth_strategy = keystone
[cors]
[keystone_authtoken]
auth_url = http://ct:5000/v3 #指定keystone地址
memcached_servers = ct:11211 #session信息是缓存放到了memcached中
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = placement
password = PLACEMENT_PASS
[oslo_policy]
[placement]
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@ct/placement
[profiler]
启动apache
[root@ct placement]# systemctl restart httpd
curl 测试访问
[root@ct placement]# curl ct:8778
{"versions": [{"status": "CURRENT", "min_version": "1.0", "max_version": "1.36", "id": "v1.0", "links": [{"href": "", "rel": "self"}]}]}
查看端口占用(netstat、lsof)
[root@ct conf.d]# netstat -natp | grep 8778
tcp6 0 0 :::8778 :::* LISTEN 101615/httpd
检查placement状态
[root@ct conf.d]# placement-status upgrade check
+----------------------------------+
| Upgrade Check Results |
+----------------------------------+
| Check: Missing Root Provider IDs |
| Result: Success |
| Details: None |
+----------------------------------+
| Check: Incomplete Consumers |
| Result: Success |
| Details: None |
+----------------------------------+
未完待续