What has to come back
| Item | Source of truth for DR |
|---|---|
| Cluster itself | IaC (Bicep/Terraform) |
| Kubernetes manifests, Helm releases | Git (GitOps with Flux or Argo CD) |
| Container images | ACR with geo-replication to the DR region |
| Secrets | Key Vault (via CSI driver), replicated or recreated in DR |
| Persistent volumes | AKS Backup or app-level replication |
| External data (SQL, Storage) | Their own DR (failover groups, GZRS) |
1. GitOps first
If a cluster can be rebuilt from Git in 20 minutes, most "DR" is just running the pipeline. Check nothing is applied by hand:
kubectl get deploy -A -o json | jq -r '.items[] | select(.metadata.labels["kustomize.toolkit.fluxcd.io/name"] == null) | "\(.metadata.namespace)/\(.metadata.name)"'
(The label depends on your GitOps tool; the idea is to find resources not managed by it.)
2. ACR geo-replication
az acr replication create -r acrprodcin -l southindia
Requires the Premium SKU. Images pushed once are available in both regions.
3. AKS Backup for stateful workloads
AKS Backup (an Azure Backup feature with a cluster extension) protects namespaces and persistent volumes (Azure Disk CSI snapshots) and can restore to the same or another cluster.
- Install the backup extension and trusted access between the vault and the cluster.
- Backup policy: for example every 4 hours, retained 7 days, with vault-tier copies for longer retention and cross-region restore where supported.
- Restore test: restore a namespace into a test namespace or cluster quarterly.
Velero with blob storage is the open-source alternative and works the same way conceptually.
4. Choose a DR pattern
| Pattern | RTO | Cost |
|---|---|---|
| Cold: rebuild cluster in DR region from IaC + GitOps + restore volumes | Hours | Lowest |
| Warm: small DR cluster always running, synced by GitOps, scale up on failover | 30–60 min | Medium |
| Active-active: two clusters serving traffic behind Front Door | Minutes | Highest; needs multi-region data design |
5. Failover runbook (warm standby)
- Confirm data services failed over (SQL failover group, storage).
- Scale DR node pools:
az aks nodepool scale -g rg-aks-sin --cluster-name aks-dr-sin -n apps --node-count 6. - Point GitOps DR overlay to production replicas/config.
- Restore persistent volumes if needed.
- Switch Front Door origin priority (or DNS) to the DR ingress.
- Smoke test and announce.
Tip
The hardest part of AKS DR is usually stateful data inside the cluster. Moving databases and queues to managed services with their own geo-replication makes cluster DR much simpler.