Skip to content

Cluster Bootstrap Guide ​

End-to-end bootstrap for RPCU infrastructure — two distinct paths depending on the cluster.

TIP

There are two bootstrap paths:

ClusterPathInfraOrchestrator
OpenStackBaremetal BootstrapHetzner dedicated serverskubeadm (manual)
ManagementCAPI BootstrapOpenStack VMs via CAPOkind → pivot → self-managing

Start here: If the baremetal OpenStack cluster is not running yet, begin with the OpenStack Cluster Bootstrap. The management cluster depends on it.


Bootstrap Paths ​

OpenStack Cluster (baremetal) ​

The production OpenStack control plane running on three dedicated servers.

Build ISO → Install NixOS → kubeadm init → Cilium → Flux → Yaook/OpenStack

Full guide →

  • Nodes: lucy, makise, quinn (baremetal)
  • VIP: 10.0.0.5 via kube-vip
  • CNI: Cilium (L2 LoadBalancer, socketLB.hostNamespaceOnly: true)
  • No CAPI involvement

Management Cluster (CAPI) ​

The CAPI management cluster that provisions new OpenStack-backed clusters.

kind cluster → CAPO provisions VMs → clusterctl move → Flux self-managing

Full guide →

  • Runs on OpenStack VMs provisioned by CAPO
  • Self-managing after pivot (reconciles CAPI providers from Git)
  • LoadBalancer via OCCM/Octavia (not Cilium)

Manual Secrets ​

capo-variables (root secret) ​

The single manually-managed secret. All other secrets derive from it via External Secrets Operator.

Namespace: capo-system (on mgmt cluster) Type: Opaque with key clouds.yamlCreated by: Manual kubectl apply (NOT in Git, NOT managed by Flux)

yaml
apiVersion: v1
kind: Secret
metadata:
  name: capo-variables
  namespace: capo-system
type: Opaque
stringData:
  clouds.yaml: |
    clouds:
      openstack:
        auth:
          auth_url: https://keystone.rpcu.vpn/v3   # MUST be gateway endpoint
          username: "<OS_USERNAME>"
          password: "<OS_PASSWORD>"
          project_name: "<OS_PROJECT_NAME>"
          project_domain_name: "<OS_PROJECT_DOMAIN_NAME>"
          user_domain_name: "<OS_USER_DOMAIN_NAME>"
        region_name: hetzner
        verify: false
        interface: public
        identity_api_version: 3

WARNING

auth_url MUST point at the gateway endpoint (https://keystone.rpcu.vpn/v3), not the in-cluster Keystone service (https://keystone.yaook.svc:5000/v3).

Consumers:

  1. CAPO InfrastructureProvider (infrastructure-openstack.yaml)
  2. capo-identity ExternalSecret → mgmt/mgmt-cloud-config (Cluster identityRef)
  3. openstack-ccm-identity ExternalSecret → kube-system/cloud-config (OCCM + Cinder CSI)
  4. external-dns ExternalSecret → external-dns/openstack-credentials (Designate webhook)

Three Flux Kustomizations use wait: false because they depend on this manually-placed secret: capo-identity, openstack-ccm-identity, external-dns.

ESO-Synced Secrets ​

SecretNamespaceSourceConsumer
mgmt-cloud-configmgmtcapo-variables.clouds.yamlCluster identityRef (CAPO)
cloud-configkube-systemcapo-variables.clouds.yaml + generated cloud.confOCCM + Cinder CSI
openstack-credentialsexternal-dnscapo-variables.clouds.yamlExternalDNS Designate webhook

Hardcoded OpenStack IDs ​

Resource IDs generated at cluster creation time — cannot be changed after the fact.

External/Floating Network ID ​

UUID: 1cfd69da-057c-4748-a0d4-de5b0ca77db2

FilePurpose
clusters/mgmt/clusters/mgmt.yamlCluster variable externalNetworkId
infrastructure/openstack-ccm-identity/externalsecret.yamlfloating-network-id in CCM cloud.conf
clusters/mgmt/apps/chihiro/cm.yamlChihiro cluster template variable

Find it: openstack network list --external on the OpenStack cluster.

Ceph RBD Secret UUID ​

UUID: b3ab713d-912b-49ed-adaf-bd74368e567a

FilePurpose
infrastructure/yaook/nova.yamlNova uuid for Ceph RBD backend
infrastructure/yaook/cinder.yamlCinder rbd_secret_uuid for Ceph RBD backend

Default Security Group ID ​

UUID: 2deeb13d-88e2-4f3a-adc8-173b9af365e7

FilePurpose
infrastructure/crossplane-resources/openstack/securityGroups.yamlCrossplane external-name annotation

Admin Project ID ​

UUID: bae33843e66e4028b574e36cd0953fac

FilePurpose
infrastructure/crossplane-resources/openstack/project-admin.yamlCrossplane external-name annotation

Environment-Specific Values ​

ValueCurrent SettingWhere to Set
External Network UUID1cfd69da-057c-4748-a0d4-de5b0ca77db2See External/Floating Network ID
API Server Floating IP172.16.255.212clusters/mgmt/clusters/mgmt.yaml, clusters/mgmt/cilium.yaml
Kubernetes Versionv1.35.4clusters/mgmt/clusters/mgmt.yaml
Image Namehephaestus-kaas-25.11-v1.35.4clusters/mgmt/clusters/mgmt.yaml
Flavorsxmedium (CP + workers)clusters/mgmt/clusters/mgmt.yaml
Managed Subnet CIDR192.168.1.0/24clusters/mgmt/clusters/mgmt.yaml
Regionhetznercapo-variables clouds.yaml
Keystone auth_urlhttps://keystone.rpcu.vpn/v3capo-variables clouds.yaml
Designate Zonerpcu.lan.infrastructure/crossplane-resources/openstack/zonedns.yaml

Open source infrastructure documentation