World map

 

BM: Baca dalam Bahasa Melayu

World K4: Notes, Lockers & Packages

Storage for StatefulSets

You will learn: how a StatefulSet gives every pod its own locker, and keeps it.

Checked with Kubernetes 1.37 on 31 Oct 2026

The problem

You are here: cluster kind-dev namespace default
kubectl get pods shows ledger-0 and ledger-1, both Running. Terminal output: $ kubectl get pods -l app=ledger NAME READY STATUS RESTARTS AGE ledger-0 1/1 Running 0 28s ledger-1 1/1 Running 0 26s

Two ledger trays, ledger-0 and ledger-1. Each keeps its own order book. One shared locker would mix the books. How does each get its own?

Watch

Tap the line where the locker form starts.

0 of 1 found

A StatefulSet carries a locker form: volumeClaimTemplates: A StatefulSet's locker form: each pod gets its own claim, like data-ledger-0.. For each tray, it fills in one claim, named after that tray.

Try it

Open the ledger. Then list the claims it made.

You are here: cluster kind-dev namespace default
Stalls: 3. Trays: 0 (0 ready). Waiting for a stall: 0.
dev-control-planeOpenManager

No trays here.

dev-workerOpen

No trays here.

dev-worker2Open

No trays here.

Time: +0s (sped up)

Predict

You scale the ledger to 3 trays. What is the new tray’s claim called?

Pick one answer.

Check

You are here: cluster kind-dev namespace default
The ledger scales to 3. get pvc now lists data-ledger-0, data-ledger-1 and data-ledger-2, all Bound. Terminal output: $ kubectl scale statefulset ledger --replicas=3 statefulset.apps/ledger scaled $ kubectl rollout status statefulset/ledger --timeout=180s Waiting for 1 pods to be ready... partitioned roll out complete: 3 new pods have been updated... $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE data-ledger-0 Bound pvc-12275be8-489d-4e5b-9103-3244568e6d85 1Gi RWO standard <unset> 29s data-ledger-1 Bound pvc-b5053239-899f-40a2-a64f-ef861fce2de1 1Gi RWO standard <unset> 27s data-ledger-2 Bound pvc-3730202e-598b-41af-996a-21fec8857129 1Gi RWO standard <unset> 1s

data-ledger-2 appeared, Bound to a new PV. The trays come up in order: 0, then 1, then 2.

Predict

ledger-0 wrote page 1 in its book. Now you delete the whole StatefulSet. What happens to the claims?

Pick one answer.

Check

You are here: cluster kind-dev namespace default
The StatefulSet is deleted. get pvc still lists both claims. Applied again, ledger-0 reads page 1 from its old locker. Terminal output: $ kubectl delete statefulset ledger statefulset.apps "ledger" deleted from default namespace $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE data-ledger-0 Bound pvc-12275be8-489d-4e5b-9103-3244568e6d85 1Gi RWO standard <unset> 28s data-ledger-1 Bound pvc-b5053239-899f-40a2-a64f-ef861fce2de1 1Gi RWO standard <unset> 26s $ kubectl apply -f ledger.yaml statefulset.apps/ledger created $ kubectl rollout status statefulset/ledger --timeout=180s Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 2 new pods have been updated... $ kubectl exec ledger-0 -- cat /data/book.txt page 1

The claims waited. The new ledger-0 got its old locker back, and read page 1.

You did it!

You can now give every StatefulSet pod its own lasting locker.

Go deeper (optional)

Want claims cleaned up? Set persistentVolumeClaimRetentionPolicy. whenDeleted and whenScaled each take Retain (the default) or Delete. It is stable since Kubernetes 1.32. Deleting claims deletes data, so think twice.

Real rep (optional), on a practice kind cluster:

Real mission

  1. kubectl apply -f ledger.yaml
  2. kubectl get pvc
  3. kubectl delete statefulset ledger
  4. kubectl delete pvc data-ledger-0 data-ledger-1

0 of 5 steps done · Your ticks are saved.