OpenStack — How It Works¶
Internal mechanisms, VM lifecycle, network data paths, and service interactions.
VM Provisioning Flow¶
sequenceDiagram
participant User as User / Horizon
participant KS as Keystone
participant Nova_API as Nova API
participant Sched as Nova Scheduler
participant MQ as RabbitMQ
participant Compute as Nova Compute
participant Neutron as Neutron
participant Glance as Glance
participant Cinder as Cinder
User->>KS: Authenticate (token)
KS-->>User: Token
User->>Nova_API: POST /servers (flavour, image, network)
Nova_API->>KS: Validate token
Nova_API->>Glance: Check image exists
Nova_API->>Neutron: Allocate port
Nova_API->>MQ: Schedule request
MQ->>Sched: Pick host
Sched->>Sched: Filter: RAM, CPU, disk, AZ
Sched->>Sched: Weigh: balance, spread
Sched->>MQ: Host selected
MQ->>Compute: Build instance
Compute->>Glance: Download image
Compute->>Cinder: Attach volume (if any)
Compute->>Neutron: Plug port → OVN
Compute->>Compute: Launch KVM/QEMU domain
Compute->>Nova_API: Instance ACTIVE
Neutron Networking (OVN)¶
flowchart TB
subgraph Tenant["Tenant Network"]
VM1["VM 1\n(10.0.0.2)"]
VM2["VM 2\n(10.0.0.3)"]
end
subgraph OVN["OVN Data Path"]
LS["Logical Switch\n(tenant subnet)"]
LR["Logical Router\n(inter-subnet)"]
GW["Gateway Router\n(external)"]
SNAT["SNAT\n(floating IP)"]
end
subgraph Physical["Physical Network"]
ExtNet["External Network\n(provider bridge)"]
end
VM1 --> LS
VM2 --> LS
LS --> LR
LR --> GW
GW --> SNAT
SNAT --> ExtNet
style OVN fill:#ef3e42,color:#fff
Ceph Integration¶
| OpenStack Service | Ceph Layer | Purpose |
|---|---|---|
| Cinder | RBD (RADOS Block Device) | Persistent VM volumes |
| Glance | RBD or RGW (Object) | VM image storage |
| Nova | RBD (ephemeral disks) | Live migration enabler |
| Swift | RGW (RADOS Gateway) | S3-compatible object store |
| Manila | CephFS | Shared file systems |
Multi-Region Architecture¶
flowchart TB
subgraph Global["Global Services"]
KS_G["Keystone\n(shared identity)"]
end
subgraph Region1["Region 1"]
Nova1["Nova"]
Neutron1["Neutron"]
Cinder1["Cinder"]
Compute1["Compute Hosts"]
end
subgraph Region2["Region 2"]
Nova2["Nova"]
Neutron2["Neutron"]
Cinder2["Cinder"]
Compute2["Compute Hosts"]
end
KS_G --> Region1
KS_G --> Region2