OpenStack Nova-scheduler组件的源码解析(1)

本文详细介绍了Nova-scheduler组件的源码结构,包括ChanceScheduler、FilterScheduler、Scheduler、HostState、HostManager等关键部分,并阐述了它们的功能与作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说实话,关于Nova-scheduler服务的资料已经很多,而且弄明白后其原理也是很简单的,实现选取最优目标主机实际上就是两个步骤,过滤和称重。

PS:上周针对Nova-scheduler的调度器算法和Nova-cell的调度器算法写了两个专利,后来才知道,加入某些协议的开源项目是不能申请专利的。希望时间不要白费啊,哈哈哈......

好啦,这篇博客先来说说Nova-scheduler组件的源码结构。

1.Nova-scheduler组件的源码结构图

2.Nova-scheduler组件的源码结构解析

/nova/scheduler/chance.py

这个文件中只有一个类ChanceScheduler,继承自类Scheduler,实现了基于随即选取主机节点的方式的调度器;

/nova/scheduler/filter_scheduler.py

这个文件中也只有一个类FilterScheduler,继承自类Scheduler,实现了基于主机过滤器选取主机节点方式的调度器;

/nova/scheduler/driver.py

这个文件中最重要的就是类Scheduler,是所有调度器实现都要继承的基类;

/nova/scheduler/host_manager.py

这个文件中有两个类的实现,都是描述了跟调度器操作相关的主机的实现,其中,类HostState描述了从主机获取相关数据和状态的一些实现,类HostManager描述了跟调度器操作相关的一些主机管理实现。

/nova/scheduler/manager.py

这个文件主要实现了一个类SchedulerManager,定义了若干需要通过调度器实现的主机管理操作。

/nova/scheduler/multi.py

这个文件主要实现了一个类MultiScheduler,实现了动态地选取调度器filter_scheduler.FilterScheduler或nova.scheduler.chance.ChanceScheduler。

/nova/scheduler/rpcapi.py

这个文件主要实现了一个类SchedulerAPI,实现了通过RPC通讯架构远程调用调度器相关的主机管理方法。

/nova/scheduler/schedeler_options.py

这个文件主要实现了一个类SchedulerOptions,实现了一些json格式文件的处理和时间戳的获取等方法。

/nova/scheduler/baremetal_host_manager.py

这个文件主要实现了当前域中主机的一些管理方法。

/nova/scheduler/filters/__init__.py

这个文件主要定义了一个类BaseHostFilter,描述了一个主机过滤器实现的基类;

/nova/scheduler/filters/affinity_filter.py

这个文件中定义了四个过滤器类:

DifferentHostFilter:选择与一个集合的虚拟机不同位置的主机;

SameHostFilter:选择与一组虚拟机相同位置的主机;

SimpleCIDRAffinityFilter:选择在同一IP段内的主机;

GroupAntiAffinityFilter:选择与一个集合的虚拟机不同位置的主机,集合中的每个元素都是一个虚拟机的组;

/nova/scheduler/filters/aggregate_instance_extra_specs.py

这个文件定义了一个过滤器类:AggregateInstanceExtraSpecsFilter

返回能够建立某一类型虚拟机的主机列表;
功能:将主机所属的aggregate的metadata属性,与创建虚拟机的instance_type中的extra_specs属性作比较;
同时,在extra_specs属性中,支持一些伪操作符(nova\scheduler\filters\extra_specs_ops.py),
比如extra_specs={'mem':'>= 512'},那么host所属的aggregate的metadata={'mem':'1024'}时,就允许创建虚拟机;

/nova/scheduler/filters/aggregate_multitenancy_isolation.py

这个文件定义了一个过滤器类:AggregateMultiTenancyIsolation

实现在特定的聚集中隔离租户;    
如果host在具有"filter_tenant_id"的key值的元数据的聚合中,
则仅能够在这个租户的节点上建立虚拟机实例;
如果host不在具有"filter_tenant_id"的key值的元数据的聚合中,
则能够在所有的租户的节点上建立虚拟机实例;

/nova/scheduler/filters/all_hosts_filter.py

这个文件定义了一个过滤器类:AllHostsFilter

不经过过滤,返回所有主机host;

/nova/scheduler/filters/availability_zone_filter.py

这个文件定义了一个过滤器类:AvailabilityZoneFilter

通过可用的区域来过滤主机host;
功能:保证虚拟机所属的availability_zone与host所属的availability_zone一致;
如果创建时没有指定availability_zone,那么允许;
否则就看是否与host所属aggregate的metadata['availability_zone']匹配;

/nova/scheduler/filters/compute_capabilities_filter.py

这个文件定义了一个过滤器类:ComputeCapabilitiesFilter

功能:根据host的capabilities判断是否允许创建虚拟机;
将host->capabilities与虚拟机的instance_type->extra_specs作比较,
比较方法类似于AggregateInstanceExtraSpecsFilter;

/nova/scheduler/filters/compute_filter.py

这个文件定义了一个过滤器类:ComputeFilter

功能:根据主机capabilities的状态和服务的可用性过滤;

/nova/scheduler/filters/core_filter.py

这个文件定义了一个过滤器类:CoreFilter

基于主机的CPU内核数进行过滤;
如果剩余的内核数大于建立实例需要的内核数,则返回TRUE;
功能:看host上的vcpu个数能否满足创建虚拟机的instance_type中的vcpu个数;
根据CONF.cpu_allocation_ratio(默认是16)确定host上当前的vcpus_total;

/nova/scheduler/filters/disk_filter.py

这个文件定义了一个过滤器类:DiskFilter

