تخطَّ إلى المحتوى

Volumes و PV و PVC

ستتعلم الفرق بين volume مؤقت و Persistent Volume، وكيف يطلب التطبيق مساحة تخزين باستخدام PVC، وكيف تشخص مشاكل binding و mount.

Pod مؤقت، لذلك أي ملفات داخله تضيع عند حذف Pod. لو التطبيق يحتاج بيانات تبقى، مثل PostgreSQL، نستخدم PersistentVolumeClaim. PVC هو طلب تخزين، و StorageClass يحدد من يوفر هذا التخزين.

flowchart LR
P[Pod] --> PVC[PersistentVolumeClaim]
PVC --> PV[PersistentVolume]
PV --> SC[StorageClass]
SC --> Disk[Disk أو CSI Provider]
النوعمناسب لـيبقى بعد حذف Pod؟
emptyDircache مؤقت داخل Podلا
configMap volumeملفات إعداداتيعاد من ConfigMap
secret volumeملفات سريةيعاد من Secret
PersistentVolumeClaimdatabase أو uploadsنعم، حسب policy

pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
labels:
app: storage-demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

pod-with-pvc.yaml:

apiVersion: v1
kind: Pod
metadata:
name: storage-demo
labels:
app: storage-demo
spec:
containers:
- name: app
image: busybox:1.37
command: ["sh", "-c", "while true; do date >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: app-data
mountPath: /data
resources:
requests:
cpu: "20m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"
volumes:
- name: app-data
persistentVolumeClaim:
claimName: data-pvc
Terminal window
kubectl apply -f pvc.yaml
kubectl apply -f pod-with-pvc.yaml
kubectl get pvc
kubectl get pod storage-demo
kubectl exec storage-demo -- tail -n 5 /data/out.txt

Expected output:

NAME STATUS VOLUME CAPACITY ACCESS MODES
data-pvc Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 1Gi RWO
الوضعالمعنى العملي
ReadWriteOncevolume يركب read/write على Node واحدة
ReadOnlyManyأكثر من Node تقرأ فقط
ReadWriteManyأكثر من Node تقرأ وتكتب، يحتاج storage provider يدعم ذلك
ReadWriteOncePodvolume يركب read/write على Pod واحد فقط
المشكلةالتشخيصالحل
PVC يظل Pendingkubectl describe pvc data-pvcلا توجد StorageClass أو provisioner
Pod يظل ContainerCreatingkubectl describe pod storage-demoفشل mount أو volume غير جاهز
permission deniedlogs داخل التطبيقاضبط securityContext أو permissions
فقدت البيانات بعد deletereclaimPolicy أو نوع volume مؤقتاستخدم PVC وتأكد من سياسة الحذف

Lab: PVC يحتفظ بالبيانات بعد إعادة إنشاء Pod

المستوى: مبتدئ الوقت: 45 دقيقة الأدوات: kubectl

الهدف: كتابة ملف داخل PVC، حذف Pod، إنشاء Pod جديد، والتأكد أن البيانات ما زالت موجودة.

  • Cluster يدعم dynamic provisioning، مثل minikube أو kind مع StorageClass.
  • تحقق من:
Terminal window
kubectl get storageclass
  1. طبق PVC و Pod:
Terminal window
kubectl apply -f pvc.yaml
kubectl apply -f pod-with-pvc.yaml
kubectl wait --for=condition=Ready pod/storage-demo --timeout=90s
  1. اقرأ الملف:
Terminal window
kubectl exec storage-demo -- tail -n 3 /data/out.txt
  1. احذف Pod فقط:
Terminal window
kubectl delete pod storage-demo
kubectl apply -f pod-with-pvc.yaml
kubectl wait --for=condition=Ready pod/storage-demo --timeout=90s
  1. اقرأ الملف مرة أخرى:
Terminal window
kubectl exec storage-demo -- tail -n 5 /data/out.txt

سترى تواريخ قديمة وحديثة في نفس الملف، وهذا يعني أن PVC احتفظ بالبيانات.

Fri May 8 10:00:05 UTC 2026
Fri May 8 10:00:10 UTC 2026
Fri May 8 10:01:20 UTC 2026
Terminal window
kubectl delete -f pod-with-pvc.yaml
kubectl delete -f pvc.yaml

الربط بالمشروع النهائي

Section titled “الربط بالمشروع النهائي”

Project 3 سيستخدم PostgreSQL مع PVC. الهدف ليس فقط تشغيل database، بل فهم ماذا يحدث للبيانات عندما يقع Pod أو ينتقل إلى Node أخرى.