Persistent Volumes:

PersistentVolumes are K8s objects that allow you to treat storage as an abstract resource to be consumed by Pods, much like K8s treats compute resources such as memory and CPU. A PersistentVolume uses a set of attributes to describe the underlying storage resource (such as a disk or cloud storage location) which will be used to store data.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: my-pv
spec:
  storageClassName: localdisk
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /var/output

Storage Classes

Storage Classes allow K8s administrators to specify the types of storage services they offer on their platform. For example, an administrator could create a StorageClass called slow to describe low-performance but inexpensive storage resources, and another called fast for high-performance but more costly resources. This allows users to choose storage resources that fit the needs of their applications.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: localdisk
provisioner: kubernetes.io/no-provisioner
allowVolumeExpansion: true

Reclaim Policies

A PersistentVolume’s persistentVolumeReclaimPolicy determines how the storage resources can be reused when the PersistentVolume’s associated PersistentVolumeClaims are deleted. There are three options:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: my-pv
spec:
  storageClassName: localdisk
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /etc/output

Persistent Volume Claims

A PersistentVolumeClaim represents a user’s request for storage resources. It defines a set of attributes similar to those of a PersistentVolume (StorageClass, etc.). When a PersistentVolumeClaim is created, it will look for a PersistentVolume that is able to meet the requested criteria. If it finds one, it will automatically be bound to the PersistentVolume.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: localdisk
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi

Using a PersistentVolumeClaim in a Pod

PersistentVolumeClaims can be mounted to a Pod’s containers just like any other volume. If the PersistentVolumeClaim is bound to a PersistentVolume, the containers will use the underlying PersistentVolume storage.

apiVersion: v1
kind: Pod
metadata:
  name: pv-pod
spec:
  containers:
    - name: busybox
      image: busybox
      volumeMounts:
        - name: pv-storage
          mountPath: /output
      volumes:
        - name: pv-storage
          persistentVolumeClaim:
            claimName: my-pvc

Resizing a PersistentVolumeClaim

You can expand PersistentVolumeClaims without interrupting applications that are using them. Simply edit the spec.resources.requests.storage attribute of an existing PersistentVolumeClaim, increasing its value. However, the StorageClass must support resizing volumes and must have allowVolumeExpansion set to true.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: localdisk
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Mi