Skip to Content

What Is a Kubernetes Persistent Volume?

Managing storage for stateful applications is a crucial aspect of container orchestration. Kubernetes Persistent Volume (PV) is a fundamental feature that addresses this need by providing a mechanism to manage storage resources independently from the lifecycle of individual pods. In this article, we’ll dive into the concept of Kubernetes Persistent Volume, its features, and best practices for using it effectively in your Kubernetes clusters.

What Is Kubernetes Persistent Volume?

A Kubernetes Persistent Volume (PV) is a storage resource in a Kubernetes cluster that abstracts the underlying storage technology. Unlike temporary storage, which is tied to a pod's lifecycle and disappears when the pod is terminated, PVs provide a way to manage and allocate persistent storage to applications. This ensures data remains intact even if the pods accessing it are terminated or rescheduled.

Using persistent volumes provides benefits such as:

  • Storage abstraction: PVs hide the specifics of the physical storage (e.g., local disks, SAN, cloud storage) from the pods. Users can request storage without needing to know the specific implementation details.
  • Persistence: PVs guarantee data persistence even across pod restarts or rescheduling. Imagine a web server pod that uses ephemeral storage to store temporary logs. When the pod restarts, those logs are lost. Persistent storage, on the other hand, ensures data, like application data maintained by a database pod, remains intact.
  • Decoupling storage from pods: This separation allows for greater flexibility and control over storage resources. Pods can be easily scaled up or down without affecting the underlying storage.

Key Features of Kubernetes Persistent Volumes

Kubernetes Persistent Volumes offer several key features that make them powerful and adaptable for diverse storage needs:

Storage Classes

Storage classes act like templates that define different tiers or categories of storage available in a cluster. They can specify characteristics like performance (e.g., SSD vs. HDD), capacity, durability, and cost. This allows administrators to provision storage tailored to the specific requirements of applications.

Access Modes

Access modes define how pods can interact with the storage provided by a PV. Here's a breakdown of the common modes:

  • ReadWriteOnce (RWO): Only one pod at a time can mount the volume with read-write permissions. This ensures data integrity for applications that require exclusive write access, such as a primary database replica.
  • ReadOnlyMany (ROX): Multiple pods can mount the volume simultaneously, but only in read-only mode. This is useful for scenarios where applications need to access shared data without modification, like a configuration file or log repository.
  • ReadWriteMany (RWX): Multiple pods can mount the volume with read-write permissions. This access mode should be used with caution due to potential data inconsistencies if multiple pods write concurrently. It's ideal for specific use cases like shared caches or collaborative editing tools.

Reclaim Policies

Reclaim policies dictate how Kubernetes handles a PV after it's no longer bound to a pod. The main policies include:

  • Retain: The PV remains after the pod unbinds, allowing manual administration for potential future use or migration.
  • Recycle: Kubernetes recycles the PV. This typically involves wiping any existing data and making the storage available for future pod assignments.
  • Delete: The PV object and its underlying storage resource are completely deleted. Use this with caution, as data recovery might not be possible.

Volume Plugins

Kubernetes leverages volume plugins to bridge the gap between the platform and various storage providers. These plugins enable Kubernetes to understand and interact with diverse storage backends, including local storage, network attached storage (NAS) solutions like NFS or iSCSI, and cloud provider-specific storage services like AWS EBS or GCE Persistent Disk. This plugin architecture provides significant flexibility in choosing and integrating storage solutions with your Kubernetes cluster.

Provisioning Persistent Volumes

Kubernetes offers two primary methods for provisioning Persistent Volumes (PVs): static provisioning and dynamic provisioning. Each approach caters to different use cases and provides distinct advantages.

Static Provisioning

In static provisioning, cluster administrators manually create and configure PVs beforehand. This approach provides fine-grained control over storage configuration and is suitable for scenarios with well-defined storage requirements that don't change frequently. To provision a PV statically:

1. Define the storage details: Determine the storage capacity, access modes (ReadWriteOnce, ReadOnlyMany, ReadWriteMany), reclaim policy (Retain, Recycle, Delete), and volume plugin specifics (e.g., server address for NFS).

