Minimal Environment
This guide walks you through deploying the smallest viable CobaltCore environment: one control plane node running the Kubernetes control plane and OpenStack services, and one hypervisor node running KVM virtual machines.
This is not a production configuration - it has no high availability and no redundant storage. It is suitable for exploration, development, and learning how the components fit together.
What you will deploy
┌─────────────────────────────────┐
│ Control Plane Node │
│ Kubernetes · OpenStack (Helm) │
│ Ceph (single node) │
└──────────────┬──────────────────┘
│
┌──────────────▼──────────────────┐
│ Hypervisor Node │
│ GardenLinux · KVM · libvirt │
│ Hypervisor Operator agents │
└─────────────────────────────────┘Prerequisites
- Two machines (physical or virtual), each with:
- 8+ CPUs, 32 GB RAM, 200 GB disk
- Linux OS (Ubuntu 22.04 or equivalent)
- Network connectivity between them
kubectlinstalled on your workstationhelmv3 installed- Basic familiarity with Kubernetes
Step 1: Bootstrap the Kubernetes cluster
CobaltCore uses Gardener for cluster lifecycle management in production, but for a minimal setup you can use any conformant Kubernetes distribution (k3s, kubeadm, kind with enough resources).
The control plane must be reachable from the hypervisor node.
See Platform - Bootstrap for details on how CobaltCore clusters are set up in production.
Step 2: Install the Hypervisor Operator
The Hypervisor Operator manages hypervisor node lifecycle. Install it into your cluster:
helm repo add cobaltcore https://cobaltcore-dev.github.io/charts
helm repo update
helm install hypervisor-operator cobaltcore/hypervisor-operator \
--namespace cobaltcore-system \
--create-namespaceSee Compute - Hypervisor for configuration options.
Step 3: Register the hypervisor node
Create a Hypervisor resource to register your compute node:
apiVersion: kvm.cloud.sap/v1
kind: Hypervisor
metadata:
name: hypervisor-01
spec:
lifecycleEnabled: true
highAvailability: false
version: latestApply it and verify the node is discovered:
kubectl apply -f hypervisor.yaml
kubectl get hypervisorsStep 4: Deploy storage (single-node Ceph)
For a minimal setup, deploy Ceph in single-replica mode via Rook:
helm repo add rook-release https://charts.rook.io/release
helm repo update
helm install rook-ceph rook-release/rook-ceph \
--namespace rook-ceph \
--create-namespaceThen deploy a minimal single-node CephCluster. See Storage - Rook for the full cluster configuration.
Step 5: Deploy OpenStack
OpenStack services are deployed via Helm. A minimal configuration enables Nova, Neutron, Cinder, Keystone, and Glance:
helm install openstack cobaltcore/openstack \
--namespace openstack \
--create-namespace \
--values minimal-values.yamlSee OpenStack for service-level configuration.
Step 6: Verify
Check that all components are running:
kubectl get pods -n cobaltcore-system
kubectl get pods -n rook-ceph
kubectl get pods -n openstack
kubectl get hypervisorsAccess the OpenStack API endpoint and create a test VM to confirm end-to-end functionality.
Next steps
- Full production deployment - add HA, stretched storage, and the management frontend
- Compute - Hypervisor - configure hypervisor agents and HA
- Storage - Ceph - tune storage pools and replication
- OpenStack - configure individual services