Skip to main content

Tenant Clusters

A tenant cluster is a Kubernetes cluster that Butler provisions and manages for running workloads. Each tenant cluster is represented by a TenantCluster Custom Resource.

What You Get

When you create a TenantCluster, Butler:

  1. Creates a hosted control plane (API server, controller-manager, scheduler) as pods in the management cluster via Steward.
  2. Provisions worker VMs on the configured infrastructure provider.
  3. Bootstraps workers to join the cluster (Talos apply-config, kubeadm join, or Ignition depending on OS type).
  4. Installs platform addons (CNI, load balancer, storage).
  5. Delivers a kubeconfig for cluster access.

The result is a fully isolated Kubernetes cluster with its own API server endpoint, its own workload nodes, and its own set of addons.

Lifecycle Phases

PhaseDescription
PendingTenantCluster CR created, awaiting reconciliation
ProvisioningControl plane and worker VMs being created
InstallingPlatform addons being installed on the tenant cluster
ReadyCluster fully operational, all addons healthy
UpdatingProcessing spec changes (scale, version, addons)
DeletingCleaning up workers, control plane, and associated resources
FailedError state; check conditions on the TenantCluster for details

How Spec Maps to Infrastructure

TenantCluster.spec
├── controlPlane → Steward TenantControlPlane (pods in management cluster)
├── workers.replicas → CAPI MachineDeployment → MachineRequests → VMs on provider
├── providerConfigRef → Credentials and config for the target infrastructure
├── addons → TenantAddon resources (Helm releases on tenant cluster)
└── networking → IPAllocation from NetworkPool (on-prem) or cloud networking

Multi-OS Workers

Butler supports five worker node operating systems:

OSBootstrap MethodNotes
TalosMachine config via talosctlDefault for new clusters. Immutable, API-managed.
Rockykubeadm join via cloud-initMax K8s version: v1.30.2
FlatcarIgnition JSONAuto-joins via bootstrap token
BottlerocketTOML settingsMinimal, container-optimized (E2E pending)
KairosCloud-config YAMLImmutable, community-driven (E2E pending)

Set the OS type in spec.workers.machineTemplate.os.type.

See Also