ReadWriteOnce
One node can mount the volume for read and write. This is the common fit for single-instance stateful apps.
Understand RWO, ROX, RWX, RWOP, and how manual StorageClasses behave in bare-metal and non-cloud Kubernetes clusters.
One node can mount the volume for read and write. This is the common fit for single-instance stateful apps.
Use these when many nodes need shared access. RWX needs a backend that truly supports concurrent writers.
This is a stricter isolation model where a single Pod gets write access, typically with supported CSI drivers.
In non-cloud clusters, kubernetes.io/no-provisioner is common for NFS and local-storage teaching labs.
Start with the workload's concurrency need, not with a random backend.
Use manual classes when the cluster will not dynamically create the backend volume for you.
Pre-create a volume whose access mode and backend match the intended claim.
The claim requests storage size, access mode, and class name so Kubernetes can bind correctly.
Binding mode and node affinity matter most for local storage because the volume only exists on specific nodes.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-manual
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
| Mode | Who Can Mount | Typical Fit |
|---|---|---|
| ReadWriteOnce | One node with read-write access | Single-instance databases and node-local persistence |
| ReadOnlyMany | Many nodes, read-only | Shared static content |
| ReadWriteMany | Many nodes, read-write | Shared files, logs, and collaboration workloads |
| ReadWriteOncePod | Exactly one Pod with write access | Strict single-pod isolation |
Use manual NFS and local-storage classes where no cloud provisioner exists.
Use WaitForFirstConsumer so binding happens after Pod placement is known.
Do not ask for RWX unless the storage backend really supports multi-node shared writing.