A great backup means nothing without a plan. This episode builds a Disaster Recovery Plan: defining RPO/RTO, off-site backup to a different region, writing a step-by-step restore runbook, and running a DR drill by deleting the cluster and restoring to a new one.

You've mastered eight episodes of technical practice: backup, restore, schedule, hooks, migration. Episode 12 lifts everything up a level: strategy. Because in reality, companies don't go bankrupt from losing data — they go bankrupt from not being able to recover within the time they promised.
Imagine a fire department with the best hoses and pumps, but no evacuation plan. When the fire comes, all the equipment is there but no one knows the sequence. A DR Plan is that "evacuation plan": agreed numbers, documented steps, and regular drills.
Two metrics you must agree on with stakeholders before building anything:
+----------------+-------------------------------------+
| RPO 24 hours | daily schedule, long enough TTL |
| RPO 1 hour | hourly schedule, TTL 48h |
| RPO ~0 | cloud snapshot + periodic logical |
| | dump |
| RTO 4 hours | automated runbook, Velero image |
| | ready |
| RTO < 1 hour | DR standby cluster + deploy |
| | pipeline |
+----------------+-------------------------------------+velero schedule create hourly \
--schedule="0 * * * *" \
--include-namespaces prod \
--ttl 72h \
--default-volumes-to-fs-backupRPO 1 hour = hourly schedule. RTO 4 hours demands a fast restore process: Velero installed in the DR region, credentials ready, and a proven runbook.
The classic backup principle applies to clusters too: 3 copies, 2 different media, 1 in another location. For Kubernetes, the translation:
velero backup-location create dr-region \
--provider aws \
--bucket velero-backups-dr \
--config region=ap-southeast-1Or for cross-cloud — a GCS BSL read during DR on GCP:
velero backup-location create gcs-dr \
--provider gcp \
--bucket velero-dr-backupsNote
A secondary BSL doesn't automatically receive backups. To meet cross-region RPO, schedule additional backups to that BSL (--storage-location dr-region), or schedule bucket replication (e.g. S3 Replication) at the storage level. Choose what fits the cost you can afford.
A runbook is an instruction that anyone can execute — including someone new on the night shift. Compose at least the following steps:
1. Detect the incident and escalate to on-call.
2. Prepare the DR cluster: new cluster in the DR region, correct kubectl context.
3. Install Velero 1.18 with the same plugins:
velero install --provider aws --plugins velero/velero-plugin-for-aws:v1.14.0 \
--bucket velero-backups-dr --secret-file ./credentials-velero \
--backup-location-config region=ap-southeast-1
4. Verify BSL Available and backups visible:
velero backup-location get && velero backup get
5. Restore with the appropriate mapping:
velero restore create dr-restore --from-backup <latest> \
--storage-class-mappings gp2:gp3
6. Verify: velero restore logs, kubectl get pods, check volume data.
7. Switch traffic to the DR cluster, update DNS/Ingress.
8. Record start-finish times for the RTO report.Keep this runbook in a repository (e.g. your GitOps repo) and make it a commit-able checklist — not in someone's head.
A backup that's never been restored on a new cluster is just a guess. A DR drill turns assumptions into facts: are the credentials still valid? Are the plugin images available? How long does restore actually take? These are only answered by practice.
kubectl config use-context dr-cluster
velero install --provider aws --plugins velero/velero-plugin-for-aws:v1.14.0 \
--bucket velero-backups-dr --secret-file ./credentials-velero \
--backup-location-config region=ap-southeast-1
velero restore create drill-restore --from-backup <latest>Also test the worst-case scenario: delete the source cluster, then restore to a new cluster from zero. This is the only way to prove your backups are truly independent of their origin cluster.
Warning
A good DR drill records the actual duration (from an empty cluster to traffic back). If the drill takes 6 hours when the agreed RTO is 4 hours, then your configuration is wrong — not the drill. Use the drill numbers to fix the plan, not to justify the numbers.
A backup that silently fails is the most dangerous leak. Schedule automatic checks:
velero backup get | grep -v Completed
kubectl logs -n velero deploy/velero --tail=50We cover full monitoring in episode 20. For episode 12, just build the habit: a backup that isn't monitored is the same as no backup.
Key takeaways:
In episode 13 next, we enter the security phase: Credential Security & RBAC — storing cloud credentials properly (never commit them!), using IRSA on EKS and Workload Identity on GKE, and restricting user access to the velero namespace.