- Created: Julien Danjou
- Contributors: Julien Danjou, Patrick Petit, François Rossigneux, Julien Carpentier
- Project: Check project Climate on Launchpad
This blueprint introduces the concept of a Capacity Leasing Service (CLS) for OpenStack. With that service, a user with admin privileges can reserve hardware resources that are dedicated to the sole use of a tenant. A lease is a negotiation agreement between the provider and the consumer where the former agrees to make a set of hardware resources (compute and possibly storage) available to the latter, based on a set of lease terms presented by the consumer. The lease terms include the description of the host's capabilities and the availability period during which the hardware is reserved.
We are thinking of three kinds of lease terms:
- Schedule lease: where resources must be provisioned at a specific date and time
- Best-effort lease: where resources are provisioned as soon as possible
- Immediate lease: where resources are provisioned immediately or not at all
Once a lease is created, nobody but the users of the tenant can use the reserved resources during the period of the lease. When a lease ends, nothing disruptive happens to the instances that have been scheduled on the reserved resources. The hardware resources simply return to the common pool and so become available to other tenants for instance scheduling.
The CLS should allow consumer to renegotiate a lease to for example extend the reservation period would the resources be available to satisfy the renegotiation request.
A lease is potentially a billable item for which customers can be charged a flat fee or a premium price for each instance scheduled on reserved resources and so usage of leased resource should be accounted for through Ceilometer.
See Launchpad Blueprint: Planned resource reservation API
There are situations where the reservation of hardware resources are desired to satisfy peaks of load that are known in advance. This is especially true for small scale cloud infrastructures where the co-scheduling of a large amount of compute instances is necessary. It is expected to also satisfy the needs of urgent computations, comply with regulations or security policies which proscribe the co-habitation of multiple tenants on the same physical host and address a class of high performance computing requirements such as avoiding disturbing noises generated by multi-tenancy activities.
In addition to this, the expected benefits of the CLS is to foster energy efficiency (greener) behaviors through promoting nodes with the lowest MFLOPS/Watt ratio and save electricity by automatically turning machine' power on and off based on their leasing schedule. The CLS should also help operators with the management of their physical assets through a more effective capacity planing based on the reservation schedules.
Last but not least. The Capacity Leasing Service is also expected to address a class of performance needs for workloads that are typical of the high performance computing world whereby applications require to be executed on dedicated nodes of same hardware specification and speed (CPU arch, model, and clock frequency)
The Capacity Leasing Service (CLS) behaves like the Filter Scheduler to assert the match making between the properties of the lease and the capabilities of the host. In fact, the CLS should accept all the standard filters consumed by the Filter Scheduler. A lease request should include the following properties:
- the region
- the availability zone
- the host capabilities extra specs (scoped and non-scoped format should be accepted)
- the number of CPU cores
- the amount of free RAM
- the amount of free disk space
- the number of hosts
- the type of lease (SCHEDULE, BEST-EFFORT, IMMEDIAT)
- the staring date of the lease if of type SCHEDULE
- the duration in days and hours of the lease
- a timeout
The CLS, primarily checks that the capabilities provided by the host satisfy any extra specifications associated with the properties of the lease and applies all enabled subsequent filters if any.
The CLS then checks in its database that any of eligible hosts are not already reserved for the requested the period. Then depending on the type of lease, the CLS performs different types of actions depending on whether the lease request can be fulfilled or not.
- If the lease is IMMEDIATE and the request can be fulfilled, the CLS creates an aggregate for the list of eligible hosts with a special metadata key filter_lease_id that contains the unique id of the lease, returns SUCCESS with the ID of the lease and marks the lease as ACTIVE state. If the lease cannot be fulfilled, the CLS returns a FAILURE status.
- If the lease is BEST-EFFORT and the request cannot be fulfilled immediately, the CLS starts some sort of scavenger hunt which has for objective to move away any instance that belongs to some other tenants out of the list of eligible hosts. This operation can be timely and fairly complex and so different strategies may be applied depending on heuristic factors such as the number, type and state of the instances to be migrated. The CLS should assert that there are at least enough potential candidates for the migration prior to starting the actual migration. If the CLS decides to start the migration, it returns a SUCCESS status with the ID of the lease and marks the lease as IN-PROGRESS state. If the CLS decides not to start the migration, it returns directly a FAILURE status. If the scavenger hunt succeeds to make the list of eligible hosts available for the lease before the timeout is triggered, the CLS marks the lease as ACTIVE state. Conversely, if the scavenger hunt doesn't succeed, the CLS marks the lease as TIMEDOUT.
- Finally, if the lease is SCHEDULE and the request can be fulfilled for the requested period according to the reservation schedule, the CLS creates an aggregate for the list of eligible hosts with a special metadata key filter_lease_id that contains the unique id of the lease, returns SUCCESS with the ID of the lease and marks the lease as INACTIVE state until the reservation effectively begins at which point in time, the CLS marks the lease as ACTIVE state. If the request cannot be fulfilled, the CLS simply returns a FAILURE status.
On the Nova Scheduler side, a filter is in charge of enforcing the rule that
It is unclear how to guarantee consistency of the lease in situation of race conditions between the CLS and Nova Scheduler
A reservation, or lease, is tight to a project. It has a start and an end timestamp, during which the lease is valid. It also has a number of nodes and their flavors associated with, so it can be quantified. A lease has a set of scheduler hints set that are immutable. An API call allows a user to retrieve the list and combination of applicable hints. When a user tries to creates a lease, the list of scheduler hints is checked for validity: an operator can refuse a lease with invalid or too strict hints.
When an instance is created, it's registered as being part of the lease when the user passes the information at creation time. It's taken from the lease when it's destroyed. If an instance is created as being part of a lease, the scheduler has to launch the instance with the requirements fulfilled.
Whole Host Reservation Plugin
Provisioning (admin CLI)
In order to ease the host selection upon lease parameters, proposal is made to define as many pools of free servers as there are different capabilities. These pools (let's call them free pools) will actually be host_aggregates with extra_specs metadata. They won't be segregated per project.
* create_freepool(free_pool_name, extra_specs) : creates a free pool. Passing extra_specs in parameters. * delete_freepool(free_pool_name/uuid) : deletes the desired free pool. Returns false if hosts still present in the freepool. * rename_freepool(free_pool_uuid, new_name) : change the desired freepool name * freepool_addhost(free_pool_name/uuid, host_uuid/name) : adds a host to the desired freepool. * freepool_removehost(free_pool_name/uuid, host_uuid/name) : removes a host from the desired freepool * get_freepool_list() : returns list of freepools * freepool_show(freepool_name/uuid) : returns extraspecs of the freepool and tenant_id * freepool_hosts(freepool_name/uuid) : returns lists of hosts belonging to the freepool.
Reservation API (user CLI)
These interfaces will be managed by the reservation controller. Basically, the idea is : once a lease gets started, it will create an host aggregate (let's call it lease pool) with tenancy metadata, and selects from freepools the right hosts based upon capabilities asked in the lease.
* create_leasepool(tenant_id, [name]) : creates a lease pool with tenant_id as parameter. Name of the leasepool can be optional. This will be called when the lease starts * delete_leasepool(lease_pool_uuid) : deletes the desired leasepool. This will be called when the lease ends. *
Efficiency Service (climate-efficiency service ?)
The goal of this service is to periodically take care of daily status of how many servers per freepool can be shutdown based upon daily lease demands.