创建 Instance 时,用户会提出资源需求,例如:image是哪个,CPU、内存、磁盘各需要多少?OpenStack 将这些需求定义在 glance image以及flavor 中,用户只需要指定使用就可以。
要想理解scheduler如何调度,我们先来看scheduler的filter有哪些?
在nova.conf中,可以看到RetryFilter, AvailabilityZoneFilter, AggregateRamFilter, AggregateDiskFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, AggregateCoreFilter, NumInstancesFilter, SameHostFilter, DifferentHostFilter, LocalDiskFilter, DedicatedCloudFilter, AggregateInstanceExtraSpecsFilter, PciPassthroughFilter, VGPUFilter, NUMATopologyFilter
那么我们接下来逐个看下这些filter到底是如何来过滤计算节点的:
RetryFilter:过滤掉已经调度过的节点,例如:假设A,B,C三个节点都通过了过滤,最终A因为权重值最大被选中执行操作。 但由于某个原因,实例在A上创建失败了。 此时默认nova-scheduler会重新执行过滤操作(重复次数由scheduler_max_attempts选项指定,默认是3)。 那么这时候RetryFilter就会将A直接刷掉,避免再次失败。RetryFilter通常放在第一个filter。
AvailabilityZoneFilter:为提高容灾性和提供隔离服务,可以将计算节点划分到不同的Availability Zone中。例如把同一个型号的机器或者同一个用途的机器划分在通一个Availability Zone中,用户可根据需要创建自己的Availability Zone。nova-scheduler在做filtering时,会将不属于此Availability Zone的计算节点过滤掉。
AggregateRamFilter:将不能满足flavor内存需求的计算节点过滤掉。对于内存,OpenStack是可以设置内存超分配的,具体参数为ram_allocation_ratio,但是生产环境上,一般不超分,即设置为ram_allocation_ratio=1.0
AggregateDiskFilter:将不能满足flavor磁盘需求的计算节点过滤掉,同样,OpenStack是可以设置disk超分配的,具体参数为disk_allocation_ratio,在生产环境上,一般不超分,即设置为disk_allocation_ratio=1.0
ComputeFilter:保证只有nova-compute服务正常工作的计算节点才能够被nova-scheduler调度。ComputeFilter显然是必选的 filter。
ComputeCapabilitiesFilter:根据计算节点的特性来筛选,此处涉及到flavor中的metadata的配置,例如:服务器通常分为x86_64架构和aarch64架构,那么我们可以通过设置flavor中的metadata来限制选择哪种架构。又例如,不同厂家的服务器、cpu feature、threads等等这些都可以在flavor中的metadata中配置,以此来指定实例创建在自己想要的宿主机上。
ImagePropertiesFilter:根据所选image的属性来筛选匹配的计算节点,例如image的架构是x86_64,则需要在image的metadata处配置上x86_64,此时此filter会过滤掉非x86_64架构的计算节点。若此时,前面的AvailabilityZoneFilter选择了aarch64的AvailabilityZone,那么就会创建失败,因为架构不匹配。
ServerGroupAntiAffinityFilter:此filter多用在批量创建实例时,可以尽量将实例分散部署到不同的计算节点上,这样可以增加实例的高可用性。
ServerGroupAffinityFilter:与 ServerGroupAntiAffinityFilter 的作用相反,会尽可能将实例部署在同一台计算节点上。以上2种filter若在创建实例时未指定,则会直接通过,不做过滤
AggregateCoreFilter:将不能满足flavor vCPU需求的计算节点过滤掉,vCPU同样允许超分配,具体参数为cpu_allocation_ratio,在生产环境中,也会根据需求进行超分,具体按照需求进行配置即可
NumInstancesFilter:根据节点实例个数来过滤。在nova.conf中,配置了max_instances_per_host参数,以此指定指定一台计算节点最多创建多少个实例,若实例数达到这个数量,则不会继续在此计算节点上创建实例了。
SameHostFilter:在与一个实例相同的计算节点上启动实例,创建虚拟机的同时可以指定一些虚拟机,要求新的虚拟机在这些虚拟机所在计算节点上创建。
DifferentHostFilter:与上面的SameHostFilter相反,创建虚拟机的同时可以指定一些虚拟机,要求新的虚拟机不能在这些虚拟机所在计算节点上创建。
LocalDiskFilter:根据flavor中的local_disk:disk_num过滤,要求宿主机的磁盘大小比需要的磁盘大就可以通过
DedicatedCloudFilter:根据专属云标签过滤,将非专属云的服务器过滤掉。
AggregateInstanceExtraSpecsFilter:将主机所属的aggregate的metadata属性,与创建虚拟机的instance_type中的extra_specs属性作比较。
PciPassthroughFilter:此filter一般用于Pci插槽上的设备过滤,比如gpu、dpu,根据metadata来选择正确的gpu、dpu所在的宿主机来创建实例
VGPUFilter:根据vgpu数量来过滤,将不满足需求的宿主机过滤掉。
NUMATopologyFilter:根据numa node过滤,flavor的metadata中需要指定numa node采用几个,然后vcpu会平衡在这几个numa node上,若未指定,则默认是1,此时若单个numa node上的cpu核数不够flavor需要的vcpu数,则创建失败
最后,若上述filter全都过滤后,还有大于1的服务器可选,则采用weight来计算权重,默认以空闲内存作为计算标准,空闲内存越大,权重越大,最后权重最大的那台计算节点作为最终实例部署的计算节点