
Installing Openstack on Openshift - The Process
Posted on May 25, 2025
Installing Openstack on Openshift - The Process
So you're convinced that running Openstack on Openshift is a good idea? Great! Let's walk through how you actually get this thing up and running.
Prerequisites - The Boring But Important Stuff
First things first, you'll need an Openshift cluster that's already running. Obviously! You can't install Openstack on something that doesn't exist. Your cluster needs to be version 4.18 or newer - that's when the Openstack operator became available.
You'll also need storage. Lots of it. Openstack's control plane services need persistent storage for their databases and configuration. Make sure your cluster has a decent storage class configured.
The Operator Installation
Here's where it gets interesting. Remember how I mentioned that operators manage everything in Openshift? Well, first we need to install the Openstack operator itself.
Head over to the OperatorHub in your Openshift web console. Search for "Red Hat Openstack Services" or just "RHOSO" if you're feeling lazy. Click install and let Openshift do its magic.
The operator will deploy into its own namespace and start watching for Openstack custom resources. Think of it as hiring a very competent robot butler to manage your Openstack deployment.
Creating Your Openstack Instance
Now comes the fun part! With the operator installed, you create what's called a "custom resource" that describes your Openstack deployment. This is just a YAML file that tells the operator "hey, I want Openstack with these specific services enabled."
apiVersion: core.openstack.org/v1beta1
kind: OpenStackControlPlane
metadata:
name: my-openstack
spec:
# Your configuration goes here
Deploy this YAML and watch as the operator springs into action, spinning up containers for Nova, Neutron, Cinder, Glance - all the usual suspects. But now they're running as pods in your Openshift cluster!
The Magic Happens
The really cool thing? The operator handles all the interconnections between services. No more manually editing configuration files or wondering if service A can talk to service B. The operator knows how to wire everything together correctly.
And remember that upgrade problem I mentioned? When a new version comes out, you just update your custom resource and the operator handles the rolling upgrade. No more weekend maintenance windows that turn into all-nighters!
Complicated? Not really. Different? Absolutely. But different in a "why didn't we do this years ago" kind of way.
Getting Your Hands Dirty - The Technical Steps
Alright, enough theory! Let's actually get this thing installed. Here's the step-by-step process to get Openstack running on your Openshift cluster.
Step 1: Prepare Your Openshift Cluster
First things first - make sure you've got the prerequisites sorted:
# Check your Openshift version
oc version
# Make sure you're cluster-admin
oc whoami
oc auth can-i '*' '*'
You need Openshift 4.18 or later and cluster-admin privileges. No shortcuts here!
Step 2: Install the RHOSO Operator
Navigate to your Openshift web console and head to Operators > OperatorHub. Search for "Red Hat OpenStack Services" and click install.
Or if you're a command line person like me:
# Create the operator subscription
cat <<EOF | oc apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: openstack-operator
namespace: openstack-operators
spec:
channel: stable
name: openstack-operator
source: redhat-operators
sourceNamespace: openshift-marketplace
EOF
Wait for the operator to install. You can check its status:
oc get csv -n openstack-operators
Step 3: Create Your Infrastructure Namespace
The Openstack services need somewhere to live:
# Create the namespace
oc create namespace openstack
# Label it for proper networking
oc label namespace openstack security.openshift.io/scc.podSecurityLabelSync=false
oc label namespace openstack pod-security.kubernetes.io/enforce=privileged
Step 4: Set Up Storage Classes
Openstack needs persistent storage. Make sure you have storage classes available:
# Check available storage classes
oc get storageclass
# If you need to create one (example for local storage)
cat <<EOF | oc apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
Step 5: Deploy Your OpenStack Control Plane
Now for the main event! Create your OpenStackControlPlane custom resource:
apiVersion: core.openstack.org/v1beta1
kind: OpenStackControlPlane
metadata:
name: openstack-control-plane
namespace: openstack
spec:
storageClass: local-storage
# Database configuration
galera:
enabled: true
templates:
openstack:
storageRequest: 500Gi
# Message queue
rabbitmq:
templates:
rabbitmq:
storageRequest: 10Gi
# Core OpenStack services
keystone:
enabled: true
template:
databaseInstance: openstack
glance:
enabled: true
template:
databaseInstance: openstack
storageRequest: 10Gi
nova:
enabled: true
template:
cellTemplates:
cell0:
conductorServiceTemplate:
replicas: 1
cell1:
conductorServiceTemplate:
replicas: 1
neutron:
enabled: true
template:
databaseInstance: openstack
cinder:
enabled: true
template:
databaseInstance: openstack
Deploy it:
oc apply -f openstack-control-plane.yaml
Step 6: Watch the Magic Happen
The operator will start deploying services. You can watch the progress:
# Watch pods being created
oc get pods -n openstack -w
# Check the control plane status
oc get openstackcontrolplane -n openstack
# Get detailed status
oc describe openstackcontrolplane openstack-control-plane -n openstack
This will take a while - the operator needs to deploy databases, message queues, and all the OpenStack services. Go grab a coffee!
Step 7: Verify Your Deployment
Once everything's running, you should see something like:
# All pods should be Running
oc get pods -n openstack
# Services should be ready
oc get svc -n openstack
# Your control plane should show as Ready
oc get openstackcontrolplane -n openstack
Step 8: Access Your OpenStack
The operator will create routes for the OpenStack APIs. Find your endpoint:
# Get the keystone public endpoint
oc get route -n openstack | grep keystone
# Get admin credentials (they're stored in a secret)
oc get secret -n openstack | grep admin
And that's it! You now have OpenStack running as containers in your Openshift cluster. The operator is managing everything - databases, services, networking, the whole shebang.
Pretty straightforward, right? No more wrestling with configuration files or hoping services start in the right order. The operator handles all that complexity for you!