Try Sailor Cloud - 25% off!

Claim Now
Back to all posts

Kubernetes Persistent Volumes: Storage Made Simple

Kubernetes Persistent Volumes: Storage Made Simple

Containers are ephemeral, but data often needs to persist. Kubernetes provides a robust storage abstraction through Persistent Volumes (PV) and Persistent Volume Claims (PVC).

Storage Concepts

ConceptDescription
VolumeDirectory accessible to containers in a pod
PersistentVolume (PV)Cluster-wide storage resource
PersistentVolumeClaim (PVC)Request for storage by user
StorageClassDefines storage provisioner and parameters

Creating a PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/pv

Access Modes

  • ReadWriteOnce (RWO) - Single node read-write
  • ReadOnlyMany (ROX) - Multiple nodes read-only
  • ReadWriteMany (RWX) - Multiple nodes read-write

Reclaim Policies

  • Retain - Keep data after PVC deletion
  • Delete - Delete storage after PVC deletion
  • Recycle - Basic scrub (deprecated)

Creating a PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Using PVC in Pods

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

Dynamic Provisioning with StorageClass

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

Using StorageClass in PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  storageClassName: fast
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

Common Volume Types

# EmptyDir - Temporary storage
volumes:
- name: cache
  emptyDir: {}

# HostPath - Node filesystem
volumes:
- name: data
  hostPath:
    path: /data

# ConfigMap as volume
volumes:
- name: config
  configMap:
    name: my-config

Debugging Storage

# Check PV status
kubectl get pv

# Check PVC status
kubectl get pvc

# Describe for events
kubectl describe pvc my-pvc

Practice Storage

Storage questions appear in CKA exams. Practice at Sailor.sh.

Start Free Practice