Kubernetes PersistentVolumeClaim (PVC) is a namespaced Kubernetes API object that requests durable storage for a pod. In practical terms, a PVC lets an application ask for storage with specific requirements, such as size, access mode, and storage class, without the pod needing to know the exact disk, file system, or cloud volume behind it.
A PVC acts as the storage request between your workload and the underlying storage system. A pod does not usually mount a PersistentVolume directly. Instead, it references a PVC, and Kubernetes binds that claim to a matching PersistentVolume, often called a PV.
This separation helps platform teams expose storage options in a controlled way while application teams consume storage through a simple Kubernetes object.
20Gi, ReadWriteOnce, and a specific storageClassName.Bound when Kubernetes connects it to a suitable PV.Most modern clusters use dynamic provisioning through a CSI driver. For example, in an Amazon EKS cluster, a PVC using an EBS-backed StorageClass can trigger creation of an AWS EBS volume. If you are managing Kubernetes manifests through infrastructure workflows, the same PVC object can be created with GitOps tools, Helm, kubectl, or Terraform, as shown in guides for deploying Kubernetes resources using Terraform.
gp3 for AWS EBS, standard, or a custom class created by your platform team.10Gi or 500Gi.ReadWriteOnce, ReadOnlyMany, ReadWriteMany, or ReadWriteOncePod.Access modes describe what Kubernetes and the storage backend allow. They do not replace application-level locking, database consistency controls, or file coordination.
This example requests a 20 GiB volume from a StorageClass named gp3:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
namespace: production
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp3
resources:
requests:
storage: 20Gi
A pod can then mount the claim:
apiVersion: v1
kind: Pod
metadata:
name: app
namespace: production
spec:
containers:
- name: app
image: example/app:1.0.0
volumeMounts:
- name: data
mountPath: /var/lib/app
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data
postgres-0, postgres-1, and postgres-2.A useful way to read the relationship is: the pod uses the PVC, the PVC binds to a PV, and the StorageClass controls how the PV gets created when dynamic provisioning is enabled.
WaitForFirstConsumer, which delays volume provisioning until a pod is scheduled. This helps Kubernetes pick a storage zone that matches the node.Delete or Retain, controls what happens to the underlying storage after the PVC is deleted.Delete reclaim policy, removing the PVC may remove the underlying cloud volume too.Suppose you run PostgreSQL on Kubernetes for a staging environment. You create a StatefulSet with a volume claim template that requests a 100 GiB PVC for each replica. Kubernetes creates a separate PVC for each pod, such as postgres-data-postgres-0 and postgres-data-postgres-1. If postgres-0 restarts or moves to another node in the same zone, Kubernetes reattaches the same volume so the database keeps its data.
For production, you would still plan backups, restore tests, monitoring, disk expansion, disruption budgets, and upgrade procedures. PVCs provide durable storage plumbing, but the database architecture remains your responsibility. This becomes especially important during cluster maintenance, where storage drivers, node drains, and workload disruption need careful handling. Practical planning for Kubernetes upgrades should include stateful workloads and their PVCs.
Platform teams often define approved StorageClasses, backup policies, and default reclaim behavior. Application teams then request storage by creating PVCs in their namespaces. In cloud-native setups, the storage backend may be managed through Kubernetes controllers, Terraform, or control plane tools such as Crossplane. For example, teams that manage cloud resources through Kubernetes can use patterns similar to deploying AWS resources using Crossplane on Kubernetes.
A Kubernetes PersistentVolumeClaim is the standard way for a pod to request persistent storage. It hides backend storage details behind a Kubernetes object while still giving engineers control over size, access mode, and storage class. PVCs are essential for stateful workloads, but they need clear operational rules around backups, deletion, resizing, scheduling, and upgrades.