{"id":9415,"date":"2025-09-30T11:12:36","date_gmt":"2025-09-30T05:42:36","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=9415"},"modified":"2026-08-28T15:51:50","modified_gmt":"2026-08-28T10:21:50","slug":"persistent-volumes-and-persistent-volumes-claims-in-kubernetes","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/persistent-volumes-and-persistent-volumes-claims-in-kubernetes\/","title":{"rendered":"How to Use Persistent Volumes and Claims in Kubernetes for Data Persistence"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In Kubernetes, Pods are <strong>ephemeral<\/strong>, meaning any data stored inside a Pod is lost if the Pod is deleted or restarted. This can create challenges for applications like <strong>databases, content management systems, or file storage<\/strong> that require <strong>persistent data<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes addresses this with <strong>Persistent Volumes (PV)<\/strong> and <strong>Persistent Volume Claims (PVC)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Persistent Volume (PV):<\/strong> A piece of storage in the cluster, provisioned by an administrator or dynamically via a StorageClass.<\/li>\n\n\n\n<li><strong>Persistent Volume Claim (PVC):<\/strong> A request for storage by a Pod, specifying size, access mode, and optionally a label selector.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">By using PVs and PVCs, you can <strong>ensure data persists beyond the lifecycle of a Pod<\/strong>, decouple storage from compute, and manage storage efficiently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before you start, ensure the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A running <strong>Kubernetes cluster<\/strong> (Minikube, kind, or cloud provider).<\/li>\n\n\n\n<li><strong>kubectl<\/strong> is installed and configured to communicate with your cluster.<\/li>\n\n\n\n<li>Basic knowledge of <strong>Pods and YAML manifests<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create a Persistent Volume (PV)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A PV is the actual storage resource in your cluster. Here\u2019s an example with a <strong>label selector<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: pv-demo\n  labels:\n    type: fast-storage\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteOnce\n  hostPath:\n    path: \"\/mnt\/data\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apply the PV:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f pv.yaml<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pv<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create a Persistent Volume Claim (PVC)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A PVC is a request for storage that binds to a matching PV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: pvc-demo\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 500Mi\n  selector:\n    matchLabels:\n      type: fast-storage<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apply the PVC:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f pvc.yaml<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pvc<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Use the PVC in a Pod<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mount the PVC inside a Pod to give your container access to persistent storage:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: pod-with-pvc\nspec:\n  containers:\n  - name: nginx\n    image: nginx:latest\n    volumeMounts:\n    - mountPath: \"\/usr\/share\/nginx\/html\"  # Path inside the Pod\n      name: storage\n  volumes:\n  - name: storage\n    persistentVolumeClaim:\n      claimName: pvc-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Apply the Pod:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f pod-with-pvc.yaml<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Any data written to <code>\/usr\/share\/nginx\/html<\/code> In the Pod is actually stored in the PV (<code>\/mnt\/data<\/code>on the worker node).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Verify Data Persistence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">1. Exec into the pod:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>kubectl exec -it pod-with-pvc -- \/bin\/bash<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2. Create a file in the mounted volume:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>echo \"Hello Kubernetes\" &gt; \/usr\/share\/nginx\/html\/index.html<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3. Exit the Pod and delete it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>kubectl delete pod pod-with-pvc<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">4. Create a <strong>new Pod<\/strong> using the same PVC:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: new-pod-with-pvc\nspec:\n  containers:\n  - name: nginx\n    image: nginx:latest\n    volumeMounts:\n    - mountPath: \"\/usr\/share\/nginx\/html\"\n      name: storage\n  volumes:\n  - name: storage\n    persistentVolumeClaim:\n      claimName: pvc-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Apply the new Pod and check the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f new-pod-with-pvc.yaml\nkubectl exec -it new-pod-with-pvc -- cat \/usr\/share\/nginx\/html\/index.html<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You should see <strong>\u201cHello Kubernetes\u201d<\/strong>, confirming that <strong>data persisted<\/strong> across pods.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Advantages of PV and PVC<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Data Persistence:<\/strong> Data survives Pod deletions and restarts.<\/li>\n\n\n\n<li><strong>Decoupling Storage from Pods:<\/strong> PVs exist independently of Pods.<\/li>\n\n\n\n<li><strong>Dynamic Provisioning:<\/strong> PVCs can automatically request storage from cloud providers.<\/li>\n\n\n\n<li><strong>Controlled Binding:<\/strong> Using labels and selectors ensures PVC binds to the correct PV.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Persistent Volumes and Persistent Volume Claims are essential for <strong>stateful applications<\/strong> in Kubernetes. They provide <strong>reliable, reusable, and decoupled storage<\/strong>, ensuring that your application data remains safe even if pods are deleted or recreated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In Kubernetes, Pods are ephemeral, meaning any data stored inside a Pod is lost if the Pod is deleted [&hellip;]<\/p>\n","protected":false},"author":510,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1020],"tags":[855,1070],"class_list":["post-9415","post","type-post","status-publish","format-standard","hentry","category-containers-kubernetes","tag-kubernetes","tag-kubernetes-persistent-volumes","psol-cat-containers-kubernetes"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-2rR","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/9415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/510"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=9415"}],"version-history":[{"count":2,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/9415\/revisions"}],"predecessor-version":[{"id":11130,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/9415\/revisions\/11130"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=9415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=9415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=9415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}