Management cluster bootstrap controller for the Butler platform.
- Overview
- Architecture
- Supported Infrastructure
- How It Works
- Bootstrap Phases
- Development
- Contributing
- License
butler-bootstrap is an internal controller used by the Butler platform to orchestrate management cluster creation. It handles VM provisioning, Talos Linux configuration, Kubernetes bootstrapping, and platform addon installation.
You do not need to install or run butler-bootstrap directly. It is packaged within the butleradm CLI and runs automatically when you execute:
butleradm bootstrap <provider> --config bootstrap.yamlThe CLI handles everything: spinning up a temporary KIND cluster, deploying the bootstrap controller, monitoring progress, and cleaning up when complete.
flowchart TD
CLI[butleradm bootstrap]
CLI --> KIND[KIND Cluster]
subgraph KIND[KIND Cluster - Temporary]
BC[butler-bootstrap-controller]
PH[butler-provider-*]
end
BC -->|Creates| MR[MachineRequest CRs]
PH -->|Watches| MR
PH -->|Provisions| VMs[Virtual Machines]
BC -->|Configures| Talos[Talos Linux]
BC -->|Bootstraps| K8s[Kubernetes]
BC -->|Installs| Addons[Platform Addons]
subgraph MC[Management Cluster - Permanent]
CAPI[Cluster API]
Steward[Steward]
Cilium[Cilium]
Longhorn[Longhorn]
MetalLB[MetalLB]
Traefik[Traefik]
Butler[butler-controller]
end
Addons --> MC
KIND -.->|Deleted after pivot| X[X]
| Component | Responsibility |
|---|---|
| butleradm CLI | User interface, orchestrates the bootstrap process |
| butler-bootstrap | Controller that manages bootstrap phases and addon installation |
| butler-provider-* | Provider-specific controllers for VM provisioning |
Butler supports management cluster deployment across on-premises hyperconverged infrastructure and public cloud platforms.
| Provider | Status |
|---|---|
| Harvester HCI | Supported |
| Nutanix AHV | Planned |
| Proxmox VE | Planned |
| Provider | Status |
|---|---|
| AWS | Planned |
| Azure | Planned |
| Google Cloud | Planned |
Provider support is implemented through separate butler-provider-* controllers that handle infrastructure-specific VM provisioning. The bootstrap controller itself is provider-agnostic.
When you run butleradm bootstrap, the following happens automatically:
- The CLI creates a temporary KIND cluster on your local machine
- butler-bootstrap and the appropriate provider controller are deployed to KIND
- The bootstrap controller creates MachineRequest CRs for each node
- The provider controller provisions VMs on your target infrastructure
- Talos Linux is configured and applied to each VM
- The first control plane node is bootstrapped
- Platform addons are installed in dependency order
- The kubeconfig and talosconfig are saved locally
- The KIND cluster is deleted
The resulting management cluster is fully self-sufficient. You interact with it using standard Kubernetes tools (kubectl) and the butlerctl CLI for tenant cluster operations.
| Phase | Description |
|---|---|
| Pending | Validating configuration and provider connectivity |
| ProvisioningMachines | Creating VMs via MachineRequest CRs |
| ConfiguringTalos | Generating and applying Talos machine configs |
| BootstrappingCluster | Running talosctl bootstrap, retrieving kubeconfig |
| InstallingAddons | Installing platform components in dependency order |
| Pivoting | Finalizing cluster handoff |
| Ready | Bootstrap complete |
The controller installs addons in a specific order to satisfy dependencies:
- kube-vip (control plane VIP)
- Cilium (CNI with kube-proxy replacement)
- cert-manager (TLS certificates)
- Longhorn (distributed storage)
- MetalLB (LoadBalancer services)
- Traefik (ingress controller)
- Steward (hosted control planes)
- Cluster API (cluster lifecycle management)
- Flux (GitOps, optional)
- butler-controller (tenant cluster management)
This section is for contributors working on butler-bootstrap itself.
- Go 1.24+
- Docker
- kubectl
- make
make buildFor testing controller logic outside of the full bootstrap flow:
make runmake testmake docker-build IMG=ghcr.io/butlerdotdev/butler-bootstrap:devbutler-bootstrap/
├── cmd/
│ └── main.go # Controller entrypoint
├── internal/
│ ├── controller/
│ │ └── clusterbootstrap_controller.go
│ ├── addons/
│ │ └── installer.go # Addon installation logic
│ └── talos/
│ └── client.go # Talos CLI wrapper
├── config/
│ ├── default/ # Kustomize base
│ ├── manager/ # Controller deployment
│ └── rbac/ # RBAC configuration
├── Dockerfile
├── Makefile
└── README.md
Contributions are welcome. Please read the contributing guidelines before submitting a pull request.
make lintmake test
make lintCopyright 2026 The Butler Authors.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
