Home DevOps Kubernetes Volumes and Storage — PV, PVC, StorageClass
Intermediate 4 min · July 12, 2026

Kubernetes Volumes and Storage — PV, PVC, StorageClass

Learn Kubernetes Volumes and Storage — PV, PVC, StorageClass with plain-English explanations and real examples..

N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Written from production experience, not tutorials.

Follow
Verified
production tested
July 12, 2026
last updated
2,073
articles · all by Naren
Before you start⏱ 25 min
  • Kubernetes cluster (v1.23+), kubectl installed and configured, basic understanding of YAML and Kubernetes objects (Pods, Deployments), cloud provider account (AWS, GCP, or Azure) if testing cloud storage, Helm (for CSI driver installation), jq (optional for JSON parsing)
✦ Definition~90s read
What is Kubernetes Volumes and Storage?

Kubernetes storage is a decoupled, declarative system for managing persistent data in containerized environments. It separates storage provisioning (via PersistentVolumes) from consumption (via PersistentVolumeClaims) and automates dynamic provisioning with StorageClasses.

Think of Kubernetes Volumes and Storage — PV, PVC, StorageClass like a tool in your DevOps toolkit — once you understand what it does and when to reach for it, managing Kubernetes clusters becomes second nature.

This abstraction allows applications to request storage without knowing the underlying infrastructure, enabling portability across on-prem and cloud providers. Use it when your pods need data that survives restarts, rescheduling, or scaling.

Plain-English First

Think of Kubernetes Volumes and Storage — PV, PVC, StorageClass like a tool in your DevOps toolkit — once you understand what it does and when to reach for it, managing Kubernetes clusters becomes second nature.

Welcome to Kubernetes Volumes and Storage — PV, PVC, StorageClass. We'll break this down from first principles.

Why Kubernetes Storage Is Different

In traditional VM deployments, storage is typically attached to a specific host and survives reboots. Containers, by design, are ephemeral — their filesystem disappears when the pod dies. This creates a fundamental tension: stateful applications (databases, message queues, file servers) need persistent data, but Kubernetes treats pods as cattle. The solution is a storage abstraction layer that decouples the lifecycle of data from the lifecycle of pods. Kubernetes volumes are not just directories; they are API objects with defined lifecycles, access modes, and reclaim policies. Understanding this paradigm shift is critical before diving into PVs and PVCs. Without it, you'll end up with data loss, orphaned volumes, or cloud bills from unattached disks.

empty-dir-example.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: writer
    image: busybox
    command: ["sh", "-c", "echo 'data' > /data/file && sleep 3600"]
    volumeMounts:
    - name: scratch
      mountPath: /data
  volumes:
  - name: scratch
    emptyDir: {}
Output
Pod runs, writes data to /data/file. When pod is deleted, data is lost.
🔥Ephemeral by Default
emptyDir volumes are tied to pod lifecycle. They're great for scratch space but never for production data.
📊 Production Insight
We once had a team lose 3 days of metrics because they used emptyDir for Prometheus TSDB. Always validate storage class behavior in staging first.
🎯 Key Takeaway
Kubernetes storage is designed for ephemeral compute — you must explicitly opt into persistence.

PersistentVolume: The Cluster Storage Resource

A PersistentVolume (PV) is a piece of storage in the cluster that has been provisioned by an administrator or dynamically provisioned via StorageClass. It is a cluster resource, just like a node, and exists independently of any pod. PVs have a lifecycle: Available, Bound, Released, and Failed. They define capacity, access modes (ReadWriteOnce, ReadOnlyMany, ReadWriteMany), reclaim policy (Retain, Delete, Recycle), and storage class. In production, you rarely create PVs manually — you define a StorageClass and let the cluster provision them on demand. However, understanding PVs is essential for debugging binding issues, capacity planning, and disaster recovery. A PV can be backed by NFS, iSCSI, cloud disks (EBS, GCE PD), or local SSD.

pv-manual.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-manual
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: /mnt/data
Output
PV created with 10Gi capacity, manual reclaim, bound to node's /mnt/data.
⚠ hostPath Is Not Production
hostPath ties a PV to a specific node and filesystem. Use it only for single-node testing. In multi-node clusters, pods may get scheduled on different nodes and lose access.
📊 Production Insight
We once set reclaimPolicy: Delete on a PV backing a production database. When the PVC was deleted (accidentally), the entire disk was wiped. Always use Retain for critical data.
🎯 Key Takeaway
PVs are cluster-wide storage resources with defined capacity, access modes, and lifecycle policies.
kubernetes-volumes-storage THECODEFORGE.IO Dynamic Volume Provisioning Flow From PVC creation to bound PersistentVolume via StorageClass User creates PVC Specifies storage size and access mode StorageClass matches request Uses provisioner and parameters Dynamic provisioning triggered CSI driver or cloud API invoked PersistentVolume created Backed by actual storage asset PVC bound to PV Claim status becomes Bound Pod mounts the volume Uses PVC in pod spec ⚠ PVC may remain Pending if no matching StorageClass Ensure StorageClass exists and access modes align THECODEFORGE.IO
thecodeforge.io
Kubernetes Volumes Storage

