ClusterBootstrap
A ClusterBootstrap drives the end-to-end provisioning of a Butler management cluster from bare metal or cloud VMs through to a fully operational platform.
API Version
butler.butlerlabs.dev/v1alpha1
Scope
Namespaced
Short Name
cb
Description
ClusterBootstrap is the central resource for management cluster provisioning. It coordinates VM creation, Talos Linux configuration, Kubernetes bootstrap, and addon installation across both on-prem and cloud providers.
The bootstrap controller runs inside a temporary KIND cluster on the operator's workstation. It watches ClusterBootstrap resources and reconciles through a strict phase sequence:
- Create MachineRequest resources for each node
- Wait for provider controllers to provision VMs and report IPs
- Generate and apply Talos machine configurations
- Bootstrap the first control plane node
- Install platform addons in dependency order
- (HA only) Pivot the management plane onto the new cluster
On-prem providers (Harvester, Nutanix, Proxmox) use kube-vip for control plane HA with a floating VIP. Cloud providers (GCP, AWS, Azure) create a LoadBalancerRequest to provision a cloud-native L4 load balancer as the control plane endpoint.
Specification
Full Example (HA On-Prem)
apiVersion: butler.butlerlabs.dev/v1alpha1
kind: ClusterBootstrap
metadata:
name: butler-mgmt
namespace: butler-system
spec:
provider: harvester
providerRef:
name: harvester-prod
namespace: butler-system
cluster:
name: butler-mgmt
topology: ha
controlPlane:
replicas: 3
cpu: 4
memoryMB: 16384
diskGB: 100
workers:
replicas: 3
cpu: 8
memoryMB: 32768
diskGB: 200
extraDisks:
- sizeGB: 500
storageClass: longhorn
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
vip: "10.40.0.200"
vipInterface: eth0
loadBalancerPool:
start: "10.40.0.210"
end: "10.40.0.250"
talos:
version: v1.9.2
schematic: ce4c980550dd2ab1b17bbf2b08801c7eb59418eafe8f279833297925d67c7515
installDisk: /dev/vda
addons:
cni:
type: cilium
hubbleEnabled: true
storage:
type: longhorn
replicaCount: 3
loadBalancer:
type: metallb
controlPlaneHA:
type: kube-vip
certManager:
enabled: true
ingress:
type: traefik
enabled: true
controlPlaneProvider:
type: steward
enabled: true
capi:
enabled: true
version: v1.9.4
butlerController:
enabled: true
gitOps:
type: flux
enabled: true
controlPlaneExposure:
mode: LoadBalancer
Spec Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
provider | string | Yes | -- | Infrastructure provider. One of: harvester, nutanix, proxmox, gcp, aws, azure. |
providerRef | ProviderReference | Yes | -- | References the ProviderConfig with infrastructure credentials. |
cluster | ClusterBootstrapClusterSpec | Yes | -- | Cluster topology and node sizing. |
network | ClusterBootstrapNetworkSpec | Yes | -- | Pod CIDR, service CIDR, VIP, load balancer pool. |
talos | ClusterBootstrapTalosSpec | Yes | -- | Talos Linux version, schematic, install disk, config patches. |
addons | ClusterBootstrapAddonsSpec | No | See below | Platform addons to install. |
controlPlaneExposure | ControlPlaneExposureSpec | No | LoadBalancer | How tenant control planes are exposed after bootstrap. Written to ButlerConfig. |
paused | bool | No | false | Pauses reconciliation when true. |
ClusterBootstrapClusterSpec
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | Yes | -- | Cluster name. DNS-safe, 1-63 chars, pattern ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$. |
topology | string | No | ha | ha for high-availability (3+ CP nodes + workers) or single-node (1 CP, no workers). |
controlPlane | ClusterBootstrapNodePool | Yes | -- | Control plane node pool. |
workers | ClusterBootstrapNodePool | No | -- | Worker node pool. Ignored when topology is single-node. |
ClusterBootstrapNodePool
| Field | Type | Required | Validation | Description |
|---|---|---|---|---|
replicas | int32 | Yes | 1-10 | Number of nodes. Forced to 1 for single-node topology. |
cpu | int32 | Yes | 1-128 | CPU cores per node. |
memoryMB | int32 | Yes | min 2048 | Memory in megabytes per node. |
diskGB | int32 | Yes | min 20 | Root disk size in gigabytes per node. |
extraDisks | []DiskSpec | No | -- | Additional disks. Each has sizeGB (min 1) and optional storageClass. |
labels | map[string]string | No | -- | Labels applied to nodes in this pool. |
ClusterBootstrapNetworkSpec
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
podCIDR | string | Yes | -- | CIDR for pod networking. Pattern: ^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$. |
serviceCIDR | string | Yes | -- | CIDR for service networking. Same pattern. |
vip | string | No | -- | Control plane endpoint. For on-prem: a floating IP managed by kube-vip. For cloud: optional, set automatically from LoadBalancerRequest endpoint. Accepts IP addresses and DNS hostnames. |
vipInterface | string | No | -- | Network interface for the VIP. Only relevant for on-prem with kube-vip. Auto-detected by kube-vip if not specified. |
loadBalancerPool | LoadBalancerPoolSpec | No | -- | IP range for MetalLB. Must not overlap with VIP. |
LoadBalancerPoolSpec:
| Field | Type | Required | Description |
|---|---|---|---|
start | string | Yes | First IP in the pool (inclusive). |
end | string | Yes | Last IP in the pool (inclusive). |
Validation: start must be less than or equal to end. If vip is an IP address (not a hostname), it must not fall within the pool range.
ClusterBootstrapTalosSpec
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
version | string | Yes | -- | Talos version. Pattern: ^v[0-9]+\.[0-9]+\.[0-9]+$. |
schematic | string | Yes | -- | Talos factory schematic ID for the boot image. |
installDisk | string | No | /dev/vda | Disk device for Talos installation. |
configPatches | []TalosConfigPatch | No | -- | Inline Talos config patches (RFC 6902 JSON Patch format). |
TalosConfigPatch:
| Field | Type | Required | Description |
|---|---|---|---|
op | string | Yes | Patch operation: add, remove, or replace. |
path | string | Yes | JSON path to patch. |
value | string | No | Value to set (required for add and replace). |
ClusterBootstrapAddonsSpec
All addon sub-specs are optional. Defaults are applied when the field is omitted.
| Field | Type | Default | Description |
|---|---|---|---|
cni | CNIAddonSpec | type: cilium | Container networking. |
storage | StorageAddonSpec | type: longhorn, replicaCount: 3 | Persistent storage. |
loadBalancer | LoadBalancerAddonSpec | type: metallb | LoadBalancer service implementation. |
controlPlaneHA | ControlPlaneHAAddonSpec | type: kube-vip | Control plane HA (on-prem only). |
certManager | CertManagerAddonSpec | enabled: true | TLS certificate automation. |
ingress | IngressAddonSpec | type: traefik, enabled: true | Ingress controller. |
controlPlaneProvider | ControlPlaneProviderAddonSpec | type: steward, enabled: true | Hosted control plane operator. |
capi | CAPIAddonSpec | enabled: true, version: v1.9.4 | Cluster API core + infrastructure providers. |
butlerController | ButlerControllerAddonSpec | enabled: true, version: latest | Butler platform controller. |
gitOps | GitOpsAddonSpec | type: flux, enabled: true | GitOps controller. |
console | ConsoleAddonSpec | enabled: false | Butler web console. |
The CNI, Storage, CAPI, and Console sub-specs are detailed below. The remaining sub-specs (LoadBalancer, ControlPlaneHA, CertManager, Ingress, ControlPlaneProvider, GitOps, ButlerController) follow the same pattern: enabled (bool), type or provider (string), and version (string).
CNIAddonSpec
| Field | Type | Default | Description |
|---|---|---|---|
type | string | cilium | CNI type. Enum: cilium, none. |
version | string | -- | Override chart version. |
hubbleEnabled | bool | true | Enable Hubble observability (Cilium only). |
StorageAddonSpec
| Field | Type | Default | Description |
|---|---|---|---|
type | string | longhorn | Storage type. Enum: longhorn, none. |
version | string | -- | Override chart version. |
replicaCount | *int32 | 3 | Default volume replica count. Forced to 1 for single-node topology. |