Files
my-docs/Containerization & Orchestration/Kubernetes/workloads/11-Pv.md
2025-07-09 12:32:27 +03:30

4.2 KiB
Raw Blame History

🌐 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

  1. HostPath

    • Mounts a file or directory from the host nodes filesystem into your Pod.
    • Useful only for single-node testing or development.
  2. 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

  1. Persistent Volume (PV) The actual storage unit.
  2. 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

📝 Common Mistakes Fixed