Bootstrap

OpenStack核心组件-Nova

一、Nova服务介绍

  • 计算服务是openstack最核心的服务之一 , 负责维护和管理云环境的计算资源。
  • Nova自身并没有提供任何虚拟化能力,它提供计算服务,使用不同的虚拟化驱动来与底层支持的Hypervisor (虚拟机管理器)进行交互。所有的计算实例(虚拟服务器)由Nova进行生命周期的调度管理(启动、挂起、停止、删除等),全局来看,nova为整个架构提供虚拟化资源、技术,服务层面来看,nova本身并不具备虚拟化能力,而是通过compute组件与虚拟化管理工具交互实现虚拟资源调度。
  • Nova需要keystone、glance、 neutron、 cinder和swift等其他服务的支持,会和其他外部组件集成,共同完成请求。

二、Nova组件功能

2.1、API:
客户端访问nova的http接口,它由nova-api服务实现,nova-api服务接收和响应来自最终用户的计算api请求(包括跟虚拟机声明周期相关的操作),作为openstack对外服务的最主要接口,nova提供了一个集中的可以查询所有api的端点,以便自己平台内部和其他云平台的调用。所有对nova的请求都首先由nova-api处理,API提供REST标准调用服务,便于与第三方系统集成(其他云平台)。它是外部访问并使用nova提供的各种服务的唯一途径,也是客户端和nova之间的中间件。

Nova-api对接收到的HTTP API请求做以下处理:
1、检查客户端传入的参数是否合法有效(而不止是进行认证)
2、调用nova其他服务来处理客户端HTTP请求
3、格式化nova其他子服务返回的结果,并返回给客户端

2.2、Scheduler:

2.2.1、调度器功能

调度器,由nova-scheduler服务实现,主要解决的是选择在哪个计算节点上启动实例。它可以应用多种规则,考虑内存使用率、cpu负载率、CPU架构等多种因素,根据一定的算法,确定虚拟机实例能够运行在哪一台计算机服务器上。

2.2.2、调度器处理请求的过程
nova-scheduler服务会从消息队列中接收一个虚拟机实例的请求,通过读取数据库的内容,从可用资源池中选择最合适的计算节点,创建新的虚拟机实例。创建虚拟机实例时,用户会提出实例的资源需求,如CPU、内存、磁盘。openstack将这些需求定义在实例类型中,有多个实例模板存储在nova的数据库中,用户可以指定使用哪个实例类型,再创建实例。


2.2.3、调度器的类型:

随机调度器:从所有正常运行nova-compute服务的节点中随机选择。
缓存调度器:是随机调度器的一种特殊类型,在随机调度器的基础上,将主机资源信息缓存在本地内存中,然后通过后台的定时任务,定时从数据库中获取最新的主机资源信息,周期性同步而不是实时获取主机资源信息。
过滤器调度器:根据指定的过滤条件以及权重选择最佳的计算节点,又称为筛选器。

过滤器调度器调度过程:
主要分为两个阶段:

通过指定的过滤器选择满足条件的计算节点,比如内存使用率,可以使用多个过滤器依次进行过滤。(预选)
对过滤之后的主机列表进行权重计算并排序,选择最优的计算节点来创建虚拟机实例。(优选)

2.2.4、调度器与DB的交互过程:

1、scheduler组件决定的是虚拟机实例部署在哪台计算节点上并调度,在调度之前,会先向数据库获取宿主机资源信息作为依据;
2、之后可通过过滤器和权重选择最合适的节点调度,或者指定节点直接调度;
3、计算节点的 libvirt 工具负责收集宿主机的虚拟化资源,根据已创建的实例再次统计资源,将资源信息更新到数据库中,整个更新资源信息的过程是周期性执行的,而不是实时的;所以存在一个问题,当刚创建完一个实例,随即又需要创建时,数据库还未来得及更新宿主机的最新状态,那么调度器依据的信息就不正确,有可能所选的节点资源并不够用,而导致调度失败。这同时也是缓存调度器的缺陷,无法实时获取租主机资源信息。我们可在调度完成时,直接将资源信息返回给数据库,更新数据库状态,解决这个问题。

2.2.5、过滤器的应用

