Skip to content

High Availability

High Availability (HA) gives a Kupe cluster a 3-replica control plane backed by a chart-managed external etcd StatefulSet with hard anti-affinity, encryption at rest, and a PodDisruptionBudget that protects quorum. With HA enabled the cluster API stays up through node drains, kured reboots, autoscaler scale-downs, and single-host failures.

HA is off by default and opt-in per cluster. Tenants can run a mix of HA and non-HA clusters under the same tenant pool.

HA is for clusters where the cluster API itself needs to stay up during platform maintenance. Typical cases:

  • Production clusters that GitOps controllers, deploy pipelines, or kubectl automation talk to continuously.
  • Multi-tenant internal platforms where many teams’ deploys would otherwise stack up during a 1–3 minute API blip.
  • Compliance contexts that require demonstrable redundancy of the control plane.

HA is not needed for:

  • Dev / preview clusters where a brief API blip is acceptable.
  • Workload availability, which remains the tenant’s responsibility via Deployments, replicas, and PodDisruptionBudgets on their own workloads. HA protects the control plane only.

HA adds a flat hourly rate per cluster, billed by the hour from the moment 3/3 replicas are ready, not from when the cluster is created.

PropertyValue
Rate£0.0205/hour (≈ £15/month at 730 hours)
Billed fromThe first time the operator confirms 3/3 replicas ready (status.haEnabledAt)
Billed untilCluster deletion (metadata.deletionTimestamp)
Pool impactHA replica pods do not count against your tenant pool; they are platform-managed

The HA charge replaces what would otherwise be billed at per-resource rates for the extra 2 control-plane replicas plus the deployed-etcd StatefulSet.

A two-day spin-up reads as ~£0.99 on the invoice rather than £15, because billing is by the hour rather than by the month. Clusters deleted before the next billing run are still billed for their unbilled HA hours: the operator stamps a pending charge before removing the cluster.

  1. Open Clusters → Create Cluster.
  2. Fill in name, version, resources.
  3. Under Reliability, check High Availability.
  4. Review the cost preview. The monthly total includes the HA charge.
  5. Click Create.

The cluster card and details page will show an HA chip and an On (3 of 3 replicas ready) row once the operator confirms HA. Billing starts at that point.

HA is set at creation and cannot be toggled later. The standard pattern is a blue-green cluster swap managed through your existing GitOps or deployment tooling:

  1. Create a new HA cluster with the same shape (version, resources) as your existing cluster:

    Terminal window
    kupe cluster create prod-eu1-ha \
    --version 1.35 \
    --cpu-limit 8 --memory-limit 32Gi --storage-limit 200Gi \
    --high-availability
  2. Deploy your workloads to the new cluster by pointing your Argo CD ApplicationSet / Flux GitRepository / kubectl apply workflow at the new cluster’s kubeconfig. Existing GitOps manifests should work unchanged.

  3. Verify the new cluster: run smoke tests, check metrics, and confirm integrations work.

  4. Swap traffic. Update DNS, ingress, or load-balancer config to point at the new cluster’s endpoint.

  5. Delete the old cluster once you’ve verified the swap:

    Terminal window
    kupe cluster delete prod-eu1

This is the same shape as control-plane upgrades on EKS, GKE, and AKS: you create a new cluster and migrate to it rather than reshaping an existing control plane.

haPhase valueMeaning
pendingHA requested, control plane and/or etcd not yet 3/3 ready
ha-healthy3/3 replicas ready, full redundancy
ha-degraded2/3 replicas ready, quorum intact, API serving; one replica failure away from outage
ha-unavailable≤1/3 replicas ready, quorum lost, API not serving

Terraform exposes these raw values on ha_phase. The console and CLI collapse the bottom two into a single Degraded label, distinguished by colour rather than wording, so a cluster showing “Degraded” in the UI may be either quorum-intact (ha-degraded) or quorum-lost (ha-unavailable). Check ha_phase directly when the difference matters.

For most tenants the cluster sits in ha-healthy indefinitely; ha-degraded typically clears within minutes as the operator reschedules the failed replica. ha-unavailable indicates a real incident; file a support ticket.

HA makes the control plane resilient to single-replica and single-host failures. It does not cover:

  • Cross-region outages. HA is single-region; all three replicas live in the same host cluster.
  • Workload availability. Your pods, services, and storage remain your responsibility. HA does not add replicas to your workloads or restart failed pods faster.
  • Platform-wide admission outages. If the platform’s admission webhooks themselves go down, control-plane replication does not help. Kupe hardens those separately.
  • Application-level data loss. etcd holds the cluster’s Kubernetes state, not your application data. Application backups remain your responsibility.

Can I enable HA on some clusters and not others?

Yes, HA is per-cluster. A typical pattern is HA on prod and single-replica on dev and staging.

Does HA increase my workload capacity?

No. The 3 HA replicas are the control plane (API server, controller manager, scheduler, etcd). Your workload pods run in their own namespaces against this control plane; HA doesn’t change the resources available to them.

Is etcd encrypted at rest?

Yes. Every cluster (HA or not) encrypts Secrets at rest in etcd with a per-cluster AES-CBC key stored in the platform’s vault. HA clusters inherit the same protection.

Can I see when HA started for billing reconciliation?

Yes. Console shows the haEnabledAt timestamp in the cluster details. CLI: kupe cluster get <name> includes it. Terraform: read the ha_enabled_at computed attribute. The same timestamp drives the invoice line.

What happens to the HA charge if I delete the cluster mid-month?

The operator stamps the unbilled HA hours into your tenant status before removing the cluster. The next billing run picks them up and adds them to the invoice. You won’t be over-charged or under-charged.