` openstack(四) | 听云轩

openstack(四)

    Nova计算服务组件是OpenStack中非常重要、核心的部分,负责承载和管理云计算系统,与其他组件有密切关系。

    Nova计算服务组件使用基于消息,无共享、松耦合无状态的架构。OpenStack项目中的核心服务组件都运行在多台主机节点上,包括Nova,cinder,neutron,swift和glance等服务组件,状态信息都存储在数据库中。控制节点服务通过HTTP与内部服务进行交互,但与scheduler服务、网络和卷服务的通信依赖高级消息队列协议进行。为避免消息阻塞而造成长时间等待响应,Nova计算服务组件采用异步调用的机制,当请求被接收后,响应被触发,发送回执,而不关注该请求是否被处理。

    OpenStack项目中的控制节点服务影响着整个云环境的状态,API服务器为控制节点作为web服务前端而服务,处理各种交互信息,计算节点提供各种计算资源和计算服务,Nova计算服务组件中的网络服务提供虚拟网络。

  • driver框架

    OpenStack作为开放的云操作系统,其开放性体现在采用了基于driver的框架。以nova为例,OpenStack的计算节点支持多种hypervisor。包括KVM、hyper-V、VMware、XEN、docker等。

    Nova-compute为这些hypervisor定义了统一的接口,hypervisor只需要实现这些接口就可以driver的形式插入到OpenStack中去使用。

GgGbQ0.png

    在nova-compute的配置文件/etc/nova/nova.conf中,由compute-driver配置项指定该计算节点使用哪一种hypervisor的driver。

GgJapn.png

  • 关于messaging

    在创建虚拟机的过程中,nova-*子服务之间的调用严重依赖messaging。这是因为它是采用了异步调用的方式。

  • 同步调用

    API直接调用scheduler的接口就是直接调用,其特点是API发出请求后需要一直等待,直到scheduler完成对compute的调度,将结果返回给API后API才能够继续做后面的工作。

  • 异步调用

    API通过messaging间接调用scheduler就是异步调用,其特点就是API发出请求后不需要等待,直接返回,继续做后面的事。scheduler从messaging接收到请求后执行调度,完成后将结果也通过messaging发送给API。

好处:

  • 解耦各子服务:子服务不需要知道其他服务运行在哪里,只需要发送消息给messaging就能完成调度
  • 提高性能:无需等待返回结果,这样就可以执行更多的工作,提高系统的吞吐量。
  • 提高伸缩性:子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提高可用性的同时也提高了整个伸缩性。而且这种变化不会影响到其他子服务。

nova组件

  • Nova-api service:负责对终端用户调用compute API的接收和反馈
  • Nova-api-metadata:负责接收虚拟机对metadata(元数据)访问请求,一般部署nova-network的多主机模式才会用nova-api-metadata。
  • Nova-compute:该服务通过hypervisor APIs(XenAPI、libvirt for KVM or QEMU、VMwareAPI)创建和终止虚拟机实例。该服务接收消息队列中的信息,执行一系列操作命令,如创建和更新虚拟机实例状态。
  • Nova-scheduler:该服务接收消息队列中的请求,从而决定虚拟机实例运行在哪个计算节点上。
  • Nova-conductor:nova-compute经常需要更新数据库,但是出于安全性和伸缩性的考虑,nova-compute不会直接访问数据库,而是交由nova-conductor去处理,并且这两个服务不能安装在同一个节点上。

    我们可以通过nova service-list查看具体安装了哪些组件:

Gg0CqI.png

请求流程

  • 客户或程序向api(nova-api)发送创建虚拟机的请求。
  • API对请求做一些必要的处理后,向message(rabbitMQ)发送了消息,让scheduler创建一个虚拟机
  • scheduler从messaging获取到API发送的请求后,执行调度算法,从若干节点中选出节点A。
  • scheduler向messaging发送消息,告知在A上创建这个虚拟机
  • 计算节点A的compute(nova-compute)从messaging中获取到scheduler发给他的消息后,然后在本节点的hypervisor上启动虚拟机。

    而对于其中nova-compute而言,它所做的事有这些:

     (1)为instance准备资源,根据指定的flavor依次为instance分配内存、磁盘和vCPU。
     (2)创建instance的镜像文件,它会先检查是否已经下载,如果没有,则会先向glance去下载相应的镜像文件到本地,然后通过qemu-img创建镜像。
     (3)创建实例的XML文件
     (4)创建虚拟网络以及启动实例

    在虚机创建的过程中,compute如果需要查询或者更新数据库信息,会通过messaging向conductor(nova-conductor)发送消息。

GgB5u9.png

调度方式

    在nova.conf中,nova通过schedulerdriver、scheduleravailable_filters和schedulerdefaultfilters这三个参数来配置nova-scheduler。

1、filter scheduler

    它是nova-scheduler默认的调度器,调度过程分为两步:

  • 通过过滤器(filter)选择满足条件的计算节点
  • 通过权重计算选择在最优(权重值最大)的计算节点上创建instance。

GgDCUP.png

    它也允许使用第三方scheduler,配置好driver就行。也可以使用多个filter一次进行过滤,过滤之后的节点再通过计算权重选出最合适的节点。

GgDFC8.png

  • 开始有6个计算节点
  • 通过filter过滤,刷了两个
  • 然后计算权重,权重高的host5入选

2、filter

    当filterscheduler需要执行调度操作的时候,会让filter对计算节点进行判断,返回true或者false。

    Nova.conf中available_filters选项用于配置配置可用的filter:

GgDWIP.png

    另外还有一个选项用于指定scheduler真正使用的filter,默认值:

GgDvGT.png

    Filter scheduler将按照列表中的顺序依次过滤。

  • Retryfilter

    作用是刷掉之前已经调度过的节点。比如说A、B、C三个节点都通过了过滤,最终A因为权重最大被选中,但是由于某个原因,操作在A上失败了,默认情况下nova-scheduler会重新执行过滤操作(默认是3,max_attempts),那么这时候retryfilter就会将A直接刷掉,避免操作再次失败。

  • Availabilityzonefilter

    为提高容灾性和提供隔离服务,可以将计算节点划分到不同的availability zone中。OpenStack默认有一个命名为nova的availability zone,所有的计算节点初始都放在nova中。创建instance时,需要指定将instance部署到在哪个zone中。在做filter的时候,将不属于指定zone的计算节点过滤掉。

  • Ramfilter

    将不能满足flavor内存需求的计算节点过滤掉。需要注意的是:为了提高系统的资源使用率,OpenStack在计算节点可用内存是允许overcommit,也就是说可以超过实际内存的大小。超过的程度通过文件中参数来控制:

GgrBoq.png

  • Diskfilter

    将不能满足flavor磁盘需求的计算节点过滤掉,和上面一样,允许overcommit。

GgroY6.png

  • Corefilter

    将不满足flavor vcpu需求的计算节点过滤掉。

GgsCp8.png

  • Computefilter

    保证只有nova-compute服务正常工作的计算节点,才能够被调度。

  • Computecapabiliesfilter

    如果想将instance指定部署到x86_64架构的节点上,就可以利用它。

  • Imagepropertiesfilter

    根据所选image的属性来筛选匹配的计算节点。跟flavor类似,image也有metadata用于指定其属性

  • Servergroupantiaffinityfilter

    可以尽量将instance分散部署到不同的节点上。为保证分散部署,可以进行如下操作:

1
2
3
4
5
6
7
8
9
• 创建一个anti-affinity策略的server group:
Nova server-group-create --policy anti-affinity group-1

• 依次创建instance,将instance放到group-1中:
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins1
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins2
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins3

调度使会将ins1、2、3部署到不同的计算节点,创建instance的时候,如果没有指定server group,servergroupantiaffinityfilter会直接通过,不做任何过滤。
  • Servergroupaffinityfilter

    与上面一个相反,它会尽量将instance部署到同一个计算节点上。

1
2
3
4
Nova  server-group-create  --policy affinity group-1
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins1
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins2
Nova boot --image IMAGEID --flavor 1 -hint group=group-1 ins3

3、weight

    经过过滤,scheduler选出能够部署instance的计算节点,nova-scheduler会通过计算节点空闲的内存量计算权重值:空闲内存越多,权重越大。

------ 本文结束 ------
您的支持将鼓励我继续创作