kuber doc: pv and pvc

This commit is contained in:
2025-07-09 12:32:27 +03:30
parent 467518687f
commit 6d0e75ad85

View File

@@ -1,12 +1,13 @@
Here's a clean, organized, and visually appealing document version of your input on **Persistent Volumes (PV) in Kubernetes**: # 🌐 Kubernetes Persistent Volumes (PV) Cheat Sheet
---
# 🌐 Kubernetes: Persistent Volumes (PV) Cheat Sheet
## 📦 What is a Persistent Volume (PV)? ## 📦 What is a Persistent Volume (PV)?
A **Persistent Volume** is a piece of storage in a Kubernetes cluster that has been provisioned by an administrator or dynamically provisioned using **StorageClasses**. 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**.
--- ---
@@ -15,56 +16,64 @@ A **Persistent Volume** is a piece of storage in a Kubernetes cluster that has b
1. **HostPath** 1. **HostPath**
* Mounts a file or directory from the host nodes filesystem into your Pod. * 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** 2. **Using PV and PVC**
* **PV (Persistent Volume):** The actual storage resource. * **PV (Persistent Volume):** Represents the actual storage resource.
* **PVC (Persistent Volume Claim):** A request for storage by a user. * **PVC (Persistent Volume Claim):** A user's request for storage resources and access.
--- ---
## 🧱 Kubernetes Storage Layers ## 🧱 Kubernetes Storage Layers
1. **Persistent Volume (PV)** 1. **Persistent Volume (PV)** The actual storage unit.
2. **Persistent Volume Claim (PVC)** 2. **Persistent Volume Claim (PVC)** A request for that storage.
--- ---
## 🔄 PV Lifecycle States ## 🔄 PV Lifecycle States
| State | Description | | State | Description |
| ------------ | ---------------------------------------------------- | | ------------ | ------------------------------------------ |
| Provisioning | Kubernetes is preparing the PV. | | Provisioning | PV is being prepared. |
| Binding | The PV is bound to a PVC. | | Binding | PV is bound to a PVC. |
| Using | The bound PV is being used by a Pod. | | Using | PV is in use by a Pod. |
| Releasing | PVC is deleted; PV is no longer bound. | | Releasing | PVC is deleted; PV becomes unbound. |
| Reclaiming | PV is reclaimed using one of the following policies: | | Reclaiming | Reclaim policy is applied: |
| |     `Delete` Remove the storage | | | • `Delete` Remove the storage. |
| |     `Recycle` Basic scrub (deprecated) | | | • `Recycle` Basic scrub (deprecated). |
| |     `Retain` Manual reclaim | | | • `Retain` Manual intervention required. |
--- ---
## 🔒 PV Access Modes ## 🔒 PV Access Modes
| Mode | Description | | Mode | Description |
| ------ | ------------------------------------------- | | ------ | ---------------------------------------------- |
| `RWO` | **ReadWriteOnce** One node can read/write | | `RWO` | **ReadWriteOnce** One node can read/write |
| `ROX` | **ReadOnlyMany** Many nodes read-only | | `ROX` | **ReadOnlyMany** Multiple nodes read-only |
| `RWX` | **ReadWriteMany** Many nodes read/write | | `RWX` | **ReadWriteMany** Multiple nodes read/write |
| `RWOP` | **ReadWriteOncePod** One Pod only | | `RWOP` | **ReadWriteOncePod** Only one Pod can use it |
--- ---
## 🛠️ Check PVs via CLI ## 🛠️ CLI Commands to Manage PVs
```bash ```bash
# List all Persistent Volumes
kubectl get pv kubectl get pv
# List all Persistent Volume Claims
kubectl get pvc
# Edit a PVC
kubectl edit pvc -n <namespace> <pvc-name>
``` ```
--- ---
## 🚀 Example: Deployment using HostPath Volume ## 🚀 Example 1: Deployment with `hostPath` Volume
```yaml ```yaml
apiVersion: apps/v1 apiVersion: apps/v1
@@ -73,18 +82,16 @@ metadata:
name: app-1 name: app-1
namespace: dev namespace: dev
labels: labels:
label1: test1 app.kubernetes.io/name: nginx
app.kubernetes.io/label2: test2
spec: spec:
replicas: 3 replicas: 3
selector: selector:
matchLabels: matchLabels:
app.kubernetes.io/label2: test2 app.kubernetes.io/name: nginx
template: template:
metadata: metadata:
labels: labels:
app.kubernetes.io/label2: test2 app.kubernetes.io/name: nginx
os: linux
spec: spec:
containers: containers:
- name: nginx - name: nginx
@@ -98,11 +105,14 @@ spec:
- name: nginx-log - name: nginx-log
hostPath: hostPath:
path: /root/nginx/logs path: /root/nginx/logs
type: DirectoryOrCreate
``` ```
--- ---
## 📂 Example: PersistentVolume with NFS ## 📂 Example 2: NFS-backed Persistent Volume
### 🧩 PersistentVolume Definition
```yaml ```yaml
apiVersion: v1 apiVersion: v1
@@ -115,7 +125,7 @@ spec:
volumeMode: Filesystem volumeMode: Filesystem
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Recycle persistentVolumeReclaimPolicy: Retain
storageClassName: custom-name storageClassName: custom-name
mountOptions: mountOptions:
- hard - hard
@@ -125,3 +135,58 @@ spec:
server: 192.168.1.10 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