当过滤调度器需要执行调度操作时,会让过滤器对计算节点进行判断,返回ture或false,按照主机列表中的顺序依次过滤。
scheduler_available_filters 选项用于配置可用过滤器,默认是所有nova自带的过滤器都可以使用。
scheduler_default_filters 选项用于指定nova-schedule 服务真正使用的过滤器。

2.2.6、过滤器类型:

RetryFilter(再审过滤器)
主要作用是过滤掉之前已经调度过的节点(类比污点)。如A、B、C都通过了过滤,A权重最大被选中执行操作,由于某种原因,操作在A上失败了。Nova-filter 将重新执行过滤操作,再审过滤器直接过滤掉A,以免再次失败。


AvailabilityZoneFilter(可用区域过滤器)
主要作用是提供容灾性,并提供隔离服务,可以将计算节点划分到不同的可用区域中。Openstack默认有一个命名为nova的可用区域,所有计算节点一开始都在其中。用户可以根据需要创建自己的一个可用区域。创建实例时,需要指定将实例部署在那个可用区域中。通过可用区过滤器,将不属于指定可用区的计算节点过滤掉。


RamFilter(内存过滤器)
根据可用内存来调度虚拟机创建,将不能满足实例类型内存需求的计算节点过滤掉,但为了提高系统资源利用率, Openstack在计算节点的可用内存允许超过实际内存大小,可临时突破上限,超过的程度是通过nova.conf配置文件中ram_ allocation_ ratio参数来控制的, 默认值是1.5。(但这只是临时的)

Vi /etc/nova/nova . conf

Ram_ allocation_ ratio=1 .5
DiskFilter(硬盘过滤器)
根据磁盘空间来调度虚拟机创建,将不能满足类型磁盘需求的计算节点过滤掉。磁盘同样允许超量,超量值可修改nova.conf中disk_ allocation_ ratio参数控制,默认值是1.0,(也是临时的)
Vi /etc/nova/nova.conf
disk_ allocation_ ratio=1.0
CoreFilter(核心过滤器)
根据可用CPU核心来调度虚拟机创建,将不能满足实例类型vCPU需求的计算节点过滤掉。vCPU也允许超量,超量值是通过修改nova.conf中cpu_ allocation_ratio参数控制,默认值是16。
Vi /etc/nova/nova. conf
cpu_allocation_ ratio=16.0
ComputeFilter(计算过滤器)
保证只有nova-compute服务正常工作的计算节点才能被nova-scheduler调度,它是必选的过滤器。
ComputeCapabilitiesFilter(计算能力过滤器)
根据计算节点的特性来过了,如不同的架构。
ImagePropertiesFilter(镜像属性过滤器)
根据所选镜像的属性来筛选匹配的计算节点,通过元数据来指定其属性。如希望镜像只运行在KVM的Hypervisor上,可以通过Hypervisor Type属性来指定。
服务器组反亲和性过滤器
要求尽量将实例分散部署到不同的节点上,设置一个服务器组,组内的实例会通过此过滤器部署到不同的计算节点。适用于需要分开部署的实例。
服务器组亲和性过滤器
此服务器组内的实例,会通过此过滤器,被部署在同一计算节点上,适用于需要位于相同节点的实例服务。
 

在对计算节点进行过滤时,多个过滤器依次进行过滤,而不是并行,相当于一个个预选,避免重复对同一个节点进行所有过滤项检验。过滤之后的节点再通过计算权重进行排序。所有权重位于nova/scheduler/weights 目录下,目前默认是RAMweighter,根据计算节点空闲的内存计算权重,内存空闲越多权重越大,计算节点按照内存空闲进行排序。
 

子功能:
粗过滤,例如CPU、内存、磁盘
精细化过滤,例如镜像属性,服务性能契合度
高级过滤,亲和性/反亲和性过滤

过滤之后,可以进行随机调度,会进行再筛选,即污点机制,对剩下的节点过滤,排除掉之前有故障的节点。

2.2.7compute计算组件

Nova-compute可分为两类,一类是定向openstack报告计算节点的状态,另一类是实现实例生命周期的管理。运行在计算节点上,对各种主流的虚拟化平台都提供了支持,通过xenAPI、Hyper-V、Libvirt进行管理虚拟机的生命周期。

  • 定期向OpenStack报告计算节点的状态

        每隔一段时间,nova-compute就会报告当前计算节点的资源使用情况和nova-compute服务          状态。nova-compute是通过Hypervisor的驱动获取这些信息的。

  • 实现虚拟机实例生命周期的管理

        创建、关闭、重启、挂起、恢复、中止、调整大小迁移、快照。
        以实例创建为例来说明nova-compute的实现过程。
        (1)为实例准备资源。
        (2)创建实例的镜像文件。
        (3)创建实例的XML定义文件。
        (4)创建虚拟网络并启动虚拟机。


