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 |