MicroStack on Proxmox VM

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 list
  • openstack network list
  • openstack image list
  • openstack volume list
  • openstack hypervisor list
  • openstack quota show

And inspect services underneath:

  • virsh
  • ovs-vsctl
  • ip netns
  • systemctl
  • database queries
  • RabbitMQ queues

MicroStack on Proxmox VM Objectives

Strong observability/SRE focus:

  1. Start with MicroStack
  2. Learn core OpenStack operations
  3. Move to Kolla-Ansible
  4. Instrument it with Prometheus/Grafana
  5. 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

StepPhaseActionCommand / SettingExpected ResultNotes
1ProxmoxEnable nested virtualization on hostcat /sys/module/kvm_intel/parameters/nestedYAlready confirmed
2ProxmoxCheck host CPU topologylscpu24 CPUs / 2 sockets / 12 coresConfirms sizing
3TerraformCreate MicroStack VMterraform applyVM provisionedUbuntu VM created
4VM ConfigCPU topology10 vCPU, type=hostCPU passthroughAvoid overcommitting
5VM ConfigRAM48GB fixedMemory availableBallooning OFF
6VM ConfigDisk 1120GBUbuntu OS diskRoot filesystem
7VM ConfigDisk 2750GBData diskFor MicroCeph/OpenStack
8VM ConfigBIOSOVMFUEFI bootPreferred
9VM ConfigMachineq35Modern chipsetRequired for better virtualization
10VM ConfigNICVirtIOFast paravirtualized networkFirewall OFF initially
11VM ConfigKVMEnabledNested virtualization availableRequired

After First Boot into Ubuntu VM

StepPhaseActionCommandExpected ResultNotes
12Validate CPUCheck CPU topologylscpu10 CPUs visibleConfirm guest topology
13Validate MemoryCheck RAMfree -h~47GB visibleGood
14Validate DiskCheck diskslsblksda + sdbTwo-disk layout
15Validate KVMInstall checkersudo apt install cpu-checker -yPackage installed
16Validate KVMVerify accelerationkvm-okKVM acceleration can be usedCritical check
17Validate OSConfirm Ubuntu versionlsb_release -aUbuntu 24.04 LTSRecommended version
18Validate NetworkCheck interfacesip aNIC visible
19Validate InternetPing testping -c 3 8.8.8.8RepliesNeeded for package installs
20Validate InternetRepo reachabilityping -c 3 archive.ubuntu.comRepliesConfirms package access

System Preparation Before OpenStack Install

StepPhaseActionCommandExpected ResultNotes
21SwapCreate swap filesudo fallocate -l 8G /swapfileFile createdPrevents memory pressure issues
22SwapSecure permissionssudo chmod 600 /swapfilePermission setRequired
23SwapFormat swapsudo mkswap /swapfileSwap signature created
24SwapEnable swapsudo swapon /swapfileSwap active
25SwapPersist across rebootecho '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabAdded to fstabPermanent
26Verify SwapConfirm swap activefree -hSwap: 8GiFinal check

Package Preparation Before OpenStack Install

StepPhaseActionCommandExpected ResultNotes
27Update package metadataRefresh package indexsudo apt updateRepo metadata refreshed
28Upgrade systemInstall all updatessudo apt upgrade -y182 packages upgradedImportant before snaps
29General toolsInstall utilitiessudo apt install curl jq net-tools cpu-checker -yPackages installedUseful tooling
30RebootReboot after updatessudo rebootClean system restartEnd point of this checklist

Validation Commands (after reboot, before OpenStack install)

StepActionCommandExpected Result
31Verify CPUlscpu10 vCPU
32Verify RAMfree -h~47GB + swap
33Verify diskslsblksda + sdb
34Verify KVMkvm-okKVM acceleration available
35Verify networkping -c 3 archive.ubuntu.comInternet reachable

OpenStack vs MicroStack — Components, Architecture, and Commands

