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