diff options
Diffstat (limited to 'doc/source')
| -rw-r--r-- | doc/source/devref/filter_scheduler.rst | 97 |
1 files changed, 64 insertions, 33 deletions
diff --git a/doc/source/devref/filter_scheduler.rst b/doc/source/devref/filter_scheduler.rst index 91cf0e5a0..d6ceb08ef 100644 --- a/doc/source/devref/filter_scheduler.rst +++ b/doc/source/devref/filter_scheduler.rst @@ -26,26 +26,35 @@ filtering`. There are some standard filter classes to use (:mod:`nova.scheduler.filters`): * |AllHostsFilter| - frankly speaking, this filter does no operation. It - returns all the available hosts after its work. -* |AvailabilityZoneFilter| - filters hosts by availability zone. It returns - hosts with the same availability zone as the requested instance has in its - properties. -* |ComputeFilter| - checks that the capabilities provided by the compute - service satisfy the extra specifications, associated with the instance type. - It returns a list of hosts that can create instance type. -* |CoreFilter| - filters based on CPU core utilization. It will approve host if - it has sufficient number of CPU cores. + passes all the available hosts. +* |ArchFilter| - filters hosts based on architecture. It passes hosts + that can support the architecture specified in the instance properties. +* |AvailabilityZoneFilter| - filters hosts by availability zone. It passes + hosts matching the availability zone specfied in the instance properties. +* |ComputeCapabilityFilter| - checks that the capabilities provided by the + host compute service satisfy any extra specifications associated with the + instance type. It passes hosts that can create the specified instance type. +* |ComputeFilter| - passes all hosts that are operational and enabled. +* |CoreFilter| - filters based on CPU core utilization. It passes hosts with + sufficient number of CPU cores. * |IsolatedHostsFilter| - filter based on "image_isolated" and "host_isolated" flags. * |JsonFilter| - allows simple JSON-based grammar for selecting hosts. -* |RamFilter| - filters hosts by their RAM. So, it returns only the hosts with - enough available RAM. +* |RamFilter| - filters hosts by their RAM. Only hosts with sufficient RAM + to host the instance are passed. * |SimpleCIDRAffinityFilter| - allows to put a new instance on a host within the same IP block. * |DifferentHostFilter| - allows to put the instance on a different host from a set of instances. * |SameHostFilter| - puts the instance on the same host as another instance in a set of of instances. +* |RetryFilter| - filters hosts that have been attempted for scheduling. + Only passes hosts that have not been previously attempted. +* |TrustedFilter| - filters hosts based on their trust. Only passes hosts + that meet the trust requirements sepcified in the instance properties. +* |TypeAffinityFilter| - Only passes hosts that are not already running an + instance of the requested type. +* |AggregateTypeAffinityFilter| - limits instance_type by aggregate. Now we can focus on these standard filter classes in details. I will pass the simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are, @@ -77,15 +86,19 @@ scheduler with availability zones support and can configure availability zones on each compute host. This classes method `host_passes` returns `True` if availability zone mentioned in request is the same on the current compute host. -|ComputeFilter| checks if host can create `instance_type`. Let's note that -instance types describe the compute, memory and storage capacity of nova -compute nodes, it is the list of characteristics such as number of vCPUs, -amount RAM and so on. So |ComputeFilter| looks at hosts' capabilities (host -without requested specifications can't be chosen for the creating of the -instance), checks if the hosts service is up based on last heartbeat. Finally, -this Scheduler can verify if host satisfies some `extra specifications` -associated with the instance type (of course if there are no such extra -specifications, every host suits them). +The |ArchFilter| filters hosts based on the architecture specified in the +instance properties. E.g., an instance might require a host that supports +the arm architecture. The |ArchFilter| will only pass hosts that can +support the architecture requested by the instance. + +|ComputeCapabilitesFilter| checks if the host satisfies any 'extra specs' +specfied on the instance type. The 'extra specs' can contain key/value pairs, +and the |ComputeCapabilitiesFilter| will only pass hosts whose capabilities +satisfy the requested specifications. All hosts are passed if no 'extra specs' +are specified. + +|ComputeFilter| is quite simple and passes any host whose compute service is +enabled and operational. Now we are going to |IsolatedHostsFilter|. There can be some special hosts reserved for specific images. These hosts are called **isolated**. So the @@ -125,22 +138,33 @@ Many filters use data from `scheduler_hints`, that is defined in the moment of creation of the new server for the user. The only exeption for this rule is |JsonFilter|, that takes data in some strange difficult to understand way. +The |RetryFilter| filters hosts that have already been attempted for scheduling. +It only passes hosts that have not been previously attempted. + +The |TrustedFilter| filters hosts based on their trust. Only passes hosts +that match the trust requested in the `extra_specs' for the flavor. The +`extra_specs' will contain a key/value pair where the key is `trust'. The +value of this pair (`trusted'/`untrusted') must match the integrity of a +host (obtained from the Attestation service) before it is passed by the +|TrustedFilter|. + To use filters you specify next two settings: -* `scheduler_available_filters` - points available filters. -* `scheduler_default_filters` - points filters to be used by default from the - list of available ones. +* `scheduler_available_filters` - Defines filter classes made available to the + scheduler. This setting can be used multiple times. +* `scheduler_default_filters` - Of the available filters, defines those that + the scheduler uses by default. -Host Manager sets up these flags in `nova.conf` by default on the next values: +The default values for these settings in nova.conf are: :: --scheduler_available_filters=nova.scheduler.filters.standard_filters - --scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter + --scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilityFilter -These two lines mean, that all the filters in the `nova.scheduler.filters` -would be available, and the default ones would be |RamFilter|, |ComputeFilter| -and |AvailabilityZoneFilter|. +With this configuration, all filters in `nova.scheduler.filters` +would be available, and by default the |RamFilter|, |ComputeFilter|, +|AvailabilityZoneFilter|, and |ComputeCapabilityFilter| would be used. If you want to create **your own filter** you just need to inherit from |BaseHostFilter| and implement one method: @@ -148,7 +172,8 @@ If you want to create **your own filter** you just need to inherit from takes `host_state` (describes host) and `filter_properties` dictionary as the parameters. -So in the end file nova.conf should contain lines like these: +As an example, nova.conf could contain the following scheduler-related +settings: :: @@ -157,10 +182,10 @@ So in the end file nova.conf should contain lines like these: --scheduler_available_filters=myfilter.MyFilter --scheduler_default_filters=RamFilter,ComputeFilter,MyFilter -As you see, flag `scheduler_driver` is set up for the `FilterSchedule`, -available filters can be specified more than once and description of the -default filters should not contain full paths with class names you need, only -class names. +With these settings, nova will use the `FilterScheduler` for the scheduler +driver. The standard nova filters and MyFilter are available to the +FilterScheduler. The RamFilter, ComputeFilter, and MyFilter are used by +default when no filters are specified in the request. Costs and weights ----------------- @@ -253,8 +278,10 @@ P.S.: you can find more examples of using Filter Scheduler and standard filters in :mod:`nova.tests.scheduler`. .. |AllHostsFilter| replace:: :class:`AllHostsFilter <nova.scheduler.filters.all_hosts_filter.AllHostsFilter>` +.. |ArchFilter| replace:: :class:`ArchFilter <nova.scheduler.filters.arch_filter.ArchFilter>` .. |AvailabilityZoneFilter| replace:: :class:`AvailabilityZoneFilter <nova.scheduler.filters.availability_zone_filter.AvailabilityZoneFilter>` .. |BaseHostFilter| replace:: :class:`BaseHostFilter <nova.scheduler.filters.BaseHostFilter>` +.. |ComputeCapabilitiesFilter| replace:: :class:`ComputeCapabilitiesFilter <nova.scheduler.filters.compute_capabilities_filter.ComputeCapabilitiesFilter>` .. |ComputeFilter| replace:: :class:`ComputeFilter <nova.scheduler.filters.compute_filter.ComputeFilter>` .. |CoreFilter| replace:: :class:`CoreFilter <nova.scheduler.filters.core_filter.CoreFilter>` .. |IsolatedHostsFilter| replace:: :class:`IsolatedHostsFilter <nova.scheduler.filters.isolated_hosts_filter>` @@ -263,3 +290,7 @@ in :mod:`nova.tests.scheduler`. .. |SimpleCIDRAffinityFilter| replace:: :class:`SimpleCIDRAffinityFilter <nova.scheduler.filters.affinity_filter.SimpleCIDRAffinityFilter>` .. |DifferentHostFilter| replace:: :class:`DifferentHostFilter <nova.scheduler.filters.affinity_filter.DifferentHostFilter>` .. |SameHostFilter| replace:: :class:`SameHostFilter <nova.scheduler.filters.affinity_filter.SameHostFilter>` +.. |RetryFilter| replace:: :class:`RetryFilter <nova.scheduler.filters.retry_filter.RetryFilter>` +.. |TrustedFilter| replace:: :class:`TrustedFilter <nova.scheduler.filters.trusted_filter.TrustedFilter>` +.. |TypeAffinityFilter| replace:: :class:`TypeAffinityFilter <nova.scheduler.filters.type_filter.TypeAffinityFilter>` +.. |AggregateTypeAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter <nova.scheduler.filters.type_filter.AggregateTypeAffinityFilter>` |