2. Create the PV object using YAML: Use a YAML manifest file to define the PV configuration. Here's an example utilizing NFS storage:

apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: my-pv-nfs
 spec:
   capacity:
     storage: 10Gi
   accessModes:
     - ReadWriteOnce
   persistentVolumeReclaimPolicy: Retain
   nfs:
     path: /path/to/nfs/share
     server: nfs-server.example.com

  • name: Unique name for the PV.
  • storage: Desired storage capacity (e.g., 10Gi for 10 Gigabytes).
  • accessModes: Choose the appropriate access mode based on your application's requirements.
  • persistentVolumeReclaimPolicy: Define how Kubernetes should handle the PV after it's unbound from a pod.
  • nfs.path: Path to the NFS share on the NFS server.
  • nfs.server: IP address or hostname of the NFS server.

3. Apply the YAML manifest: Use the kubectl apply -f command to create the PV object in your Kubernetes cluster.

Dynamic Provisioning

Dynamic provisioning leverages StorageClasses to automate PV creation. Administrators define StorageClasses that specify desired storage characteristics and let Kubernetes handle PV creation on demand when a PersistentVolumeClaim (PVC) requests storage. To use dynamic provisioning:

1. Define a StorageClass: Create a StorageClass YAML manifest specifying the provisioner, storage type (e.g., SSD, HDD), and any additional parameters required by the provisioner. Here's an example for AWS EBS:

apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: standard-ebs
 provisioner: kubernetes.io/aws-ebs
 parameters:
   type: gp2

  • name: Unique name for the StorageClass.
  • provisioner: Name of the storage provisioner plugin (e.g., kubernetes.io/aws-ebs for AWS EBS).
  • parameters.type: Storage type within the provisioner (e.g., gp2 for a general-purpose SSD volume type in AWS EBS).

2. Apply the StorageClass manifest: Use kubectl apply -f to create the StorageClass object in your cluster.

Binding Persistent Volumes to Pods

Binding a PV to a pod enables applications to leverage persistent storage. This binding is typically achieved through a PersistentVolumeClaim (PVC).

    A PVC acts as a storage request submitted by a pod. It specifies the storage requirements a pod has, including:

  • Access modes: Defines how the pod can interact with the storage (e.g., ReadWriteOnce, ReadOnlyMany, ReadWriteMany).
  • Storage capacity: The desired amount of storage for the pod.
  • StorageClassName (optional): References a StorageClass for dynamic provisioning.

    There are two primary methods for binding PVs to pods:

  • Static binding: In static binding, administrators manually create a PVC that explicitly references a pre-provisioned PV. The PVC and PV must have compatible attributes, such as matching access modes and sufficient storage capacity in the PV, to meet the PVC's request.
  • Dynamic binding: Dynamic binding leverages StorageClasses for automated PV creation. When a pod with a PVC referencing a StorageClass is deployed, Kubernetes searches for a suitable PV (either existing or newly provisioned based on the StorageClass) that fulfills the PVC's requirements. If a suitable PV is found, Kubernetes automatically binds the PV and PVC together.

Here's an example of a pod named "pod-example" that utilizes a PVC named "pvc-example":

apiVersion: v1
 kind: Pod
 metadata:
   name: pod-example
 spec:
   containers:
   - name: app
     image: nginx
     volumeMounts:
     - mountPath: "/usr/share/nginx/html"
       name: pvc-storage
   volumes:
   - name: pvc-storage
     persistentVolumeClaim:
       claimName: pvc-example

In this example, the pod mounts the PVC named "pvc-example" at the path "/usr/share/nginx/html" within the container. This allows the pod to access and manage its persistent data stored in the underlying PV.

Managing Persistent Volumes

It is imperative to manage your Persistent Volumes (PVs) effectively to maintain an efficient and scalable storage utilization in your Kubernetes cluster. Some key aspects of PV management include:

1. Resizing Persistent Volumes

Kubernetes v1.11 introduced the ability to resize PVs. This allows you to dynamically adjust the storage capacity allocated to a PV, catering to growing storage requirements of your applications. 

To resize a PV, update the PVC's storage request: Edit the PVC that references the PV and modify the storage value within the resources.requests section of the PVC's YAML specification. For instance, to increase the size of a PVC named "pvc-example" to 20Gi, update the YAML manifest:

apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
   name: pvc-example
 spec:
   resources:
     requests:
       storage: 20Gi

Once you update the PVC's storage request, Kubernetes attempts to resize the underlying storage provisioned for the PV. Resizing a PV is generally a one-way operation (expanding storage). Shrinking the size of a PV is not supported due to potential data loss concerns.

2. Deleting Persistent Volumes

To delete a PV, ensure it's not currently bound to any PVCs. You cannot delete a PV in use by a PVC to prevent data loss. Here's how to delete a PV:

kubectl delete pv pv-example

Replace pv-example with the actual name of the PV you want to delete.

3. Updating Persistent Volumes

While the core storage capacity cannot be directly modified within a PV object, you can update certain metadata fields of a PV, such as labels or annotations. These labels and annotations can be used to better organize, identify, and manage your PVs within the cluster.

Best Practices for Using Kubernetes Persistent Volumes

The following are some of the best practices you should follow to get the most out of Kubernetes persistent volumes:

  • Select appropriate storage classes: Choose storage classes that match your applications' performance and durability requirements. For example, use SSD-backed storage for high-performance applications and HDD-backed storage for archival purposes.
  • Configure access modes correctly: Select the appropriate access mode for your PV based on how your applications need to access the storage. For instance, you can use RWX for shared file systems and RWO for single-instance databases.
  • Implement reclaim policies wisely: Set reclaim policies that match your data lifecycle management strategy. Use the Retain policy for critical data that requires manual intervention before deletion.
  • Monitoring and logging: Utilize monitoring and logging tools to monitor PV usage, performance, and health. Tools like Prometheus and Grafana can provide valuable insights into your storage infrastructure.
  • Use Portworx® for advanced data management: For advanced data management and persistent storage solutions in Kubernetes, consider using Portworx by Pure Storage. Portworx offers features like high availability, disaster recovery, and backup that are specifically designed for containerized applications.

Conclusion

Kubernetes Persistent Volumes (PVs) offer a fundamental mechanism for managing storage in stateful applications. By leveraging PVs, you can ensure data persistence, high availability, and efficient storage utilization within your Kubernetes cluster. Solutions like Portworx by Pure Storage provide an intuitive way of harnessing the benefits of Kubernetes' persistent volumes. With features like high availability, disaster recovery, and backup that uses artificial intelligence for improved efficiency, Portworx is the ideal Kubernetes persistent storage solution for containerized applications.

02/2025
Deploying Portworx on Google Distributed Cloud Anthos with vSphere
This Portworx reference architecture contains a validated architecture and design model to deploy Portworx on Anthos running on vSphere.
Reference Architecture
28 pages

Browse key resources and events

RESORTS WORLD LAS VEGAS | JUNE 17 - 19
Pure//Accelerate® 2025

Join us June 17 - 19 and level up your data success.

Register Now
PURE360 DEMOS
Explore, Learn, and Experience

Access on-demand videos and demos to see what Pure Storage can do.

Watch Demos
SAN JOSE, CALIFORNIA
Join Pure Storage at NVIDIA GTC 2025

Discover groundbreaking HPC and AI innovation and learn how we can help you keep up with rapidly evolving GPU environments.

 

Book a Meeting
ANALYST REPORT
Stop Buying Storage, Embrace Platforms Instead

Explore the requirements, components, and selection process for new enterprise storage platforms.

Get the Report
CONTACT US
Meet with an Expert

Let’s talk. Book a 1:1 meeting with one of our experts to discuss your specific needs.

Questions, Comments?

Have a question or comment about Pure products or certifications?  We’re here to help.

Schedule a Demo

Schedule a live demo and see for yourself how Pure can help transform your data into powerful outcomes. 

Call Sales: 800-976-6494

Mediapr@purestorage.com

 

Pure Storage, Inc.

2555 Augustine Dr.

Santa Clara, CA 95054

800-379-7873 (general info)

info@purestorage.com

CLOSE
Your Browser Is No Longer Supported!

Older browsers often represent security risks. In order to deliver the best possible experience when using our site, please update to any of these latest browsers.