الفصل 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