# What a volume here can and cannot do **`local-path` is the only StorageClass and it is the default.** *Everything below follows from that, and none of it is negotiable without adding replicated storage, which is not deployed.* --- ## A volume belongs to one machine, permanently **Every volume carries a hard affinity to the node backing it.** *So anything with a volume inherits the availability of one machine, and the only variable left is which one.* > **Anything that assumes it can be rescheduled freely is assuming something this > cluster does not provide.** **Choose the node deliberately rather than letting it land.** *A volume that lands somewhere by accident becomes a single point of failure nobody picked — which happened once, and the service could not come back when that node died.* ## A volume cannot be grown **`ALLOWVOLUMEEXPANSION` is false.** *Growing one means dump and restore, or manual migration — not an edit.* **Size with headroom.** *This is the constraint most likely to be discovered late.* ## Where this does not bite **Postgres run by the operator is shared-nothing** and replicates at the database level, so a cluster of two survives losing a node **even though neither volume can move.** *The node affinity is intended there rather than tolerated.* See [databases](databases.md). ## What would change this **Replicated storage** — Longhorn being the obvious candidate — **is deliberately not deployed.** *A substantial thing to operate on three nodes, and the downtime has not yet cost anything.* **Revisit when it does.** --- ## Checking this is still true **Verified 2026-09-03.** ```sh kubectl get sc # local-path, default, ALLOWVOLUMEEXPANSION false kubectl get pvc -A kubectl get pv -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeAffinity ```