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