2.3、conductor协调组件

2.3.1、conductor简介,产生原因:
为数据库的访问提供一层安全保障。Nova-conductor作为nova-compute服务与数据库之间交互的中介,避免了compute直接访问,由nova-conductor服务对接数据库,compute组件位于第三方上,与架构外部进行交互。这样就可避免一些越权操作,并且为数据库分压。
Nova-compute访问数据库的全部操作都改到nova-conductor中,nova-conductor作为对数据库操作的一个代理,而且nova-conductor是部署在控制节点上的。
Nova-conductor有助于提高数据库的访问性能,nova-compute可以创建多个线程使用远程过程调用(RPC)访问nova-conductor。
在一个大规模的openstack部署环境里,管理员可以通过增加nova-conductor的数量来应对日益增长的计算节点对数据库的访问量。

2.4、 Placement API
以前对资源的管理全部由计算节点承担,在统计资源使用情况时,只是简单的将所有计算节点的资源情况累加起来,但是系统中还存在外部资源,这些资源由外部系统提供。如ceph、nfs等提供的存储资源等。面对多种多样的资源提供者,管理员需要统一的、简单的管理接口来统计系统中资源使用情况,这个接口就是Placement API。
PlacementAPI由nova-placement-api服务来实现, 旨在追踪记录资源提供者的目录和资源使用情况。被消费的资源类型是按类进行跟踪的。 如计算节点类、共享存储池类、IP地址类等。
 

三、虚拟机的创建过程

1.用户通过界面或命令行申请创建虚拟机,借助RESTAPI请求Keystone授权。
2. Keystone 认证用户请求信息,并生成auth-token返回认证请求。
3. 界面或命令行通过REST API并携带auth-token 向nova-api发送一个build instance 的请

4.nova-api 接受请求后向keystone 发送认证请求,查看token是否有效。
5.Keystone根据验证结果返回有效的认证和对应的用户角色。
6.通过认证 后nova-api和数据库通讯。
7.初始化新建虚拟机的数据库记录。
8. nova-api 通过rpc call向nova-scheduler请求是否有创建虚拟机的资源(HostID) 。 
9. nova-scheduler 通过侦听MQ获取nova-api的请求。
10.nova-scheduler查询nova数据库中计算资源的情况,并通过过滤算法确定出符合虛拟机
创建需求的主机。
11. nova-scheduler 更新数据库中虛拟机对应的物理主机信息。
12. nova-scheduler 通过rpe cast向nova-compute发送虚拟机创建请求消息。
13. nova-compute 从消息队列中获取虚拟机创建请求消息。
14. nova-compute 通过rpc call向nova-conductor请求获取虚拟机消息。
15. nova-conductor 从消息队列中获取nova-compute请求消息。
16.nova-conductor根据消息查询数据库中对应虚拟机的信息。
17. nova-conductor 从数据库中获得虚拟机信息。
18. nova-conductor 把虚拟机信息通过RPC发送到MQ中。
19. nova-compute 从MQ中获得虚拟机信息。
20. nova-compute通过keystone拿到认证的token,并请求Glance获取创建虚拟机所需的镜

21. Glance 向keystone认证token是否有效,并返回验证结果。
22. token 验证通过,nova-compute 获得虚拟机镜像信息(URL)。
23. nova-compute 通过Keystone拿到认证的token,并向Neutron请求获取创建虚拟机所需
要的网络信息。
24. Neutron 向keystone认证token是否有效,并返回验证结果。
25. token 验证通过,nova-compute 获得虚拟机网络信息。
26. nova-compute 通过Keystone拿到认证的token,并向Cinder请求获取创建虚拟机所需的
持久化存储信息。
27. Cinder 向Keystone认证token是否有效,并返回验证结果。
28. token 验证通过,nova-compute 获得虚拟机持久化存储信息。
29. nova-compute 根据实例信息调用虚拟化驱动创建虚拟机。

 

四、Nova的部署架构

4.1.经典部署架构:

4.2.负载均衡部署架构:


 

;