基于磁盘使用率的主机host过滤;
功能:看host上的disk大小能否满足创建虚拟机的instance_type中的(root_gb + ephemeral_gb);
计算disk总量时,会根据CONF.disk_allocation_ratio计算;

/nova/scheduler/filters/image_props_filter.py

这个文件定义了一个过滤器类:ImagePropertiesFilter

通过符合实例镜像属性来进行计算节点主机的过滤;
功能:看虚拟机image->properties中某些属性是否在host的capabilities->supported_instances内;
属性包括:architecture、hypervisor_type、vm_mode;
如果image->properties中没有这些属性,则通过过滤;
如果有这些属性,而host->capabilities->supported_instances没有,返回False;

/nova/scheduler/filters/io_ops_filter.py

这个文件定义了一个过滤器类:IoOpsFilter

过滤掉有过多的I/O操作的主机host;
功能:根据主机的IO负载过滤;
IO负载由host->num_io_ops表示,与CONF.max_io_ops_per_host(默认是8)比较;

/nova/scheduler/filters/isolated_hosts_filter.py

这个文件定义了一个过滤器类:IsolatedHostsFilter

根据 “image_isolated”和 “host_isolated”标志选择主机;
这可以为一些特殊的hosts保留给指定的images;
这些hosts被称作isolated,所以运行在孤立hosts上的镜像也被称作isolated;
这个调度器检查是否image_isolated标志命名在实例规定和在host中的一致;
功能:如果没有配置CONF.isolated_images,当前host不在CONF.isolated_hosts中,返回True;
如果虚拟机image_ref在CONF.isolated_images中,且host在CONF.isolated_hosts中,返回True;
其他情况返回False;

/nova/scheduler/filters/json_filter.py

这个文件定义了一个过滤器类:JsonFilter

JsonFilter过滤器的实现;
根据简单的JSON字符串指定的规则选择主机;
这个过滤提供这个机会来写复杂的查询对于hosts能力过滤;

/nova/scheduler/filters/num_instances_filter.py

这个文件定义饿了一个过滤器类:NumInstancesFilter

过滤掉已经有太多实例的主机host;
选择那些host_state.num_instances < CONF.max_instances_per_host的主机;

/nova/scheduler/filters/ram_filter.py

这个文件定义了一个过滤器类:RamFilter

只返回有足够可使用的RAM主机host;
根据指定的RAM值选择资源足够的主机;
与CoreFilter类似,CONF.ram_allocation_ratio=1.5;

/nova/scheduler/filters/retry_filter.py

这个文件定义了一个过滤器类:RetryFilter

跳过已经尝试过的节点;

/nova/scheduler/filters/trusted_filter.py

这个文件定义了一个过滤器类:TrustedFilter

支持Trusted Computing Pools,根据instance_type-> extra_specs-> trust:trusted_host,校验主机是否可信;

/nova/scheduler/filters/type_filter.py

这个文件定义了一个过滤器类:TypeAffinityFilter

TypeAffinityFilter过滤器的实现,它不允许一个主机上运行多余一种类型的虚拟机;
如果该主机上存在规格不为instance_type的虚拟机,返回False,也就是保证一个主机上只允许创建相同规格的虚拟机;

/nova/scheduler/weights/__init__.py

这个文件主要定义了一个方法all_weighers,实现了选取主机称重方法的调用。

/nova/scheduler/weights/least_cost.py

这个文件实现了一个主机称重方法,即:get_least_cost_weighers;

/nova/scheduler/weights/ram.py

这个文件实现了一个主机称重类,即:RAMWeigher;
### 安装 OpenStack Nova 组件 可以通过 `yum` 命令来安装 OpenStack Nova 的相关组件,具体命令如下: ```bash yum -y install openstack-nova-api openstack-nova-conductor openstack-nova-scheduler openstack-nova-novncproxy ``` 此命令将会自动下载并安装所需的依赖项以及指定的服务组件[^1]。 --- ### 配置 OpenStack Nova 服务 完成安装后,需要对这些服务进行必要的配置。以下是主要步骤说明: #### 修改主配置文件 编辑 `/etc/nova/nova.conf` 文件以调整调度器的行为。例如,为了实现定期扫描计算节点的功能,可以在 `[scheduler]` 节下添加以下参数: ```ini [scheduler] discover_hosts_in_cells_interval = 300 ``` 这表示每隔 300 秒(即 5 分钟)扫描一次计算节点中的主机状态[^4]。 保存更改后重启 API 服务以使新配置生效: ```bash systemctl restart openstack-nova-api.service ``` --- ### 启动与设置开机自启 安装完成后,需手动启动各个 Nova 相关服务,并将其设为随系统启动而运行: ```bash systemctl start openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy systemctl enable openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy ``` 以上操作确保了所有核心服务正常运行并能够在下次系统启动时自动加载[^2]。 --- ### 创建管理接口端点 如果尚未创建 Nova 的管理员服务端点,则可通过以下命令完成初始化工作: ```bash openstack endpoint create --region RegionOne nova admin http://<control_node_ip>:8774/v2.1 ``` 其中 `<control_node_ip>` 应替换为实际的控制器节点 IP 地址。成功执行该命令后,将返回包含字段及其对应值的结果表单,确认端点已正确注册到 Keystone 中[^3]。 --- ### 总结 综上所述,通过 Yum 源安装 OpenStack Nova 组件的过程涉及以下几个方面: 1. 使用 `yum` 工具批量安装所需软件包; 2. 编辑配置文件优化功能选项; 3. 手动激活各子服务并将它们加入系统的引导序列; 4. 注册相应的访问入口至身份验证框架内。 按照上述指导即可顺利完成基础环境搭建任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值