Kubernetes Cheatsheet
Volumes
Use this Kubernetes reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
Volume Types Quick Reference
| Type | Lifecycle | Use case |
|---|---|---|
emptyDir | Pod lifetime | Scratch space, cache, inter-container sharing |
hostPath | Node lifetime | Node-local files, DaemonSets |
configMap / secret | Pod lifetime | Inject config files |
persistentVolumeClaim | Independent | Durable storage (databases, uploads) |
projected | Pod lifetime | Combine multiple sources into one mount |
downwardAPI | Pod lifetime | Expose Pod metadata as files |
nfs | External | Shared read-write across Pods |
csi | External | Cloud block/file storage via CSI drivers |
emptyDir
Created when Pod is scheduled; deleted when Pod is removed.
spec:
volumes:
- name: cache
emptyDir:
medium: "" # "" = disk, "Memory" = tmpfs
sizeLimit: 500Mi
containers:
- name: app
volumeMounts:
- name: cache
mountPath: /tmp/cachehostPath
Mounts a path from the Node's filesystem. Use sparingly; breaks Pod portability.
spec:
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket # File | Directory | Socket | CharDevice | BlockDevicePersistent Volume (PV) and Persistent Volume Claim (PVC)
Admin creates PV ──► Developer creates PVC ──► Pod uses PVC
PersistentVolume (admin-managed)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
reclaimPolicy: Retain # Retain | Recycle | Delete
storageClassName: standard
hostPath: # use cloud-specific driver in production
path: /mnt/dataPersistentVolumeClaim (developer-facing)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard # must match PV or StorageClassUse PVC in a Pod
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
containers:
- name: db
image: postgres:16
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/dataAccess Modes
| Mode | Short | Meaning |
|---|---|---|
ReadWriteOnce | RWO | R/W by a single Node |
ReadOnlyMany | ROX | Read-only by many Nodes |
ReadWriteMany | RWX | R/W by many Nodes (NFS, EFS, GCS) |
ReadWriteOncePod | RWOP | R/W by a single Pod (k8s 1.22+) |
StorageClass (dynamic provisioning)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "3000"
throughput: "125"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumerWhen a PVC references a StorageClass, a PV is automatically provisioned.
Expand a PVC
# StorageClass must have allowVolumeExpansion: true kubectl patch pvc my-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}' kubectl get pvc my-pvc # watch status.capacity
Projected Volume
Combine ConfigMap, Secret, ServiceAccountToken, and DownwardAPI into one mount:
spec:
volumes:
- name: combined
projected:
sources:
- configMap:
name: app-config
- secret:
name: db-secret
- serviceAccountToken:
path: token
expirationSeconds: 3600DownwardAPI
Expose Pod/container metadata as files:
spec:
volumes:
- name: podinfo
downwardAPI:
items:
- path: "namespace"
fieldRef:
fieldPath: metadata.namespace
- path: "cpu_limit"
resourceFieldRef:
containerName: app
resource: limits.cpukubectl Volume Commands
| Command | What it does |
|---|---|
kubectl get pv | List PersistentVolumes |
kubectl get pvc | List PersistentVolumeClaims |
kubectl get sc | List StorageClasses |
kubectl describe pvc my-pvc | Show binding status, events |
kubectl delete pvc my-pvc | Delete PVC (PV fate = reclaimPolicy) |
kubectl patch pvc my-pvc ... | Resize PVC |