PersistentVolumeClaim: Requesting Storage

A PersistentVolumeClaim (PVC) is a request for storage by a user. It specifies size, access mode, and optionally a storage class. Kubernetes matches a PVC to a PV that satisfies the request. If no matching PV exists and a StorageClass is specified, dynamic provisioning kicks in. PVCs are namespaced, so different teams can request storage without stepping on each other. Once bound, a PVC is mounted into a pod as a volume. The binding is exclusive: a PV can only be bound to one PVC at a time (unless using ReadWriteMany). PVCs also support label selectors for more granular matching. In production, you should always specify a storageClassName to avoid accidentally binding to the wrong PV.

pvc-claim.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: fast
Output
PVC created, waits for a PV with 5Gi+ capacity, ReadWriteOnce, and storage class 'fast'.
💡Always Set storageClassName
Omitting storageClassName uses the default StorageClass, which may not exist or have unexpected behavior. Explicit is better.
📊 Production Insight
We had a CI pipeline that created PVCs without storageClassName. It bound to a slow NFS PV meant for backups, causing 10x slower builds. Always pin your storage class.
🎯 Key Takeaway
PVCs are namespaced requests that bind to PVs, enabling separation of concerns between ops and devs.

StorageClass: Dynamic Provisioning

StorageClass is the magic that makes Kubernetes storage truly cloud-native. It defines a provisioner (e.g., kubernetes.io/aws-ebs, csi-hostpath), parameters (type, IOPS, replication), and reclaim policy. When a PVC requests a StorageClass, the provisioner automatically creates a PV and binds it. This eliminates manual PV creation and enables self-service storage for developers. StorageClasses also support volume binding modes (Immediate vs WaitForFirstConsumer) and allow policies. In production, you should have at least two StorageClasses: one for fast SSD-backed volumes (databases) and one for cheaper HDD-backed volumes (logs, backups). Always test the provisioner's behavior with your cloud provider — some have quirks like volume limits per instance type.

storageclass-fast.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iopsPerGB: "10"
  fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Output
StorageClass 'fast' created. PVCs using it will provision gp3 EBS volumes with 10 IOPS per GB, deleted when PVC is deleted.
🔥WaitForFirstConsumer
This binding mode delays PV creation until a pod is scheduled, ensuring the volume is created in the same availability zone as the pod. Critical for cloud providers with zonal storage.
📊 Production Insight
We used Immediate binding with EBS and got cross-zone attachments that failed. Switching to WaitForFirstConsumer fixed it. Always match binding mode to your workload topology.
🎯 Key Takeaway
StorageClass enables dynamic, policy-driven storage provisioning, the backbone of cloud-native storage.

Access Modes and Their Real-World Implications

Access modes define how many nodes can mount the volume and with what permissions. ReadWriteOnce (RWO) allows a single node to mount read-write. ReadOnlyMany (ROX) allows many nodes to mount read-only. ReadWriteMany (RWX) allows many nodes to mount read-write. Not all storage backends support all modes. For example, EBS only supports RWO; NFS supports RWX. Choosing the wrong access mode leads to pod startup failures or data corruption. In production, use RWO for databases (single writer), ROX for config maps or static data, and RWX for shared file systems (e.g., WordPress uploads). RWX is notoriously tricky — ensure your application handles concurrent writes correctly.

pvc-rwx.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-storage
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: nfs
Output
PVC requests RWX volume. Must be backed by a storage class that supports RWX (e.g., NFS, Azure Files).
⚠ RWX Data Corruption Risk
Multiple pods writing to the same RWX volume without coordination can corrupt data. Use application-level locking or a distributed filesystem like GlusterFS.
📊 Production Insight
We had a logging stack where multiple Fluentd pods wrote to the same RWX NFS volume. Logs got interleaved and corrupted. Switched to per-pod PVCs with a central aggregator.
🎯 Key Takeaway
Access modes constrain how volumes can be mounted; choose based on your application's concurrency model.

