Cornerstone guide
OpenStack Production Operations — Reading a Cloud That Is Lying to You
Operating OpenStack in production: service state versus status, the message bus, placement disagreements, and the quiet failures that keep dashboards green.
OpenStack rarely fails by returning an error. It fails by continuing to accept requests while the thing that fulfils them has stopped participating. The API is up, the dashboard is green, and nothing works.
Learning to read that state is most of what production OpenStack operations consists of.
Status and State are different columns
Every OpenStack service listing reports two things that people read as one:
- Status — administrative intent.
enabledordisabled. Someone set this. - State — reality.
upordown. Derived from whether the service reported in recently.
compute-03 is disabled and down: somebody took it out deliberately. Fine.
compute-02 is enabled and down. The control plane still counts it as part of the cloud. It
contributes to capacity arithmetic, it is a scheduling candidate, and nothing is answering there.
That is the row that ruins your evening.
The first five minutes
Three commands, in this order, before anything else:
openstack compute service list
openstack network agent list
openstack volume service list
Neutron reports differently and it trips people up: the Alive column is liveness (:-) or
XXX) and State is administrative. The opposite way round from compute and volume.
If all three are clean, service liveness is not your problem and you move on to placement, quota, and the message bus. If any service is enabled and down, stop and fix that first — everything downstream of it will produce misleading symptoms.
The message bus is the real dependency
Every OpenStack service talks to every other through RabbitMQ. Services do not connect to each other directly, which means a message bus problem presents as an unrelated service failing.
The characteristic symptom is a service that is running — the process is alive, it responds to a
signal, its logs show it starting — but is reported as down because its periodic report is not
arriving.
# Cluster health and partitions
docker exec rabbitmq rabbitmqctl cluster_status
# Queues that are growing are the ones nobody is consuming
docker exec rabbitmq rabbitmqctl list_queues name messages consumers \
| awk '$2 > 100'
A queue with many messages and zero consumers identifies precisely which service stopped listening. That is often faster than reading any log.
Placement disagreements
Placement tracks resource inventory and allocations, and Nova schedules against it. When the two
disagree, capacity appears consumed that is not, and you get NoValidHost on a cloud that is half
empty.
openstack hypervisor list
openstack resource provider list
openstack resource provider inventory list <provider-uuid>
openstack resource provider allocation list <provider-uuid>
The usual cause is orphaned allocations: instances that were deleted in a way that did not clean up their allocation, typically after a compute service crash mid-operation.
# Nova ships a consistency check for exactly this class of problem
nova-manage placement audit --verbose
Diagnosing by symptom
Instances will not build
NoValidHost / "No valid host was found"
├─ Any compute service enabled but down? → fix that first
├─ Hypervisors listed but not in placement? → resource provider registration
├─ Placement shows capacity consumed?
│ ├─ genuinely consumed → capacity problem
│ └─ orphaned → nova-manage placement audit
├─ Flavor requests something no host offers? → extra specs, traits, aggregates
└─ Scheduler filters excluding everything? → read the scheduler log; the
filter that returned zero is named
The scheduler log states which filter eliminated all hosts. That single line usually replaces an hour of speculation.
docker logs nova_scheduler 2>&1 | grep -iE 'filter returned 0|no valid host' | tail -20
Instances build but have no network
openstack network agent list # any agent not alive?
openstack port list --server <instance> # does the port exist?
openstack port show <port-id> # is it ACTIVE and bound?
A port stuck in DOWN or BUILD means the L2 agent on that host did not wire it up. That is
usually the agent being dead or the agent’s connection to the bus being broken — back to the
message bus.
Volumes fail to create
openstack volume service list
docker logs cinder_scheduler 2>&1 | tail -50
No valid backend was found is the volume equivalent of NoValidHost, and the usual cause is
identical in shape: cinder-volume stopped reporting capacity, so capacity filtering returns zero
candidates. The Cinder scheduler runbook
covers this procedure in full.
Everything is slow
Check the database before the services:
# Galera: is the cluster whole?
docker exec mariadb mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
docker exec mariadb mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment';"
A Galera cluster that has lost quorum accepts reads and rejects writes, which produces timeouts scattered across every service and no obvious single cause.
What to check daily
# Service liveness across all three
openstack compute service list -f value -c Binary -c Host -c State | grep -v ' up$'
openstack network agent list -f value -c 'Agent Type' -c Host -c Alive | grep -v ':-)'
openstack volume service list -f value -c Binary -c Host -c State | grep -v ' up$'
# Instances that ended up in error
openstack server list --all-projects --status ERROR
# Message bus queues without consumers
docker exec rabbitmq rabbitmqctl list_queues name messages consumers | awk '$3 == 0 && $2 > 0'
Any output from these is worth investigating. Silence is the healthy result.
The pattern to internalise
Almost every confusing OpenStack incident resolves to one of three things:
- A service is enabled but not reporting. The control plane thinks it exists; it does not answer.
- The message bus is not delivering. Services are alive and not talking.
- Placement and reality disagree. Capacity accounting is wrong in one direction or the other.
Check those three before investigating the service that appears to be failing. The service that appears to be failing is usually a victim.
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
- OpenStack Operations Guide — OpenStack Foundation
- Nova system architecture — OpenStack Foundation
- Placement service documentation — OpenStack Foundation
Continue from here
Related resources chosen because they are the next thing you would actually need — not because they share a keyword.
Kolla-Ansible Production Architecture
How Kolla-Ansible actually structures an OpenStack deployment, where configuration comes from, and how to make changes without discovering them during an outage.
The AI Stack Explained
A layer-by-layer map of the modern AI stack, what each layer is actually responsible for, and where production systems tend to break in practice.
Cinder — No Valid Backend
Diagnose and remediate OpenStack volume creation failures caused by the scheduler having no candidate backends, including the case where the API reports healthy.
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.
Tool
OpenStack Health Analyzer
Turn service and agent listings into a ranked view of what is actually broken.
Available now
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. No sponsorship placements inside the technical sections. Unsubscribe in one click.