OpenStack is not a single app — it’s a collection of services:
- Nova → compute / VMs
- Neutron → networking
- Cinder → block storage
- Swift → object storage
- Keystone → authentication
- Glance → VM images
- Horizon → web UI
Best homelab learning path
Install:
- MicroStack
Good because:
- Runs on one decent server
- Quick install
- Gives real OpenStack APIs
- Less pain than full enterprise deployment
Use this to learn:
- Create networks
- Upload VM images
- Launch instances
- Floating IPs
- Security groups
- Volumes
- Snapshots
Learning projects to do (practical)
These are what actually teach OpenStack:
Project 1 — Build a private cloud
Do:
- Create tenant/project
- Create private network
- Create subnet
- Create router
- Launch VM
- Assign floating IP
- SSH into VM
This teaches Nova + Neutron.
Project 2 — Persistent storage
Do:
- Create Cinder volume
- Attach to VM
- Snapshot volume
- Restore from snapshot
This teaches storage lifecycle.
Project 3 — Multi-tenant isolation
Create:
- Tenant A
- Tenant B
Verify:
- Networks isolated
- Security groups separate
- Quotas enforced
This teaches cloud governance.
Project 4 — Failure injection
Break things:
- Stop Neutron
- Fill disk
- Break RabbitMQ
- Kill database service
Then debug:
- Logs
- API failures
- scheduler failures
This teaches operational troubleshooting (valuable for SRE/observability roles).
Project 5 — Observe OpenStack
Since you’re focused on observability engineering, add:
- Prometheus
- Grafana
- OpenTelemetry
- Loki
Monitor:
- Nova API latency
- RabbitMQ queues
- MySQL/Galera health
- Neutron agents
- Hypervisor CPU
- Scheduler failures
- VM spawn times
Learn the architecture (important)
Understand these dependencies:
User/API
|
Keystone (auth)
|
Nova API
|
RabbitMQ ---- Database
|
Scheduler
|
Compute Node (KVM/libvirt)
Neutron -> OVS/Linux bridge
Cinder -> backend storage
Glance -> image repo
If you understand this flow, troubleshooting becomes much easier.
Command-line skills to practice
Use:
openstack server listopenstack network listopenstack image listopenstack volume listopenstack hypervisor listopenstack quota show
And inspect services underneath:
virshovs-vsctlip netnssystemctl- database queries
- RabbitMQ queues
MicroStack on Proxmox VM Objectives
Strong observability/SRE focus:
- Start with MicroStack
- Learn core OpenStack operations
- Move to Kolla-Ansible
- Instrument it with Prometheus/Grafana
- Practice failure debugging
That gives you OpenStack + observability + troubleshooting, which is much more valuable than just learning the dashboard UI.
Terraform Provisioning: MicroStack VM
main.tf
#########################################
# MicroStack VM Definition
#########################################
resource "proxmox_vm_qemu" "microstack" {
vmid = var.microstack_vmid
name = "microstack"
target_node = var.proxmox_node
clone = var.vm_template
full_clone = true
#########################################
# VM Type
#########################################
os_type = "cloud-init"
bios = "ovmf"
machine = "q35"
scsihw = "virtio-scsi-pci"
#########################################
# CPU
#########################################
cpu {
cores = 10
sockets = 1
type = "host"
numa = false
}
#########################################
# Memory
#########################################
memory = 49152
balloon = 0
#########################################
# Disks
#########################################
disks {
ide {
ide2 {
cloudinit {
storage = "local-lvm"
}
}
}
scsi {
#########################################
# Ubuntu OS Disk
#########################################
scsi0 {
disk {
storage = "zfs-local"
size = "120G"
cache = "writeback"
iothread = true
discard = true
}
}
#########################################
# OpenStack / MicroCeph Disk
#########################################
scsi1 {
disk {
storage = "zfs-local"
size = "750G"
cache = "writeback"
iothread = true
discard = true
}
}
}
}
#########################################
# Network
#########################################
network {
id = 0
model = "virtio"
bridge = var.vm_bridge
firewall = false
}
#########################################
# Cloud-init Networking
#########################################
ipconfig0 = "ip=${var.microstack_ip}/24,gw=${var.vm_gateway}"
nameserver = var.dns_server
#########################################
# Cloud-init User
#########################################
ciuser = var.vm_user
cipassword = var.vm_password
sshkeys = file(var.ssh_public_key_path)
#########################################
# Boot / Runtime
#########################################
onboot = true
agent = 1
#########################################
# Proxmox Features
#########################################
kvm = true
#########################################
# Boot Order
#########################################
boot = "order=scsi0"
#########################################
# Tags
#########################################
tags = "openstack,microstack,lab"
lifecycle {
ignore_changes = [tags]
}
}
variables.tf
#########################################
# Proxmox API
#########################################
variable "pm_api_url" {
description = "Proxmox API URL"
type = string
}
variable "pm_api_token_id" {
description = "Proxmox API Token ID (user@realm!token)"
type = string
}
variable "pm_api_token_secret" {
description = "Proxmox API Token Secret"
type = string
sensitive = true
}
#########################################
# Proxmox Node / Template
#########################################
variable "proxmox_node" {
description = "Target Proxmox node"
type = string
}
variable "vm_template" {
description = "Cloud-init template name"
type = string
}
#########################################
# VM Access
#########################################
variable "vm_user" {
description = "Cloud-init username"
type = string
}
variable "vm_password" {
description = "Cloud-init password"
type = string
sensitive = true
}
#########################################
# Network
#########################################
variable "vm_bridge" {
description = "Proxmox network bridge"
type = string
}
variable "vm_gateway" {
description = "Default gateway"
type = string
}
variable "dns_server" {
description = "DNS server"
type = string
default = "1.1.1.1"
}
#########################################
# SSH
#########################################
variable "ssh_public_key_path" {
description = "Path to SSH public key"
type = string
validation {
condition = can(file(var.ssh_public_key_path))
error_message = "ssh_public_key_path must point to a valid file."
}
}
variable "ssh_private_key_path" {
description = "Path to SSH private key (for Ansible)"
type = string
validation {
condition = can(file(var.ssh_private_key_path))
error_message = "ssh_private_key_path must point to a valid file."
}
}
#########################################
# MicroStack VM Variables
#########################################
variable "microstack_ip" {
description = "Static IP for MicroStack VM"
type = string
}
variable "microstack_vmid" {
description = "VM ID for MicroStack"
type = number
default = 200
}
terraform.tfvars
#########################################
# Proxmox API
#########################################
pm_api_url = "https://<proxmox-ve-node>:8006/api2/json"
pm_api_token_id = "root@pam!terraform"
pm_api_token_secret = "<api-token>"
proxmox_node = "<proxmox-node-name>"
vm_template = "ubuntu-24-template"
vm_bridge = "vmbr0"
vm_gateway = "<gw>"
dns_server = "<dns>"
vm_user = "<user>"
vm_password = "<passwd>"
ssh_public_key_path = "id_rsa.pub"
ssh_private_key_path = "id_rsa"
#########################################
# MicroStack-specific
#########################################
microstack_ip = "<ms_ip>"
microstack_vmid = 200
MicroStack VM Provisioning & Preparation Checklist
| Step | Phase | Action | Command / Setting | Expected Result | Notes |
|---|---|---|---|---|---|
| 1 | Proxmox | Enable nested virtualization on host | cat /sys/module/kvm_intel/parameters/nested | Y | Already confirmed |
| 2 | Proxmox | Check host CPU topology | lscpu | 24 CPUs / 2 sockets / 12 cores | Confirms sizing |
| 3 | Terraform | Create MicroStack VM | terraform apply | VM provisioned | Ubuntu VM created |
| 4 | VM Config | CPU topology | 10 vCPU, type=host | CPU passthrough | Avoid overcommitting |
| 5 | VM Config | RAM | 48GB fixed | Memory available | Ballooning OFF |
| 6 | VM Config | Disk 1 | 120GB | Ubuntu OS disk | Root filesystem |
| 7 | VM Config | Disk 2 | 750GB | Data disk | For MicroCeph/OpenStack |
| 8 | VM Config | BIOS | OVMF | UEFI boot | Preferred |
| 9 | VM Config | Machine | q35 | Modern chipset | Required for better virtualization |
| 10 | VM Config | NIC | VirtIO | Fast paravirtualized network | Firewall OFF initially |
| 11 | VM Config | KVM | Enabled | Nested virtualization available | Required |
After First Boot into Ubuntu VM
| Step | Phase | Action | Command | Expected Result | Notes |
|---|---|---|---|---|---|
| 12 | Validate CPU | Check CPU topology | lscpu | 10 CPUs visible | Confirm guest topology |
| 13 | Validate Memory | Check RAM | free -h | ~47GB visible | Good |
| 14 | Validate Disk | Check disks | lsblk | sda + sdb | Two-disk layout |
| 15 | Validate KVM | Install checker | sudo apt install cpu-checker -y | Package installed | |
| 16 | Validate KVM | Verify acceleration | kvm-ok | KVM acceleration can be used | Critical check |
| 17 | Validate OS | Confirm Ubuntu version | lsb_release -a | Ubuntu 24.04 LTS | Recommended version |
| 18 | Validate Network | Check interfaces | ip a | NIC visible | |
| 19 | Validate Internet | Ping test | ping -c 3 8.8.8.8 | Replies | Needed for package installs |
| 20 | Validate Internet | Repo reachability | ping -c 3 archive.ubuntu.com | Replies | Confirms package access |
System Preparation Before OpenStack Install
| Step | Phase | Action | Command | Expected Result | Notes |
|---|---|---|---|---|---|
| 21 | Swap | Create swap file | sudo fallocate -l 8G /swapfile | File created | Prevents memory pressure issues |
| 22 | Swap | Secure permissions | sudo chmod 600 /swapfile | Permission set | Required |
| 23 | Swap | Format swap | sudo mkswap /swapfile | Swap signature created | |
| 24 | Swap | Enable swap | sudo swapon /swapfile | Swap active | |
| 25 | Swap | Persist across reboot | echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab | Added to fstab | Permanent |
| 26 | Verify Swap | Confirm swap active | free -h | Swap: 8Gi | Final check |
Package Preparation Before OpenStack Install
| Step | Phase | Action | Command | Expected Result | Notes |
|---|---|---|---|---|---|
| 27 | Update package metadata | Refresh package index | sudo apt update | Repo metadata refreshed | |
| 28 | Upgrade system | Install all updates | sudo apt upgrade -y | 182 packages upgraded | Important before snaps |
| 29 | General tools | Install utilities | sudo apt install curl jq net-tools cpu-checker -y | Packages installed | Useful tooling |
| 30 | Reboot | Reboot after updates | sudo reboot | Clean system restart | End point of this checklist |
Validation Commands (after reboot, before OpenStack install)
| Step | Action | Command | Expected Result |
|---|---|---|---|
| 31 | Verify CPU | lscpu | 10 vCPU |
| 32 | Verify RAM | free -h | ~47GB + swap |
| 33 | Verify disks | lsblk | sda + sdb |
| 34 | Verify KVM | kvm-ok | KVM acceleration available |
| 35 | Verify network | ping -c 3 archive.ubuntu.com | Internet reachable |
OpenStack vs MicroStack — Components, Architecture, and Commands
| Area | OpenStack | MicroStack |
|---|---|---|
| What it is | Full enterprise cloud platform | Lightweight packaged OpenStack distribution |
| Maintainer | OpenInfra Foundation | Canonical |
| Deployment Style | Multi-node enterprise architecture | Single-node or small-cluster deployment |
| Complexity | High | Low-to-medium |
| Installation | Manual / Ansible / Helm / Kolla / Juju | Snap-based installer |
| Best For | Enterprises, telcos, service providers | Labs, edge, dev/test, PoC |
| Operations Model | Deep infrastructure engineering | Simplified operations |
| HA Design | Full HA clusters | Limited/simple HA |
| Networking | Fully customizable SDN | Opinionated/simple defaults |
| Storage | Enterprise Ceph/SAN integrations | Simpler integrated storage |
| Kubernetes Integration | Magnum/Kolla/OpenStack-Helm | External K8s or lightweight integration |
| Scale | Thousands of nodes | Small-to-medium deployments |
Architectural Difference
Full OpenStack
Controllers
├── Keystone
├── Nova API
├── Neutron API
├── Glance
├── RabbitMQ
├── MariaDB
└── Horizon
Compute Nodes
├── nova-compute
├── KVM/libvirt
└── OVS/OVN
Storage Nodes
└── Ceph/Swift
MicroStack
Single Host or Small Cluster
├── Keystone
├── Nova
├── Neutron
├── Glance
├── OVN
├── RabbitMQ
├── MySQL
├── Horizon
└── KVM/libvirt
MicroStack packages most services together in a simplified deployment model.
Core Components Comparison
| Function | OpenStack Service | MicroStack Equivalent | Notes |
|---|---|---|---|
| Identity | Keystone | Keystone | Same service |
| Compute | Nova | Nova | Same |
| Networking | Neutron | Neutron + OVN | Simplified networking |
| Images | Glance | Glance | Same |
| Dashboard | Horizon | Horizon | Same |
| Block Storage | Cinder | Cinder | Usually simpler backend |
| Object Storage | Swift | Optional/not typical | Often omitted |
| Telemetry | Ceilometer/Gnocchi | Usually absent | Reduced complexity |
| Orchestration | Heat | Optional | Not always enabled |
| Bare Metal | Ironic | Usually absent | Labs rarely need it |
| Kubernetes | Magnum | Rarely deployed | External K8s preferred |
| Database | MariaDB Galera | MySQL/MariaDB | Packaged internally |
| Messaging | RabbitMQ | RabbitMQ | Internalized |
| SDN | OVN/OVS/ML2 | OVN default | Opinionated defaults |
Installation Comparison
Traditional OpenStack Deployment
Usually uses:
- Kolla-Ansible
- OpenStack-Ansible
- Juju
- TripleO (legacy)
- Helm/Kubernetes
Example:
kolla-ansible deploy
Requires:
- Networking design
- HA planning
- Storage architecture
- DB clustering
- Message queue clustering
MicroStack Installation
Very simple:
sudo snap install openstack
Bootstrap:
sunbeam cluster bootstrap
Add node:
sunbeam cluster join
Command Comparison
1. Authentication
| Task | OpenStack | MicroStack |
|---|---|---|
| Load credentials | source admin-openrc | sunbeam openrc > admin-openrc |
| Authenticate | openstack token issue | openstack token issue |
Example:
source admin-openrc
openstack token issue
2. VM Management
| Task | OpenStack | MicroStack |
|---|---|---|
| List VMs | openstack server list | Same |
| Create VM | openstack server create | Same |
| Delete VM | openstack server delete | Same |
Example:
openstack server list
3. Images
| Task | OpenStack | MicroStack |
|---|---|---|
| List images | openstack image list | Same |
| Upload image | openstack image create | Same |
Example:
openstack image list
4. Networking
| Task | OpenStack | MicroStack |
|---|---|---|
| List networks | openstack network list | Same |
| List routers | openstack router list | Same |
| Floating IPs | openstack floating ip list | Same |
Example:
openstack network list
5. Storage
| Task | OpenStack | MicroStack |
|---|---|---|
| List volumes | openstack volume list | Same |
| Create volume | openstack volume create | Same |
Example:
openstack volume create --size 20 my-volume
6. Cluster Management
This is where MicroStack differs significantly.
| Task | Enterprise OpenStack | MicroStack |
|---|---|---|
| Cluster bootstrap | External tooling | sunbeam cluster bootstrap |
| Add nodes | Ansible/Juju/manual | sunbeam cluster add |
| Generate join token | Manual automation | sunbeam cluster join-token |
| Inspect cluster | Multiple tools | sunbeam cluster list |
Example:
sunbeam cluster list
7. Service Management
OpenStack
Usually:
systemctl status nova-api
systemctl status neutron-server
Or containerized:
docker ps
podman ps
MicroStack
Snap-managed:
sudo snap services openstack
Restart services:
sudo snap restart openstack
8. Logs
OpenStack
journalctl -u nova-api
journalctl -u neutron-server
Or:
/var/log/nova/
/var/log/neutron/
MicroStack
sudo journalctl -u snap.openstack.*
Or:
sudo snap logs openstack
9. Networking Backends
| Feature | OpenStack | MicroStack |
|---|---|---|
| OVS | Supported | Supported |
| OVN | Supported | Default |
| SR-IOV | Common | Limited |
| VLAN/VXLAN | Fully configurable | Simpler |
| DPDK | Enterprise use | Rare |
10. Storage Backends
| Backend | OpenStack | MicroStack |
|---|---|---|
| Ceph | Full enterprise integration | Optional/simpler |
| LVM | Supported | Common |
| NFS | Supported | Possible |
| Swift | Common large-scale | Rare |
Operational Complexity Comparison
| Area | OpenStack | MicroStack |
|---|---|---|
| Deployment | Complex | Easy |
| Upgrades | Careful orchestration | Simpler |
| HA | Advanced clustering | Basic |
| Scaling | Massive | Moderate |
| Debugging | Distributed systems expertise | Easier |
| Resource Usage | High | Lower |
| Learning Curve | Steep | Gentle |
Best Use Cases
OpenStack
Best for:
- Telco NFV
- Enterprise private cloud
- Sovereign cloud
- HPC
- Large-scale virtualization
- VMware replacement
MicroStack
Best for:
- Home labs
- CI/CD labs
- Edge computing
- OpenStack learning
- Development/testing
- Lightweight private cloud
Operational Philosophy
| OpenStack | MicroStack |
|---|---|
| “Build a cloud platform” | “Run OpenStack quickly” |
| Deep customization | Opinionated defaults |
| Infrastructure engineering heavy | Developer/operator friendly |
| Large-scale production | Small/medium environments |
Practical Mental Model
MicroStack = Opinionated lightweight OpenStack distribution
OpenStack = Full enterprise cloud framework
MicroStack gives you:
- The SAME APIs
- The SAME core services
- The SAME CLI
…but packaged and automated for simpler deployment and operations.
That makes it excellent for:
- Learning OpenStack
- Home labs
- Edge infrastructure
- Lightweight production clouds
- Rapid PoCs and demos