Reclaim Policies: What Happens When You Delete a PVC

Reclaim policy determines what happens to a PV when its bound PVC is deleted. Retain keeps the PV and its data, but it becomes Released and cannot be reused until manually reclaimed. Delete removes both the PV and the underlying storage asset (e.g., EBS volume). Recycle (deprecated) scrubs the volume and makes it available again. In production, always use Retain for stateful workloads (databases, message queues) to prevent accidental data loss. Use Delete for ephemeral storage (CI artifacts, temp data). Never use Recycle — it's deprecated and insecure. Implement a backup strategy for Retain volumes; they can become orphaned and cost money if not cleaned up.

pv-retain.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-retain
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: /mnt/data
Output
PV with Retain policy. When PVC is deleted, PV stays in Released state with data intact.
⚠ Orphaned Volumes Cost Money
Retain volumes that are Released but not deleted still incur storage costs. Set up monitoring to alert on PVs in Released state for more than 24 hours.
📊 Production Insight
A junior admin deleted a PVC with reclaimPolicy: Delete on a production PostgreSQL volume. The entire database was gone. We now enforce Retain via OPA/Gatekeeper for all production namespaces.
🎯 Key Takeaway
Reclaim policy controls data lifecycle after PVC deletion; Retain for safety, Delete for automation.

Volume Snapshots and Cloning

Kubernetes supports volume snapshots and cloning via CSI drivers. Snapshots capture a point-in-time copy of a volume, useful for backups and disaster recovery. Cloning creates a new volume that is a duplicate of an existing one, useful for creating dev databases from production snapshots. Both are API objects: VolumeSnapshot, VolumeSnapshotContent, VolumeSnapshotClass. Not all CSI drivers support these features. In production, use snapshots for scheduled backups (e.g., via Velero) and clones for rapid environment provisioning. Be aware of performance impact: taking a snapshot of a heavily written volume can cause latency spikes.

volume-snapshot.yamlYAML
1
2
3
4
5
6
7
8
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: db-snapshot-20260712
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: postgres-pvc
Output
Creates a snapshot of the volume backing postgres-pvc. Snapshot is stored in the cloud provider's snapshot system.
🔥CSI Driver Required
Volume snapshots require a CSI driver that implements the snapshot feature. Check your driver's documentation.
📊 Production Insight
We use Velero with CSI snapshots for daily backups. Restoring a 500GB volume takes ~10 minutes. Test restore procedures quarterly — snapshots can silently fail.
🎯 Key Takeaway
Snapshots and clones enable backup, restore, and rapid cloning of persistent data.
kubernetes-volumes-storage THECODEFORGE.IO Kubernetes Storage Stack Layers From cluster resources to container mounts Container Mount path | Volume mount Pod PVC reference | Volume definition PersistentVolumeClaim Storage request | Access mode PersistentVolume Storage capacity | Reclaim policy StorageClass Provisioner | Parameters CSI Driver Node plugin | Controller plugin THECODEFORGE.IO
thecodeforge.io
Kubernetes Volumes Storage

CSI Drivers: The Modern Storage Interface

Container Storage Interface (CSI) is the standard for exposing storage systems to Kubernetes. CSI drivers run as DaemonSets and sidecars, handling volume operations (create, delete, mount, unmount). They replace in-tree volume plugins (e.g., kubernetes.io/aws-ebs) which are being deprecated. CSI drivers support features like snapshots, resize, topology, and inline volumes. In production, always use CSI drivers for cloud storage (EBS, GCE PD, Azure Disk) and third-party storage (Portworx, Rook/Ceph). They are more reliable, feature-rich, and maintained by the vendor. Migrate from in-tree plugins before they are removed in Kubernetes 1.28+.

csi-driver-install.yamlYAML
1
2
3
4
5
6
7
# Example: Installing AWS EBS CSI driver
# Using Helm
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm upgrade --install aws-ebs-csi-driver \
  --namespace kube-system \
  --set controller.serviceAccount.create=true \
  aws-ebs-csi-driver/aws-ebs-csi-driver
Output
CSI driver installed. Pods can now use ebs.csi.aws.com provisioner.
💡Use CSI for New Clusters
If starting a new cluster on Kubernetes 1.23+, use CSI drivers exclusively. In-tree plugins are deprecated and will be removed.
📊 Production Insight
We migrated from in-tree EBS to CSI and gained the ability to resize volumes without downtime. However, the migration required re-creating all PVs — plan carefully.
🎯 Key Takeaway
CSI is the future of Kubernetes storage — use it for all production storage integrations.

StatefulSets and Storage: The Right Way to Run Databases

