4.2 KiB
4.2 KiB
🌐 Kubernetes Persistent Volumes (PV) Cheat Sheet
📦 What is a Persistent Volume (PV)?
A Persistent Volume (PV) is a piece of storage in a Kubernetes cluster that is either:
- Pre-provisioned by an administrator, or
- Dynamically provisioned using StorageClasses.
It allows data to persist beyond the lifecycle of individual Pods.
📁 PV Storage Options
-
HostPath
- Mounts a file or directory from the host node’s filesystem into your Pod.
- Useful only for single-node testing or development.
-
Using PV and PVC
- PV (Persistent Volume): Represents the actual storage resource.
- PVC (Persistent Volume Claim): A user's request for storage resources and access.
🧱 Kubernetes Storage Layers
- Persistent Volume (PV) – The actual storage unit.
- Persistent Volume Claim (PVC) – A request for that storage.
🔄 PV Lifecycle States
| State | Description |
|---|---|
| Provisioning | PV is being prepared. |
| Binding | PV is bound to a PVC. |
| Using | PV is in use by a Pod. |
| Releasing | PVC is deleted; PV becomes unbound. |
| Reclaiming | Reclaim policy is applied: |
• Delete – Remove the storage. |
|
• Recycle – Basic scrub (deprecated). |
|
• Retain – Manual intervention required. |
🔒 PV Access Modes
| Mode | Description |
|---|---|
RWO |
ReadWriteOnce – One node can read/write |
ROX |
ReadOnlyMany – Multiple nodes read-only |
RWX |
ReadWriteMany – Multiple nodes read/write |
RWOP |
ReadWriteOncePod – Only one Pod can use it |
🛠️ CLI Commands to Manage PVs
# List all Persistent Volumes
kubectl get pv
# List all Persistent Volume Claims
kubectl get pvc
# Edit a PVC
kubectl edit pvc -n <namespace> <pvc-name>
🚀 Example 1: Deployment with hostPath Volume
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-1
namespace: dev
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
volumes:
- name: nginx-log
hostPath:
path: /root/nginx/logs
type: DirectoryOrCreate
📂 Example 2: NFS-backed Persistent Volume
🧩 PersistentVolume Definition
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: custom-name
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /nfs/data
server: 192.168.1.10
📄 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: ns-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: custom-name
🚀 Deployment Using PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-1
namespace: dev
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx-log
mountPath: /var/log/nginx
volumes:
- name: nginx-log
persistentVolumeClaim:
claimName: pvc1