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

193 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🌐 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
```bash
# 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
```yaml
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
```yaml
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
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: ns-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: custom-name
```
### 🚀 Deployment Using PVC
```yaml
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