|
Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步: 7 y% y; Q( G# `7 l7 s# O! `
通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute) 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。
; T& K7 N' F4 X/ d- ~Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。
: {4 B5 ^# C4 Q4 h$ v( T3 S# bScheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。 ' K; B A# a i- f: d. E! v
5 v/ t5 }+ s9 j n+ W
目前,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 – 选择与一组虚拟机相同位置的主机。 5 B% r' l6 \, \, |: b
* ]5 D! Z% H% @
【RetryFilter】
$ i% F6 ]" Z/ V' E& @( `RetryFilter 的作用是刷掉之前已经调度过的节点。
( i/ w2 N& J- h2 y; A! M举个例子方便大家理解: 假设 A,B,C 三个节点都通过了过滤,最终 A 因为权重值最大被选中执行操作。 但由于某个原因,操作在 A 上失败了。 默认情况下,nova-scheduler 会重新执行过滤操作(重复次数由 scheduler_max_attempts 选项指定,默认是 3)。 那么这时候 RetryFilter 就会将 A 直接刷掉,避免操作再次失败。 RetryFilter 通常作为第一个 filter。
5 ~3 r, u( X6 F$ c【AvailabilityZoneFilter】
9 R# c7 ] Q5 u% v为提高容灾性和提供隔离服务,可以将计算节点划分到不同的Availability Zone中。 " B$ B7 b% W4 u7 _+ P
例如把一个机架上的机器划分在一个 Availability Zone 中。 OpenStack 默认有一个命名为 "Nova" 的 Availability Zone,所有的计算节点初始都是放在 "Nova" 中。 用户可以根据需要创建自己的 Availability Zone & q& W7 I: V+ V* P+ G, L% d9 m
【RamFilter】 / `7 \. b n: U4 o( T
RamFilter 将不能满足 flavor 内存需求的计算节点过滤掉。 内存超分: 对于内存有一点需要注意: 为了提高系统的资源使用率,OpenStack 在计算节点可用内存时允许 overcommit(超售),也就是可以超过实际内存大小。 超过的程度是通过 nova.conf 中 ram_allocation_ratio 这个参数来控制的,默认值为 1.5 ram_allocation_ratio = 1.5 |
! B; l% j0 W' m; s* S# ~7 L* D6 ?9 u
* ~/ @5 q- }5 _其含义是:如果计算节点的内存有 10GB,OpenStack 则会认为它有 15GB(10*1.5)的内存。
7 I$ v% a! A/ K* E( J8 }: ^7 y b【DiskFilter】
) K5 i: V2 ]1 p$ q3 B5 nDiskFilter 将不能满足 flavor 磁盘需求的计算节点过滤掉。 磁盘超分: Disk 同样允许 overcommit,通过 nova.conf 中 disk_allocation_ratio 控制,默认值为 1
6 ]! u( ~! W. K& a4 m. y7 mdisk_allocation_ratio = 1.0 |
; I+ P N$ G" X; i( @. `, s; I$ r2 w7 S8 ?- {
【CoreFilter】
+ h3 o# H4 K: T7 H4 X7 S& mCoreFilter 将不能满足 flavor vCPU 需求的计算节点过滤掉。 cpu超分: vCPU 同样允许 overcommit,通过 nova.conf 中 cpu_allocation_ratio 控制,默认值为 16
6 m; O, p- }: U/ r9 jcpu_allocation_ratio = 16.0 |
7 q' _$ T& T& S8 ^3 l
3 s W. ]" E/ @+ `( F( o: {这意味着一个 8 vCPU 的计算节点,nova-scheduler 在调度时认为它有 128 个 vCPU。 需要提醒的是: nova-scheduler 默认使用的 filter 并没有包含 CoreFilter。 如果要用,可以将 CoreFilter 添加到 nova.conf 的 scheduler_default_filters 配置选项中。 2 s7 x( N2 G! H- u# W5 u( M0 E
" T. t" d8 \0 x1 [8 r2 q0 F
4 k! d. R. s! k9 Z. w) N【ComputeFilter】 / Q) {2 M$ F4 e* {
ComputeFilter 保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度。 ComputeFilter 显然是必选的 filter。
) u9 ~& i8 V, h0 J) ^# H# U5 j/ g【ComputeCapabilitiesFilter】 $ X5 E7 x, r& a8 W0 c! c
ComputeCapabilitiesFilter 根据计算节点的特性来筛选。
# T- v/ g7 D2 M) C& U* [, x J/ I这个比较高级,我们举例说明。 例如我们的节点有 x86_64 和 ARM 架构的,如果想将 Instance 指定部署到 x86_64 架构的节点上,就可以利用到 ComputeCapabilitiesFilter。 5 Y( x3 \! G# ]0 L+ W$ E" f
还记得 flavor 中有个 Metadata 吗,Compute 的 Capabilitie s就在 Metadata中 指定。
+ ~, ~) q! X `, C! p【ImagePropertiesFilter】 " G" I) h" b- Z4 p1 u; l
ImagePropertiesFilter 根据所选 image 的属性来筛选匹配的计算节点。 跟 flavor 类似,image 也有 metadata,用于指定其属性。 . l1 v7 D% F, d$ D1 n: `+ R' f
【ServerGroupAntiAffinityFilter】 ) y* T/ N/ k9 | p
ServerGroupAntiAffinityFilter 可以尽量将 Instance 分散部署到不同的节点上。
7 ?$ A# M# Z5 O. I: b【ServerGroupAffinityFilter】
6 f- u; E) S3 \! o n与 ServerGroupAntiAffinityFilter 的作用相反,ServerGroupAffinityFilter 会尽量将 instance 部署到同一个计算节点上。 6 l! g+ L& L& S# e
【Weight】 % z4 A- @. A1 w: l
经过前面一堆 filter 的过滤,nova-scheduler 选出了能够部署 instance 的计算节点。 如果有多个计算节点通过了过滤,那么最终选择哪个节点呢?
7 V5 J6 P) J5 R+ m1 A+ m' h0 sScheduler 会对每个计算节点打分,得分最高的获胜。 打分的过程就是 weight,翻译过来就是计算权重值,那么 scheduler 是根据什么来计算权重值呢?
% }% X& V6 f3 l# T5 W目前 nova-scheduler 的默认实现是根据计算节点空闲的内存量计算权重值: 空闲内存越多,权重越大,instance 将被部署到当前空闲内存最多的计算节点上。 |