openstack的调度(Scheduler)
本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
Scheduler模块在openstack中的作用就是决策虚拟机创建在哪个主机上,目前(截至Essex版本),调度仅支持计算节点.
1 主机过滤
如上图,Filter Scheduler首先得到未经过滤的主机列表,然后根据过滤属性,选择主机创建指定数目的虚拟机。
目前,openstack默认支持几种过滤策略,开发者也可以根据需要实现自己的过滤策略。在nova.scheduler.filters包中的过滤器有以下几种:
l AllHostsFilter – 不做任何过滤,直接返回所有可用的主机列表。
l AvailabilityZoneFilter – 返回创建虚拟机参数指定的集群内的主机。
l ComputeFilter – 根据创建虚拟机规格属性选择主机。
l CoreFilter – 根据CPU数过滤主机。
l IsolatedHostsFilter – 根据 “image_isolated” 和 “host_isolated” 标志选择主机。
l JsonFilter – 根据简单的JSON字符串指定的规则选择主机。
l RamFilter – 根据指定的RAM值选择资源足够的主机。
l SimpleCIDRAffinityFilter – 选择在同一IP段内的主机。
l DifferentHostFilter – 选择与一组虚拟机不同位置的主机。
l SameHostFilter – 选择与一组虚拟机相同位置的主机。
下面是Essex版本中可以使用的过滤器:
需要在nova.conf文件中配置以下两项:
l scheduler_available_filters – 指定所有可用过滤器(默认是nova.scheduler.filters.standard_filters(一个函数),该函数返回nova.scheduler.filters包中所有的过滤器类)
l scheduler_default_filters – 指定默认使用的过滤器列表
如果要实现自己的过滤器,可以继承自BaseHostFilter类,重写host_passes方法,返回True表示主机可用。然后在配置文件中的添加自己过滤器。
2 权值计算
经过主机过滤后,需要对主机进行权值的计算,根据策略选择相应的某一台主机(对于每一个要创建的虚拟机而言)。
尝试在一台不适合的主机上创建虚拟机的代价比在一台合适主机上创建的代价要高,比如说在一台高性能主机上创建一台功能简单的普通虚拟机的代价是高的。
openstack对权值的计算需要一个或多个(weight值,代价函数)的组合,然后对每一个经过过滤的主机调用代价函数进行计算,将得到的值与weight值乘积,得到最终的权值。openstack将在权值最小的主机上创建一台虚拟机。
openstack默认只有一个代价函数:
简单的返回主机剩余的内存。默认的weight值为-1.0(在配置文件nova.conf文件中是以代价函数名称加_weight表示)。开发者可以实现自己的代价函数,设置自己的weight值来更精确的、利用更加复杂的算法选择主机。对于openstack提供的默认值来说,主机拥有的剩余内存越多,权值越小,被选择在其上创建虚拟机的可能性就越大。
3 代码分析
以创建虚拟机为例(其实scheduler模块目前也只是用在创建虚拟机)。
1. scheduler(nova.scheduler.manager.py::SchedulerManager类)模块收到RPC消息,调用run_instance()函数:
如上图,在run_instance()方法中调用了driver对象的schedule_run_instance()方法。那我们来看下driver对象是什么?找到SchedulerManager类的初始化函数__init__():
可见driver对象是配置中的scheduler_driver字段表示的类对象。通过配置文件看到这里默认是nova.scheduler.muti.MultiScheduler类。
2. MultiScheduler::schedule_run_instance()
接着在MultiScheduler类的初始化函数中找到drivers字典的定义,发现其“compute”键所对应的值是nova.scheduler.filter_scheduler.FilterScheduler类对象。
3. FilterScheduler::schedule_run_instance()方法做了两件事:
a) 首先调用了_schedule()方法。该方法的功能是获取所有的计算节点主机,对每一个要创建的虚拟机进行循环:
i. 对主机进行过滤。FilterManager类继承自Scheduler类。在Scheduler类的初始化中,加载了所有可用的filter类。根据配置文件中scheduler_default_filters字段的定义选择默认使用的一个或多个filter。依次对每个主机调用filter类的host_passes()方法,如果返回都为True,则主机通过过滤。
ii. 对所有通过过滤的主机计算权值。openstack默认是算法是-1*(主机剩余的内存值),选择权值最小的主机,即:选择剩余内存最大的主机创建虚拟机。(这里的策略即负载均衡,如果把默认的weight值改为1,策略就调整为优先选择一个主机创建,直至该主机内存不足)
iii. 对选择的主机资源进行更新,以便在下一次循环中使用最新的数据计算。
最终,_schedule()方法会得到与创建虚拟机个数一致的主机列表。
b) 对每一个要创建的虚拟机调用:
instance = self._provision_resource(elevated, weighted_host,request_spec, reservations, kwargs),在该方法中:
i. 向数据库中添加虚拟机信息
ii. 向对应的compute主机发送创建虚拟机的异步RPC请求
循环结束后,返回虚拟机信息,调用链依次返回,给用户响应。
4 个人总结
之前一直说openstack的调度功能很简单,其实个人感觉openstack给了开发者最大的自由度,让开发者能够根据自己项目的需求自由定制很多环节的处理。openstack的框架很简单,因为它把复杂的部分(也是依个人需求而不同的部分)交给了开发者定制。它的接口设计、函数定制以及动态加载机制都是值得我们学习的地方。
本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
相关推荐
6. Scheduler(Nova-scheduler):负责把API调用映射到OpenStack的组件上,决定实例在哪个计算节点上运行。调度器通过算法考虑多种因素如负载、内存、网络拓扑等来决定资源分配。 Nova组件拓扑图展示了各个组件之间...
总的来说,解决OpenStack调度失败的关键在于细致地阅读和分析日志,找出导致过滤器失败的具体原因。如果日志信息不足以解决问题,可能需要进一步的调试,甚至在代码层面设置断点以获取更深层次的错误信息。在调试...
"Fairshare Scheduler" 是 OpenStack 中的一种调度策略,它旨在提供一种公平的资源分配方式。 公平共享调度器(Fairshare Scheduler)的目标是确保所有用户或项目都能公平地获取计算资源,避免某些用户过度占用资源...
OpenStack的核心组件包括Keystone(认证服务)、Glance(镜像服务)、Placement(资源调度)、Nova(计算服务)、Neutron(网络服务)、Horizon(dashboard界面)和Cinder(块存储服务)。每个组件的配置都涉及...
它是一个分布式系统,由多个服务构成,如计算服务(Nova Compute)、调度服务(Nova Scheduler)和API服务等。 源码分析: 1. **Nova Compute**:主要负责虚拟机实例的生命周期管理,包括启动、停止、迁移等操作。...
12. **服务组件的API**:OpenStack每个核心组件通常都有相应的API服务,如Nova-api提供计算服务API、Nova-api-metadata提供元数据服务、Nova-Scheduler负责调度等。 13. **云平台的硬件和软件依赖**:OpenStack云...
1. **OpenStack Compute (Nova)**:作为OpenStack的核心组件之一,Nova负责处理计算实例的生命周期管理,包括实例的启动、调度、监控及终止等操作。它通过一系列Python守护进程实现对计算资源的管理,提供了强大的...
在演讲中,Intel的工程师首先探讨了OpenStack Nova在过去几个版本中的主要关注点,包括REST API、调度器(Scheduler)、Cellv2架构、实时迁移(Live Migration)和实时升级(Live Upgrade)。这些变革代表了...
OpenStack Compute,也称为Nova,是OpenStack云平台的核心组件之一,主要负责处理计算资源的管理和调度。在深入了解OpenStack Compute之前,我们首先需要理解虚拟化的概念。 虚拟化是一种技术,它允许在单个物理...
9. nova-scheduler 通过查询 nova 数据库中计算资源的情况,并通过调度算法计算符合虚拟机创建需要的主机。 10. nova-scheduler 通过 rpc 调用向 nova-compute 发送对应的创建虚拟机请求的消息。 11. nova-compute ...
第7页中,作者介绍了OpenStack是什么,包括资源抽象、资源分配与负载调度和应用生命周期管理等。 第8页中,作者介绍了OpenStack社区项目分层,包括Nova、Cinder、Neutron、Glance、Keystone、Horizon、Heat、Swift...
在 OpenStack 环境中,理解 Cinder-scheduler 的工作原理和配置至关重要,因为它直接影响到存储资源的分配和整体系统的性能。管理员需要根据实际的硬件资源、业务需求和 Volume 类型来调整配置,以达到最佳的调度...
OpenStack Nova是OpenStack云平台的核心组件之一,主要负责计算资源的管理,包括虚拟机的生命周期管理、调度、网络配置和存储操作等。在进行OpenStack Nova源码分析时,我们需要深入了解其架构、核心模块以及关键...
* Placement:参与 Nova-Scheduler 选择目标主机的调度流程,负责跟踪记录 Resource Provider 的 Inventory 和 Usage,并使用不同的 Resource Classes 来划分资源类型,使用不同的 Resource Traits 来标记资源特征 ...
OpenStack Compute,通常被称为Nova,是OpenStack云平台的核心组件之一,主要负责处理虚拟机(VM)生命周期管理,包括创建、调度、启动、停止、迁移等任务。Nova使用分布式架构,设计目标是提供大规模的计算资源管理...
- Nova-scheduler:负责虚拟机调度决策,将虚拟机请求映射到适当的基础资源上。 3. OpenStack网络组件Neutron: Neutron是OpenStack中的网络即服务(NaaS)组件,其设计目标是提供对网络的抽象和插件化,提供创建和...
4. **调度策略**:Nova-scheduler 根据资源利用率、亲和性、用户策略等条件选择合适的计算节点。2011.2 版本的调度策略可能相对简单,但已经包含了基本的负载均衡和资源分配思想。 5. **网络模型**:在早期版本中,...
此外,Nova 包括调度器(scheduler)、计算节点(compute node)、网络服务(neutron)等多个子组件,协同工作以实现高效的资源管理。 2. OpenStack Object Storage (Swift): Swift 是一个分布式对象存储系统,...
Nova是OpenStack项目的核心组件之一,负责计算服务的管理,包括虚拟机的生命周期管理、资源调度、网络配置等。在OpenStack社区下载的nova源码中,你可以深入了解这个开源云计算平台如何处理IaaS(基础设施即服务)的...