انتقل إلى المحتوى الرئيسي

الفصل 6.2 - PersistentVolumes و PersistentVolumeClaims

أهداف التعلم​

في نهاية هذا الفصل، ستكون قادرًا على:

  • فهم PersistentVolumes (PV) و PersistentVolumeClaims (PVC)
  • إنشاء واستخدام PVs و PVCs
  • فهم أوضاع الوصول (RWO، ROX، RWX)
  • إدارة دورة حياة التخزين
  • فهم سياسات الاسترداد
  • اختيار نوع التخزين المناسب حسب حالة الاستخدام

مقدمة​

يتم حذف الأحجام المؤقتة (emptyDir، tmpfs) عندما ينتهي الـ Pod. بالنسبة للبيانات المهمة التي يجب أن تستمر (قواعد البيانات، ملفات المستخدمين، إلخ)، يستخدم Kubernetes PersistentVolumes و PersistentVolumeClaims.


المفاهيم الأساسية​

PersistentVolume (PV)​

PersistentVolume هو مورد تخزين في العنقود تم توفيره بواسطة مسؤول. إنه مورد على مستوى العنقود، مستقل عن الـ Pods.

PersistentVolumeClaim (PVC)​

PersistentVolumeClaim هو طلب تخزين من قبل مستخدم. يربط الـ PVC بين PV و Pod.


إنشاء PersistentVolume​

مثال: PV مع hostPath (التطوير المحلي)​

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /data/pv-volume

ملاحظة: hostPath مخصص للتطوير المحلي فقط. في الإنتاج، استخدم حلول السحابة (EBS، Azure Disk، GCE Persistent Disk) أو NFS.

مثال: PV مع NFS​

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: nfs-server.example.com
path: /exports/data

إنشاء PersistentVolumeClaim​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: manual

عملية الربط:


أوضاع الوصول​

تحدد أوضاع الوصول كيفية تركيب الحجم:

ReadWriteOnce (RWO)​

  • يمكن تركيب الحجم للقراءة والكتابة من قبل عقدة واحدة فقط
  • يمكن لعدة Pods على نفس العقدة مشاركة الحجم
  • حالة الاستخدام: قواعد البيانات، التطبيقات ذات الحالة

ReadOnlyMany (ROX)​

  • يمكن تركيب الحجم للقراءة فقط من قبل عدة عقد
  • حالة الاستخدام: ملفات التكوين للقراءة فقط، البيانات المشتركة

ReadWriteMany (RWX)​

  • يمكن تركيب الحجم للقراءة والكتابة من قبل عدة عقد
  • حالة الاستخدام: أنظمة الملفات المشتركة (NFS، GlusterFS)

الاستخدام في Pod​

apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: app
image: nginx:1.20
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: pv-claim

التدفق الكامل:


سياسات الاسترداد​

تحدد سياسة الاسترداد ما يحدث لـ PV عندما يتم حذف PVC.

Retain​

يتم الاحتفاظ بـ PV حتى بعد حذف PVC. تظل البيانات سليمة.

حالة الاستخدام:

  • بيانات مهمة للحفظ
  • حاجة لاسترداد يدوي
  • الامتثال والتدقيق

Delete​

يتم حذف PV تلقائيًا مع PVC. يتم فقدان البيانات.

حالة الاستخدام:

  • بيانات مؤقتة
  • بيئات التطوير
  • التوفير الديناميكي

Recycle (مهمل)​

هذه السياسة مهملة. استخدم Retain أو Delete بدلاً منها.


مثال كامل: قاعدة بيانات​

الخطوة 1: إنشاء PersistentVolume​

apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
labels:
app: postgres
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: fast-ssd
hostPath:
path: /data/postgres

الخطوة 2: إنشاء PersistentVolumeClaim​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: fast-ssd

الخطوة 3: الاستخدام في Deployment​

apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc

أوامر مفيدة​

عرض PVs و PVCs​

# قائمة PVs
kubectl get pv

# تفاصيل PV
kubectl describe pv pv-volume

# قائمة PVCs
kubectl get pvc

# تفاصيل PVC
kubectl describe pvc pv-claim

التحقق من الربط​

# عرض حالة الربط
kubectl get pv
kubectl get pvc

# عرض التفاصيل
kubectl get pv pv-volume -o yaml
kubectl get pvc pv-claim -o yaml

حذف PVC​

# حذف PVC
kubectl delete pvc pv-claim

# التحقق من حالة PV بعد الحذف
kubectl get pv pv-volume

أنواع التخزين​

التخزين المحلي (hostPath)​

المزايا:

  • بسيط للتطوير
  • لا يعتمد على جهات خارجية

العيوب:

  • غير قابل للنقل
  • خطر فقدان البيانات
  • لا يعمل مع عدة عقد

الاستخدام: التطوير المحلي فقط

NFS (نظام ملفات الشبكة)​

المزايا:

  • يدعم ReadWriteMany
  • قابل للمشاركة بين العقد
  • سهل التكوين

العيوب:

  • أداء محدود
  • نقطة فشل واحدة
  • يتطلب خادم NFS

الاستخدام: ملفات مشتركة، تطبيقات تعاونية

التخزين السحابي (EBS، Azure Disk، GCE PD)​

المزايا:

  • أداء عالي
  • تكامل سحابي أصلي
  • توفير ديناميكي
  • لقطات تلقائية

العيوب:

  • تكلفة حسب الاستخدام
  • الاعتماد على مزود السحابة

الاستخدام: الإنتاج، التطبيقات الحرجة


أفضل الممارسات​

1. استخدام StorageClasses​

يفضل التوفير الديناميكي مع StorageClasses بدلاً من إنشاء PVs يدويًا.

2. اختيار سياسة الاسترداد المناسبة​

  • Retain: للبيانات المهمة
  • Delete: للبيانات المؤقتة

3. الحجم المناسب​

لا تبالغ في التخصيص. ابدأ صغيرًا وزد إذا لزم الأمر (مع allowVolumeExpansion: true).

4. النسخ الاحتياطي​

قم بإعداد نسخ احتياطية منتظمة للبيانات المهمة.

5. المراقبة​

راقب استخدام التخزين لتجنب النفاد.


ملخص​

في هذا الفصل، تعلمت:

PersistentVolume (PV): مورد تخزين على مستوى العنقود
PersistentVolumeClaim (PVC): طلب تخزين من قبل مستخدم
أوضاع الوصول: RWO (عقدة واحدة)، ROX (عدة عقد للقراءة فقط)، RWX (عدة عقد للقراءة والكتابة)
سياسة الاسترداد: Retain (الاحتفاظ) أو Delete (الحذف)
أنواع التخزين: hostPath (تطوير)، NFS (مشترك)، سحابي (إنتاج)
الاستخدام: عبر persistentVolumeClaim في الـ Pods
أفضل الممارسات: StorageClasses، الحجم المناسب، النسخ الاحتياطي


الخطوات التالية​

الفصل 6.3: StorageClasses والتوفير الديناميكي
المختبر 6.2: PersistentVolumes و PVCs


تم إنشاء الفصل في: ديسمبر 2024