Skip to main content

Storage

Concepts

ResourceRole
PersistentVolume (PV)Cluster-level storage resource
PersistentVolumeClaim (PVC)Namespaced request for storage
StorageClassTemplate for dynamic provisioning

StorageClass (AWS EBS gp3)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain
allowVolumeExpansion: true

PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data
namespace: production
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp3
resources:
requests:
storage: 50Gi

Access modes

ModeAbbreviationSupport
ReadWriteOnceRWOMost block storage
ReadWriteManyRWXNFS, EFS, CephFS
ReadOnlyManyROXRare

Volume expansion

Most CSI drivers support online expansion — no pod restart needed.

kubectl patch pvc postgres-data \
-n production \
-p '{"spec":{"resources":{"requests":{"storage":"100Gi"}}}}'

Ephemeral storage

For scratch space that doesn't need persistence, use emptyDir:

volumes:
- name: cache
emptyDir:
sizeLimit: 500Mi
Data loss

emptyDir is destroyed when the pod is removed. Never store anything you need to keep.