StatefulSets are the workload API for stateful applications. They provide stable network identities, ordered deployment/scaling, and persistent storage via volumeClaimTemplates. Each replica gets its own PVC, ensuring data isolation. This is ideal for databases like Cassandra, MySQL, or Kafka. However, StatefulSets are not a silver bullet — they require careful planning for backup, recovery, and scaling. In production, use volumeClaimTemplates with a dedicated StorageClass (e.g., fast SSD). Be aware that scaling down a StatefulSet does not delete PVCs by default — you must manually clean up or use a custom controller.

statefulset-mysql.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast
      resources:
        requests:
          storage: 100Gi
Output
StatefulSet creates 3 MySQL pods, each with its own 100Gi PVC from 'fast' StorageClass.
⚠ PVCs Survive StatefulSet Deletion
Deleting a StatefulSet does not delete its PVCs. You must delete them manually or risk orphaned volumes.
📊 Production Insight
We run a 3-node MySQL InnoDB cluster on StatefulSets. Scaling down to 2 nodes left an orphaned PVC that we forgot to delete — it cost $200/month until discovered.
🎯 Key Takeaway
StatefulSets + volumeClaimTemplates provide stable storage per replica, essential for clustered stateful apps.

Ephemeral Volumes and Inline CSI

Kubernetes 1.22+ introduced generic ephemeral volumes, which combine the lifecycle of an emptyDir with the features of a PVC (snapshots, resize, storage class). They are created inline in a pod spec and deleted when the pod is removed. This is useful for scratch space that needs more capacity or performance than emptyDir. Inline CSI volumes allow you to directly reference a CSI volume in a pod spec without a PVC. In production, use ephemeral volumes for CI runners, batch jobs, or any workload where data doesn't need to outlive the pod. They reduce management overhead but still incur storage costs.

ephemeral-volume.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
  name: ephemeral-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "dd if=/dev/zero of=/data/largefile bs=1M count=1024 && sleep 3600"]
    volumeMounts:
    - name: fast-scratch
      mountPath: /data
  volumes:
  - name: fast-scratch
    ephemeral:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          storageClassName: fast
          resources:
            requests:
              storage: 10Gi
Output
Pod gets a 10Gi ephemeral volume from 'fast' StorageClass. Volume is deleted when pod terminates.
🔥Ephemeral Volumes Are Not Free
Even though they are ephemeral, they use real storage and cost money. Monitor usage to avoid surprises.
📊 Production Insight
We use ephemeral volumes for CI build agents. Each build gets a fresh 50Gi SSD volume, and it's automatically cleaned up. This eliminated the 'disk full' issues we had with emptyDir.
🎯 Key Takeaway
Ephemeral volumes combine the convenience of emptyDir with the power of PVC-backed storage.

Troubleshooting Storage Issues

Storage problems are among the hardest to debug in Kubernetes. Common issues: PVC stuck in Pending (no matching PV or StorageClass), pod stuck in ContainerCreating (volume mount failure), or volume not detaching (node issues). Start by describing the PVC and PV: kubectl describe pvc <name> shows events. Check the CSI driver logs (kubectl logs -n kube-system <csi-controller-pod>). Verify node conditions and kubelet logs. For cloud volumes, check the cloud console for volume state. In production, set up monitoring for volume metrics (disk usage, IOPS, latency) and alerts for PVC binding failures. Always have a rollback plan for storage changes.

debug-storage.shBASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Check PVC status
kubectl describe pvc my-pvc

# Check PV status
kubectl get pv

# Check events in namespace
kubectl get events --sort-by='.lastTimestamp'

# Check CSI driver pods
kubectl get pods -n kube-system -l app=ebs-csi-controller

# Check kubelet logs for mount errors
journalctl -u kubelet -n 50 | grep -i volume
Output
Outputs diagnostic information to identify storage issues.
💡Start with Events
kubectl describe pvc often shows the root cause in the Events section. Look for 'FailedBinding' or 'ProvisioningFailed'.
📊 Production Insight
We had a mysterious 'volume not found' error. Turns out the CSI driver's IAM role didn't have permission to describe volumes. Always check cloud provider permissions first.
🎯 Key Takeaway
Systematic debugging using describe, logs, and events resolves most storage issues.
Static vs Dynamic Provisioning Manual PV creation versus automated via StorageClass Static Provisioning Dynamic Provisioning PV creation Admin creates PV manually StorageClass creates PV automatically Scalability Limited by admin effort Scales with demand Storage reuse PVs can be reused with different claims PVs are typically deleted with claim Configuration Requires pre-defined storage assets Uses StorageClass parameters Flexibility Fixed capacity and access modes Customizable per claim Operational overhead High manual intervention Low automation via provisioner THECODEFORGE.IO
thecodeforge.io
Kubernetes Volumes Storage

