一个Openstack 系统中通常包含多个计算节点
root@controller:/etc/nova# nova hypervisor-list
+----+---------------------+
| ID | Hypervisor hostname |
+----+---------------------+
| 1 | compute |
| 2 | network |
| 3 | compute2 |
+----+---------------------+
这就产生了一个问题,当发出创建虚拟机请求时,应该把虚拟机创建到哪个计算节点上呢? nova-scheduler 服务即是实现这个调度工作的,调度算法通过filter 和weight 来实现,filter 用于选择可用的计算节点,weight 用于在可用的计算节点中选择一个最佳的节点。
filter
filter 在nova.conf 中配置,修改需要重启nova-scheduler 服务
默认的filter 为(截取icehouse版)
scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter,ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter
下面列出各个filter 的功能
RetryFilter: 剔除上传已经被尝试调度过的计算节点AvailabilityZoneFilter:剔除那些AvailabilityZone 不满足要求的计算节点
ComputeFilter 剔除那些非活动的计算节点
ComputeCapabilitiesFilter 检查计算节点的其他属性
ImagePropertiesFilter 剔除那些硬件架构,Hypervisor,虚拟机模式等属性不满足磁盘镜像要求的节点
filter 类存放在nova/scheduler/filter 目录下所有的
root@controller:/usr/lib/python2.7/dist-packages/nova/scheduler/filters# ll *.pyc
-rw-r--r-- 1 root root 7207 Jul 15 09:33 affinity_filter.pyc
-rw-r--r-- 1 root root 2400 Jul 15 09:33 aggregate_image_properties_isolation.pyc
-rw-r--r-- 1 root root 2399 Jul 15 09:33 aggregate_instance_extra_specs.pyc
-rw-r--r-- 1 root root 1896 Jul 15 09:33 aggregate_multitenancy_isolation.pyc
-rw-r--r-- 1 root root 807 Jul 15 09:33 all_hosts_filter.pyc
-rw-r--r-- 1 root root 1588 Jul 15 09:33 availability_zone_filter.pyc
-rw-r--r-- 1 root root 2514 Jul 15 09:33 compute_capabilities_filter.pyc
-rw-r--r-- 1 root root 1763 Jul 15 09:33 compute_filter.pyc
-rw-r--r-- 1 root root 3671 Jul 15 09:33 core_filter.pyc
-rw-r--r-- 1 root root 1900 Jul 15 09:33 disk_filter.pyc
-rw-r--r-- 1 root root 2107 Jul 15 09:33 extra_specs_ops.pyc
-rw-r--r-- 1 root root 4003 Jul 15 09:33 image_props_filter.pyc
-rw-r--r-- 1 root root 2007 Jul 15 09:33 __init__.pyc
-rw-r--r-- 1 root root 1641 Jul 15 09:33 io_ops_filter.pyc
-rw-r--r-- 1 root root 2300 Jul 15 09:33 isolated_hosts_filter.pyc
-rw-r--r-- 1 root root 5435 Jul 15 09:33 json_filter.pyc
-rw-r--r-- 1 root root 2021 Jul 15 09:33 metrics_filter.pyc
-rw-r--r-- 1 root root 1521 Jul 15 09:33 num_instances_filter.pyc
-rw-r--r-- 1 root root 1497 Jul 15 09:33 pci_passthrough_filter.pyc
-rw-r--r-- 1 root root 3824 Jul 15 09:33 ram_filter.pyc
-rw-r--r-- 1 root root 1448 Jul 15 09:33 retry_filter.pyc
-rw-r--r-- 1 root root 9769 Jul 15 09:33 trusted_filter.pyc
-rw-r--r-- 1 root root 2237 Jul 15 09:33 type_filter.pyc
affinity_filter.py
这里文件里其实有四个可用filter,都是关于亲和性的调度策略,分别如下:
DifferentHostFilter
创建虚拟机的同时可以指定一些虚拟机,要求新的虚拟机不能在这些虚拟机所在主机上创建。
说的简单一点,在host1上运行着vm1,要创建vm2,创建时指定了scheduler_hints->different_host=[vm1],那么vm2就不会在host1上创建。
SameHostFilter
与上面的filter功能相反,如果创建时指定了scheduler_hints-> same_host=[vm1],那么vm2就可以创建在host1上。
SimpleCIDRAffinityFilter
如果指定了scheduler_hints-> build_near_host_ip,那么只能在host1的管理IP网段内选择主机。
GroupAntiAffinity