Demystifying Kubernetes Persistent Volumes
Persistent Volumes are storage that’s decoupled from the lifecycle of Pods. To use them, a Pod specifies a PVC. The control plane binds the PVC to a PV in a StorageClass, assuming that the PV meets the access modes and volume size requested.
When a PVC is edited to request a more significant volume size, the control plane expands the backing volume to match the new specification. This is called reclaiming.
What is a Persistent Volume?
A persistent volume is a higher abstraction that decouples storage from the pods that use it. Several pods can share it and save data at the cluster or namespace level. It also retains its data after the pods that use it are deleted. This allows you to remount the same volume into new, future pods.
A persistent volume can be configured with various attributes, such as size and access mode. It can be created either statically or dynamically using a StorageClass. Once it has been created, it can be bound to a PersistentVolumeClaim. Then, when a pod creates a PersistentVolume in the same namespace as the PVC, OKD finds the backed-up PV to mount into the Pod. A PV can be Available, Bound, Released, or Failed.
Let’s say you’re a cluster administrator and create a PersistentVolume backed by physical storage. You assign it a StorageClass and set its size to 10 gigabytes. Then, you use kubectl to create a PersistentVolumeClaim that uses this PersistentVolume for storage. This configuration specifies that the Pod’s configuration file should refer to this PersistentVolumeClaim as its storage, and it also defines a namespace and a spec that tells the Pod where to find the PersistentVolume on the single Node in the cluster.
So, say goodbye to data drift and hello to persistent stability with Kubernetes persistent volumes! They offer a centralized, secure, and reusable storage solution, perfect for applications that need their data to stay put, even when the pods around them come and go. Remember, in the bustling marketplace of your Kubernetes cluster, persistent volumes are your reliable data fortresses, keeping your information safe and easily accessible for all.
What is a Persistent Volume Claim?
A Persistent Volume Claim is a storage request. When a Pod requests a PVC, the cluster attempts to match it with existing storage that meets its parameters. When a PVC matches a real storage object, the Pod’s container uses that PVC to mount the real storage object in its Pod.
A PVC may specify a volume mode that defines how a Pod will access the storage, such as hostPath that stores data within a named directory on a single Node (used for development and testing only in a single-Node cluster) or nfs that mounts Network File System (NFS) to allow multiple Pods to access the duplicate files on the same device. A PVC can also specify node affinity to limit its availability to a set of Nodes.
A Pod’s PVC can be resized if the underlying storage supports it. If the resize request is too large for the underlying storage to accommodate, the expansion of the PVC is continuously retried until the user or the cluster administrator takes action.
You can see the state of a PVC by running the kubectl describe persistentvolume name> command. The resulting command output includes an alpha lastPhaseTransitionTime field that records the timestamp of the last time the PVC transitioned its phase. When a PVC is no longer bound to a Pod, it can be deleted using the kubectl delete command.
How do Persistent Volumes Work?
Unlike ephemeral volumes, persistent volumes decouple data storage from pods. This allows you to deploy and manage workloads like database servers without worrying about the container filesystem being lost when the Pod is deleted or rescheduled. Persistent Volumes will also enable you to scale your application by adding new containers without losing existing data.
To access a persistent volume, workloads use PVCs to request a portion of the cluster’s storage resources. These PVCs specify the access mode and storage size they need and how often the storage needs to be reclaimed. The PVCs are then bound to a persistent volume and can be used to store and read files by the workload.
PVCs can be statically created using kubectl or dynamically provisioned through storage classes. A storage class is an API object that encapsulates different storage implementation characteristics pointing to a physical storage system, such as iSCSI, NFS, or cloud provider offerings. When a PVC specifies the desired storage class, the control loop tries to find a persistent volume that matches the requirements and then binds them together. If the PVC is unsatisfied with any available static PVs, the control loop can attempt to create a PV dynamically based on the storage class specifications. Once a PVC and its bound PV are in use, the cluster will keep them exclusively reserved until they need to be reclaimed.
How do Persistent Volumes Reclaim?
Persistent volumes are ideal for applications where data needs to be shared between multiple pods or survives restarts. However, storing data on persistent volume storage doesn’t come without risks. If a volume is deleted, or the Pod that referenced it dies, you lose your data. You must back up data from your persistent volume system using a separate backup solution.
To use a persistent volume, you create a PersistentVolumeClaim object that specifies storage requirements, such as the desired size and access mode. Then, the cluster finds a PV that matches these requirements and binds it to the PVC. Pods use the PVC to request and mount the associated PV. If you edit the spec of a PersistentVolumeClaim to configure a more significant volume size, the underlying persistent volume is never resized. The edit triggers a new Pod to be scheduled, but it won’t be able to access the resized volume until it is bound to it.
When a user is finished with a persistent volume, they delete the PVC object from the API. This frees the PV and allows reclamation, but the previous claimant’s data is still on the volume. How the cluster manages the reclaimed volume depends on its reclaim policy, which can be Retained, Recycled, or Deleted. A Recycle reclaim policy recycles the unused persistent volume into the pool of unbound persistent volumes.