AreaOpenStackMicroStack
What it isFull enterprise cloud platformLightweight packaged OpenStack distribution
MaintainerOpenInfra FoundationCanonical
Deployment StyleMulti-node enterprise architectureSingle-node or small-cluster deployment
ComplexityHighLow-to-medium
InstallationManual / Ansible / Helm / Kolla / JujuSnap-based installer
Best ForEnterprises, telcos, service providersLabs, edge, dev/test, PoC
Operations ModelDeep infrastructure engineeringSimplified operations
HA DesignFull HA clustersLimited/simple HA
NetworkingFully customizable SDNOpinionated/simple defaults
StorageEnterprise Ceph/SAN integrationsSimpler integrated storage
Kubernetes IntegrationMagnum/Kolla/OpenStack-HelmExternal K8s or lightweight integration
ScaleThousands of nodesSmall-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

FunctionOpenStack ServiceMicroStack EquivalentNotes
IdentityKeystoneKeystoneSame service
ComputeNovaNovaSame
NetworkingNeutronNeutron + OVNSimplified networking
ImagesGlanceGlanceSame
DashboardHorizonHorizonSame
Block StorageCinderCinderUsually simpler backend
Object StorageSwiftOptional/not typicalOften omitted
TelemetryCeilometer/GnocchiUsually absentReduced complexity
OrchestrationHeatOptionalNot always enabled
Bare MetalIronicUsually absentLabs rarely need it
KubernetesMagnumRarely deployedExternal K8s preferred
DatabaseMariaDB GaleraMySQL/MariaDBPackaged internally
MessagingRabbitMQRabbitMQInternalized
SDNOVN/OVS/ML2OVN defaultOpinionated 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

TaskOpenStackMicroStack
Load credentialssource admin-openrcsunbeam openrc > admin-openrc
Authenticateopenstack token issueopenstack token issue

Example:

source admin-openrc
openstack token issue

2. VM Management

TaskOpenStackMicroStack
List VMsopenstack server listSame
Create VMopenstack server createSame
Delete VMopenstack server deleteSame

Example:

openstack server list

3. Images

TaskOpenStackMicroStack
List imagesopenstack image listSame
Upload imageopenstack image createSame

Example:

openstack image list

4. Networking

TaskOpenStackMicroStack
List networksopenstack network listSame
List routersopenstack router listSame
Floating IPsopenstack floating ip listSame

Example:

openstack network list

5. Storage

TaskOpenStackMicroStack
List volumesopenstack volume listSame
Create volumeopenstack volume createSame

Example:

openstack volume create --size 20 my-volume

6. Cluster Management

This is where MicroStack differs significantly.

TaskEnterprise OpenStackMicroStack
Cluster bootstrapExternal toolingsunbeam cluster bootstrap
Add nodesAnsible/Juju/manualsunbeam cluster add
Generate join tokenManual automationsunbeam cluster join-token
Inspect clusterMultiple toolssunbeam 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

FeatureOpenStackMicroStack
OVSSupportedSupported
OVNSupportedDefault
SR-IOVCommonLimited
VLAN/VXLANFully configurableSimpler
DPDKEnterprise useRare

10. Storage Backends

BackendOpenStackMicroStack
CephFull enterprise integrationOptional/simpler
LVMSupportedCommon
NFSSupportedPossible
SwiftCommon large-scaleRare

Operational Complexity Comparison

AreaOpenStackMicroStack
DeploymentComplexEasy
UpgradesCareful orchestrationSimpler
HAAdvanced clusteringBasic
ScalingMassiveModerate
DebuggingDistributed systems expertiseEasier
Resource UsageHighLower
Learning CurveSteepGentle

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

OpenStackMicroStack
“Build a cloud platform”“Run OpenStack quickly”
Deep customizationOpinionated defaults
Infrastructure engineering heavyDeveloper/operator friendly
Large-scale productionSmall/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