Scheduling interaction for cells¶
In order to schedule instance builds to compute hosts Nova and the scheduler will need to take into account that hosts are grouped into cells. It is not necessary that this is apparent when Nova is requesting a placement decision.
In order to partition Nova into cells the scheduler will need to be involved earlier in the build process.
Operators want to partition their deployments into cells for scaling, failure domain, and buildout reasons. When partitioned, we need to have flexible scheduling that can make decisions on cells and hosts.
The scheduler will be queried at the api level so that it knows which cell to pass the build to. The instance table exists in a cell and not in the api database, so to create an instance we will first need to know which cell to create it in.
The scheduler will continue to return a (host, node) tuple and the calling service will look up the host in a mapping table to determine which cell it is in. This means the current select_destinations interface will not need to change. Querying the scheduler will take place after the API has returned a response so the most reasonable thing to do is pass the build request to a conductor operating outside of any cell. The conductor will call the scheduler and then create the instance in the cell and pass the build request to it.
Rescheduling will still take place within a cell via the normal compute->conductor loop, using the conductors within the cell. Adding rescheduling at a cell level will be a later effort.
Information about cells will need to be fed into the scheduler in order for it to account for that during its placement decisions, but that is outside the scope of this spec.
We could query the scheduler at two points like in cellsv1. This creates more deployment complexity and creates an unnecessary coupling between the architecture of Nova and the scheduler.
Data model impact¶
REST API impact¶
Other end user impact¶
Other deployer impact¶
Nova-conductor will need to be deployed for use by nova-api.
- Primary assignee:
- Other contributors:
Add a conductor method to call the scheduler and then handle the latter half of what the api currently does for a build request(create instance in db and cast to the cell conductor).
Update the conductor build_instances interface to take a scheduling decision and not call the scheduler if it’s provided. This allows for bypassing scheduling when it comes from the api conductor but still call the scheduler when a compute requests a reschedule.
Update devstack to spin up a conductor for use by the nova-api service.
Since this is designed to be an internal re-architecting of Nova with no user visible changes the current suite of Tempest or functional tests should suffice. At some point we will want to look at how to test multiple cells or potentially exposing the concept of a cell in the API and we will tackle testing requirements then.
Documentation will be written describing the flow of an instance build and how and where scheduling decisions are made.