Production Best Practices for Kubernetes Storage

After years of running stateful workloads in production, here are the non-negotiables: 1) Use CSI drivers for all storage. 2) Define at least two StorageClasses (fast and slow). 3) Set reclaimPolicy: Retain for all production PVCs. 4) Use volumeBindingMode: WaitForFirstConsumer for cloud volumes. 5) Implement backup and disaster recovery with Velero or similar. 6) Monitor volume usage and set alerts for >80% capacity. 7) Use PodDisruptionBudgets with StatefulSets to prevent data loss during node drains. 8) Test storage failover scenarios regularly. 9) Avoid hostPath and emptyDir for anything important. 10) Document your storage topology and recovery procedures.

pdb-statefulset.yamlYAML
1
2
3
4
5
6
7
8
9
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: mysql-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: mysql
Output
Ensures at least 2 MySQL pods are available during voluntary disruptions (e.g., node drains).
⚠ Test Your Backups
A backup that hasn't been restored is not a backup. Schedule quarterly restore drills.
📊 Production Insight
We ignored PDBs for our Kafka cluster. A node drain caused all replicas to restart simultaneously, leading to data loss. Now PDBs are mandatory for all StatefulSets.
🎯 Key Takeaway
Production storage requires proactive design, monitoring, and testing — not reactive firefighting.
⚙ Quick Reference
12 commands from this guide
FileCommand / CodePurpose
empty-dir-example.yamlapiVersion: v1Why Kubernetes Storage Is Different
pv-manual.yamlapiVersion: v1PersistentVolume
pvc-claim.yamlapiVersion: v1PersistentVolumeClaim
storageclass-fast.yamlapiVersion: storage.k8s.io/v1StorageClass
pvc-rwx.yamlapiVersion: v1Access Modes and Their Real-World Implications
pv-retain.yamlapiVersion: v1Reclaim Policies
volume-snapshot.yamlapiVersion: snapshot.storage.k8s.io/v1Volume Snapshots and Cloning
csi-driver-install.yamlhelm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-d...CSI Drivers
statefulset-mysql.yamlapiVersion: apps/v1StatefulSets and Storage
ephemeral-volume.yamlapiVersion: v1Ephemeral Volumes and Inline CSI
debug-storage.shkubectl describe pvc my-pvcTroubleshooting Storage Issues
pdb-statefulset.yamlapiVersion: policy/v1Production Best Practices for Kubernetes Storage

Key takeaways

1
Storage Abstraction
Kubernetes decouples storage provisioning (PV) from consumption (PVC) via StorageClass, enabling self-service and portability.
2
CSI Drivers Are Mandatory
Use CSI drivers for all production storage; in-tree plugins are deprecated and lack features like snapshots and resize.
3
Reclaim Policy Is Critical
Always use Retain for production data to prevent accidental deletion; use Delete only for ephemeral workloads.
4
Test Everything
Regularly test backup/restore, volume expansion, and failover scenarios. A storage strategy not tested is a strategy for failure.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01JUNIOR
What is the difference between a PersistentVolume and a PersistentVolume...
Q02JUNIOR
Can I resize a PVC after it's created?
Q03JUNIOR
What happens to data when I delete a StatefulSet?
Q01 of 03JUNIOR

What is the difference between a PersistentVolume and a PersistentVolumeClaim?

ANSWER
A PersistentVolume (PV) is a cluster resource representing physical storage (e.g., an EBS volume). A PersistentVolumeClaim (PVC) is a request for storage by a user. PVCs bind to PVs that match their r
FAQ · 6 QUESTIONS

Frequently Asked Questions

01
What is the difference between a PersistentVolume and a PersistentVolumeClaim?
02
Can I resize a PVC after it's created?
03
What happens to data when I delete a StatefulSet?
04
How do I choose between ReadWriteOnce and ReadWriteMany?
05
What is the best reclaim policy for production databases?
06
Why is my PVC stuck in Pending state?
N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Written from production experience, not tutorials.

Follow
Verified
production tested
July 12, 2026
last updated
2,073
articles · all by Naren
🔥

That's Kubernetes. Mark it forged?

4 min read · try the examples if you haven't

Previous
Kubernetes Namespaces and ResourceQuotas
33 / 38 · Kubernetes
Next
Kubernetes Taints, Tolerations and Node Affinity