Interactive: the kopiur playground¶
Every backed-up PVC in this cluster lives inside one small state machine —
backup on a cron, and on any recreate: restore if a snapshot exists, bind
empty if the repo is reachable but has nothing, hold Pending forever if the
backend is down. Reading about it is one thing; here you can pull the levers
yourself.
This is a simulation of the exact state machine documented in kopiur backup architecture — not a real cluster. (Idea sparked by ngrok's Webernetes, a TypeScript Kubernetes that runs in your browser — brilliant for interactive pods-and-Deployments content, but it has no volumes, and volumes are the whole story here.)
Five experiments worth running¶
- Day zero.
Sync app from Giton an empty repo → the PVC binds empty and backs up forward (onMissingSnapshot: Continue). ThenRun backup nowand note the file count. - The money shot. With a snapshot in the repo,
Delete the PVC→ watch it come backPending→ bound with data. No human steps. - The safety property.
Take S3 offline, thenDelete the PVC→ it holdsPendingand retries, refusing to bind empty. Bring S3 back and watch it finish. This is the guarantee everything else is built on. - The DR gap. Untick
dataSourceRefin the Git panel, thenDelete the PVC→ it recreates EMPTY even though your snapshots still exist. This is the #1 rule: nodataSourceRef, no restore. - The full story.
Nuke the cluster→ Git and the repo survive, the waves walk, and the app comes back with its data — the 30-second pitch of the easy guide, animated.
Bonus: back up an empty volume and then restore it — the playground lets you experience why "the fresh instance's own backup can bury your real one" (and why the pre-nuke checklist insists on verifying snapshots first).
What the simulation is faithful to¶
- The Kubernetes volume-populator contract:
dataSourceRefpresent → binding withheld until the populator finishes. - kopiur's
onMissingSnapshot: Continue(deploy-or-restore) and its backend-error-before-decision ordering (never bind empty over a dead repo). - Backup mechanics: CSI snapshot first, then a mover Job that fails-and-retries against an unreachable repo without writing garbage.
- ArgoCD's role: recreating from Git, and app health gating the sync waves.
What it skips: real timings, Longhorn attach/detach states, mover permission failures (see mover permissions for that story), and multi-PVC apps.