Lesson 4 · OpenStack Production Engineer
Nova Architecture — Which Component Owns Which Failure
The Nova services, what each one owns, and how to tell from a stuck instance which component to investigate first.
Objectives
- Name the Nova services and state what each one owns
- Trace a boot request through the components that handle it
- Map an instance task state to the component currently responsible
- Decide which log to open first from the state an instance is stuck in
Nova is not one service
nova in conversation means a handful of separate processes that hand work to each other over the
message bus. When an instance fails, exactly one of them is usually at fault, and naming it early
is most of the diagnosis.
| Component | Owns | Runs on |
|---|---|---|
nova-api |
Accepting requests, validating them, writing the initial database record | Controllers |
nova-scheduler |
Choosing which host will run the instance | Controllers |
nova-conductor |
Orchestrating the build, talking to the database on behalf of compute | Controllers |
nova-compute |
Actually creating the instance on a hypervisor | Every compute host |
placement |
Tracking what resources exist and what is allocated | Controllers |
Two design decisions explain most of Nova’s behaviour:
nova-compute does not talk to the database. It goes through nova-conductor. This was done
so a compromised compute host cannot reach the database directly, and it means a conductor problem
presents as compute hosts being unable to do anything while looking perfectly healthy.
Nothing is synchronous. The API returns as soon as the record is written. Everything after that
happens in the background, which is why openstack server create succeeding tells you almost
nothing about whether the instance will exist.
The path of a boot request
client
│ POST /servers
▼
nova-api ──────────► database (instance record, state: BUILDING)
│ message bus
▼
nova-scheduler ────► placement (which hosts can fit this?)
│ message bus ◄──── candidate list
▼
nova-conductor ────► database (target host recorded)
│ message bus
▼
nova-compute ──────► hypervisor (create the domain)
│ ► neutron (plug the ports)
│ ► cinder (attach the volumes)
▼
ACTIVE
Each arrow is a place the request can stop. The instance’s state tells you which arrow you did not get past.
Task state is the diagnostic field
openstack server list shows Status. That is the coarse view. The useful field is task_state,
which names what is being attempted right now.
An instance stuck in a task state points directly at a component:
| Stuck in | Waiting on | Open this log first |
|---|---|---|
scheduling |
The scheduler finding a host | nova-scheduler |
block_device_mapping |
Cinder creating or attaching a volume | cinder-volume, then the backend |
networking |
Neutron creating and binding ports | neutron-server, then the L2 agent on the host |
spawning |
The hypervisor on the target host | nova-compute on that host, then libvirt |
deleting |
Cleanup that is not completing | nova-compute on the recorded host |
null with ERROR |
Nothing — it has already failed | openstack server show fault field |
Where the two most confusing failures live
Stuck in spawning forever. The scheduler picked a host, conductor recorded it, and
nova-compute on that host is not finishing. The instance record looks healthy; the API is fine;
the scheduler did its job. Only the compute host has the answer, and you need to know which host —
which is why the host field matters more than it looks.
ERROR with no obvious cause. Nova recorded a failure that came from somewhere else. Volume
attachment failures, port binding failures, and image download failures all surface as a Nova
error, because Nova is the service that was orchestrating. The fault field usually names the real
origin.
Placement is separate, and its state can be wrong
Placement tracks inventory (what a host has) and allocations (what is spoken for). The scheduler asks placement which hosts can fit a request; placement answers from its own records, not by asking the hosts.
This means placement can be wrong. Allocations are created during a build and removed during a delete, and a failure between those two points can leave an allocation for an instance that no longer exists. The result is a host that appears full while running very little.
If placement claims more consumers than the host has instances, the difference is stale. This is the most common cause of a cloud that reports being full at 40% utilisation.
Which component to suspect first
Work from the evidence you already have rather than from where the error appeared:
- Did the instance get a host? No host recorded means the scheduler never succeeded — a scheduling problem, not a compute problem.
- What is the task state? It names the component currently responsible.
- What does the fault field say? It often names a different service entirely.
- Is the recorded host healthy? An enabled-but-down compute service will accept work it cannot do.
- Do placement’s allocations match reality? Only relevant when scheduling fails despite apparent free capacity.
The instinct to start with nova-compute logs on a controller is a common and expensive mistake:
nova-compute does not run there.
Exercise
Boot an instance and poll openstack server show every couple of seconds, recording the sequence
of task states and which component owns each. You should see scheduling, then networking, then
spawning, then a transition to ACTIVE with a null task state.
Then create a failure deliberately. Stop nova-compute on a host, force an instance onto it, and
observe: which state it stops in, how long the cloud takes to notice the service is down, and what
the fault field says once it gives up. The lag between the failure and the cloud noticing is the
number worth remembering.
Verification status
This resource has not been executed end to end in a lab environment. Commands and configuration are reviewed by an engineer, but treat them as reference rather than as a tested procedure.
Author
James Joyner
Builds and operates the infrastructure layers underneath production AI systems.
James founded Inside The AI Stack to publish the kind of infrastructure and operations material he wanted while running production systems: specific, tested where it claims to be tested, and written by someone who has had to fix the thing at 3am. He works across AI infrastructure, private cloud, and platform engineering, and reviews every technical resource published here before it is marked as verified.
- AI infrastructure
- OpenStack operations
- Kubernetes
- Terraform
- Linux systems engineering
- Observability
Primary sources
- Nova system architecture — OpenStack Foundation
- Nova instance states reference — OpenStack Foundation
Continue from here
Related resources chosen because they are the next thing you would actually need — not because they share a keyword.
OpenStack Production Operations
Operating OpenStack in production: service state versus status, the message bus, placement disagreements, and the quiet failures that keep dashboards green.
Lab: Nova NoValidHost
Instances stopped building on a cloud with visible free capacity. Work the evidence, form hypotheses, and find why the scheduler has no candidates.
Control Plane Architecture
How OpenStack services communicate, why the message bus and database are the real dependencies, and what each service actually owns.
OpenStack Production Engineer
A sequenced learning path for engineers who operate OpenStack in production — architecture, service-by-service depth, deployment, and troubleshooting under pressure.
Newsletter
Inside The AI Stack Brief
A practical weekly briefing on AI engineering, infrastructure, production operations, and the technologies powering the AI stack.
One email a week. We send a confirmation link first and never mail an address that has not confirmed. No sponsorship placements inside the technical sections, and an unsubscribe link in every issue.
