When Virtualization Infrastructure Starts Scaling Out of Control
If you’re running a homelab with about 10-15 VMs on Proxmox, everything is likely still smooth sailing. But imagine when that number grows to 200 VMs, serving 5-7 different dev teams with a need for complete resource isolation. At this point, manually clicking to create each virtual machine or configuring VLANs for every team becomes an operational nightmare.
The biggest challenge is Multi-tenancy. You need a mechanism where each team manages their own quotas, creates their own VMs, and configures networking within their partition. If you stick with managing individual virtual machines, you’ll soon be overwhelmed by the daily influx of infrastructure support tickets.
Is OpenStack Really the Ideal Choice?
The first name people think of when building IaaS (Infrastructure as a Service) is usually OpenStack. I once tried to build an ‘internal AWS’ using this tool and realized one truth: OpenStack is incredibly difficult to digest. It’s a collection of dozens of projects like Nova, Neutron, Cinder… communicating through a highly complex Message Queue network.
To operate OpenStack stably, you need at least three dedicated engineers just to stay on standby. For small and medium IT teams, maintaining such a bulky infrastructure management system often does more harm than good. OpenStack is powerful, but the cost in terms of manpower and hardware resources (often requiring a minimum of 64-128GB of RAM just to run background services) is too high.
Comparing Current Private Cloud Approaches
To solve the infrastructure automation puzzle, we typically have three popular options:
- Proxmox VE / ESXi: Great for traditional virtualization. However, self-service capabilities for end-users are limited. Granular permissions and large-scale SDN management are quite fragmented.
- OpenStack: Fully featured but extremely difficult to configure. It requires deep administrative skills and powerful hardware to maintain stability.
- Apache CloudStack: This is the perfect middle ground. It provides an intuitive Web interface and centralized management for Compute, Storage, and Network. Most importantly, its architecture is much leaner than OpenStack.
Deploying CloudStack: Pragmatic and Resilient
CloudStack is the best OpenStack alternative if you prioritize stability. You can manage multiple Hypervisors like KVM, VMware, or XenServer simultaneously from a single dashboard. Here is how I set up a basic CloudStack cluster with KVM on Ubuntu 22.04.
1. Resource Preparation
You should prepare at least two physical nodes (or VMs for a lab):
- Management Server: Runs the control dashboard and database (Recommended: 4 vCPU, 8GB RAM).
- KVM Host: Where the users’ virtual machines actually run (The more RAM and CPU, the better).
Make sure the machines can communicate over the network and are assigned static IPs to avoid future issues.
2. Installing the Management Server
First, we need to install MySQL to store the entire system configuration.
# Update the system
sudo apt update && sudo apt upgrade -y
# Install MySQL Server
sudo apt install mysql-server -y
# Allow remote database access for CloudStack
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Change bind-address to 0.0.0.0
sudo systemctl restart mysql
Next, add the official CloudStack repository and proceed with the installation:
# Add CloudStack 4.18 repo
wget -O - http://download.cloudstack.org/release.asc | sudo apt-key add -
sudo add-apt-repository "deb http://download.cloudstack.org/ubuntu jammy 4.18"
# Install the server
sudo apt update
sudo apt install cloudstack-management -y
# Initialize the database
sudo cloudstack-setup-databases cloud:password@localhost --deploy-as=root:root_password
3. Configuring the KVM Host (Agent)
On the node running the VMs, you need to install cloudstack-agent. This is the bridge component that allows the Management Server to send commands to KVM.
sudo apt update
sudo apt install cloudstack-agent -y
# Configure Libvirt to open the control port
sudo nano /etc/libvirt/libvirtd.conf
# Ensure the following parameters are correct:
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
auth_tcp = "none"
mdns_adv = 0
Don’t forget to add the -l flag to the libvirtd_opts variable in the /etc/default/libvirtd file to enable network listening mode.
4. Configuration via Web Interface
Access http://<Management-IP>:8080/client with the username admin and password password. CloudStack will display a Wizard to guide you through creating a Zone.
CloudStack’s hierarchical structure is very logical: Zone (Data Center) > Pod (Rack) > Cluster (Group of servers sharing storage) > Host (Physical machine). If you want the system to be as flexible as AWS, you should choose the Advanced Networking model to leverage VLANs and Security Groups.
Crucial Lessons from Real-World Operation
After spending time ‘tinkering’ with CloudStack, I’ve drawn three important lessons:
- Prioritize Shared Storage: Use NFS or Ceph for Primary Storage. When a Host experiences a hardware failure, CloudStack will automatically migrate and restart the VMs on another Host in less than 30 seconds.
- Keep an Eye on System VMs: All templates and consoles run through two system virtual machines (SSVM and CPVM). If you don’t see the console screen, check the network status of these two VMs immediately.
- MTU Configuration: If using VXLAN, lower the VM’s MTU to 1450. This helps avoid packet loss due to the extra overhead of encapsulated packet headers.
CloudStack has truly liberated my workflow. Instead of tedious virsh commands, everything from IP allocation to bandwidth limiting is done in a few clicks. If you find Proxmox isn’t powerful enough but OpenStack is too heavy, give CloudStack a try. It really is a pragmatic IaaS solution.

