etcd Backup and Restore
Recall from the foundations module that etcd is the cluster's single authoritative store of state, and that it depends on quorum (a majority of its members agreeing) to keep operating correctly and safely. Because of how central it is, etcd needs its own dedicated backup discipline distinct from anything covered in the storage module: take authenticated snapshots on a regular schedule (using etcd's own snapshot tooling, which understands its data format correctly), actually verify each snapshot's integrity after taking it, encrypt it, and copy it somewhere physically independent of the cluster it came from - a backup sitting on the same infrastructure it is meant to protect against losing is not a real backup. Restoring etcd is a genuine control-plane-level procedure, not a simple file copy: it typically requires setting up a new data directory in the exact configuration the specific etcd/Kubernetes version expects, and reconfiguring API servers consistently to use it - which is exactly the kind of exact, unforgiving procedure that should be rehearsed ahead of time in a safe environment, not attempted for the first time during a real outage. And a distinction worth remembering: restoring etcd only brings back Kubernetes' own object definitions (what should exist) - it does nothing at all to restore the actual contents of external persistent volumes, which have entirely their own separate backup and recovery story from the storage module.
Analogy: Kubernetes is a thermostat, not a remote control. You declare the temperature; independent controllers measure reality and keep acting. Debugging means finding which sensor, rule or actuator prevents convergence.
Read the object as evidence
kubectl get RESOURCE NAME -n NAMESPACE -o yaml
kubectl describe RESOURCE NAME -n NAMESPACE
kubectl get events -n NAMESPACE --sort-by=.metadata.creationTimestamp
kubectl explain RESOURCE.spec
Do not memorize these as a ritual. The first command exposes desired and observed state, the second connects conditions and events, the third supplies a timeline, and the fourth checks the server's schema. Compare what the controller was asked to do with what it reports doing. Then test the narrowest hypothesis.
Scenario: A team discovers, only during a real disaster, that their etcd snapshots had been dutifully written to a disk on the very same physical host that just failed and took the whole cluster down with it. The backups technically existed the whole time and every scheduled snapshot job had reported success - but they were never actually recoverable, because they shared the exact same single point of failure as the thing they were meant to protect against. A backup is only real once it is stored somewhere genuinely independent of the system it protects, and its restore procedure has actually been tested successfully at least once - anything less is optimism, not disaster recovery.
Make etcd recovery a rehearsed procedure
Take authenticated snapshots on a schedule, record member and Kubernetes versions, verify snapshot status, encrypt them and copy them outside the cluster. A restore normally creates a new logical cluster/member data directory and requires API servers to use it consistently. Stop writes, preserve the failed data and follow the version-specific runbook. Then validate API objects and reconcile workloads.
Scenario: etcd is restored to yesterday while cloud load balancers and persistent volumes still reflect today. Controllers may delete, recreate or conflict with external reality. Restore planning must address side effects after the snapshot point.
Warning: Restoring etcd does not restore volume contents, registry images or external secrets. Coordinate independent recovery timelines.
Production reasoning
Ask four questions: Who owns this object? What dependency must become ready next? Which controller reports the blocking condition? What evidence would disprove my current theory? This prevents symptom-driven changes. Record the context, namespace, object generation, image digest and recent rollout before mutation; a recreated Pod may erase the evidence you needed.
Warning: Running is not the same as ready, healthy, durable or correct. Kubernetes status is layered. Confirm the application-level outcome as well as the object state.
Goal: Put this model into practice in the Kubernetes lab pvc-storageclass-binding. Open/labs/kubernetes, choosepvc-storageclass-binding, predict the failure path before changing anything, then use the simulator'scheckcommand to validate the finished state.
Deliberate practice
Before the lab, write the expected object relationship and the first three commands you will run. Afterward, explain why the fix converged and name one tempting change that would only mask the symptom. Repeat using an explicit namespace and a structured output format. This prediction-observation-explanation loop is what turns command familiarity into production judgment.
45-minute investigation
- Map (5 min): draw the owner-to-child chain and mark every namespace, selector, identity and dependency involved.
- Predict (5 min): write one expected status condition, one likely event and one log or metric signal before opening the lab.
- Observe (10 min): collect YAML, describe output and ordered events. Do not mutate state. Record which observation disproves your first theory.
- Repair (15 min): make the smallest declarative correction, watch the responsible controller converge, and verify the user-facing path rather than stopping at
Running. - Stress (10 min): change one relevant constraint - replica count, label, readiness, resource value or placement rule - predict the outcome, observe it, then restore the known-good declaration.
Tip: Keep a short incident note with symptom, evidence, hypothesis, change, result. Across four sections this produces a reusable runbook instead of a pile of remembered commands.