{
  "id": 11168711,
  "title": "Two Kubernetes clusters for disaster recovery shouldn't cost twice as much",
  "url": "https://urgent.news/2026/10/01/two-kubernetes-clusters-for-disaster-recovery-shouldnt-cost-twice-as",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-01T10:38:49.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/noushad_hasan_4be85cd12d6/two-kubernetes-clusters-for-disaster-recovery-shouldnt-cost-twice-as-much-2ag6"
  },
  "original_language": "en",
  "account": null,
  "summary": "The article discusses the challenges of running two Kubernetes clusters for disaster recovery, which can be costly due to the need to pay for full workloads on both clusters around the clock. The author built an active/passive multi-cluster setup using Karmada, a lightweight K3s host that manages both member clusters. Deployments, Services, Ingresses, ConfigMaps, and Secrets are propagated using a single PropagationPolicy. The primary cluster remains on standby until it becomes unavailable, at which point the secondary cluster automatically takes over without manual intervention. However, once the primary cluster recovers, the workloads remain on the secondary cluster, consuming resources unnecessarily. The author addressed this issue by implementing a small CronJob-based fail-back mechanism that waits for the primary cluster to remain healthy for 15 minutes, clears the schedulers affinity pin, triggers a reschedule, and moves the workloads back to the primary cluster. This allows the secondary cluster to return to its standby role automatically. The author also replaced self-hosted HAProxy setup for traffic management with Cloudflare Load Balancer, which simplifies the configuration and removes the need for an additional HAProxy layer. The author concludes that an active/passive architecture with automated failover and fail-back can provide disaster recovery while avoiding the cost of continuously running full production capacity on both clusters.",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}