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

الفصل 6.3 - فئات التخزين والتوفير الديناميكي

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

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

  • فهم ما هي فئة التخزين
  • تكوين التوفير الديناميكي
  • إنشاء واستخدام فئات التخزين
  • فهم المزودين المختلفين
  • اختيار فئة التخزين المناسبة حسب حالة الاستخدام
  • تكوين توسيع الأحجام

المقدمة​

إن إنشاء PersistentVolumes يدويًا لكل طلب تخزين أمر مرهق. تتيح فئات التخزين التوفير الديناميكي: يقوم Kubernetes بإنشاء PV تلقائيًا عند إنشاء PVC.


ما هي فئة التخزين؟​

تصف فئة التخزين فئات التخزين المتاحة وتتيح التوفير الديناميكي لـ PersistentVolumes. تحدد:

  • المزود (كيفية إنشاء الحجم)
  • المعلمات (نوع التخزين، IOPS، إلخ.)
  • سياسة الاسترداد الافتراضية
  • إذا كان توسيع الحجم مسموحًا به

إنشاء فئة التخزين​

مثال: فئة التخزين AWS EBS​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

المكونات:

  • name: اسم فئة التخزين
  • provisioner: المكون الإضافي الذي ينشئ الحجم
  • parameters: معلمات خاصة بالمزود
  • reclaimPolicy: Retain أو Delete (افتراضي)
  • allowVolumeExpansion: يسمح بتوسيع الحجم
  • volumeBindingMode: Immediate أو WaitForFirstConsumer

المزودون​

مزودون السحابة​

AWS EBS​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aws-ebs-gp3
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
kmsKeyId: "arn:aws:kms:..."

Azure Disk​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-disk-ssd
provisioner: kubernetes.io/azure-disk
parameters:
storageaccounttype: Premium_LRS
kind: managed

GCE Persistent Disk​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gce-pd-ssd
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
replication-type: regional-pd

المزودون المحليون​

التخزين المحلي​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

NFS​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: example.com/nfs
parameters:
server: nfs-server.example.com
path: /exports

التوفير الديناميكي​

إنشاء PVC مع فئة التخزين​

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

العملية:

النتيجة: يقوم Kubernetes بإنشاء PV تلقائيًا مطابق لـ PVC.


أوضاع ربط الحجم​

Immediate​

يتم إنشاء PV وربطه فورًا عند إنشاء PVC.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate

المزايا:

  • PVC متاح فورًا
  • لا يوجد انتظار

العيوب:

  • يتم إنشاء الحجم حتى لو لم يُستخدم
  • قد يتم إنشاء الأحجام على العقدة الخاطئة

WaitForFirstConsumer​

يتم إنشاء PV فقط عندما يستخدم Pod الـ PVC.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer

المزايا:

  • يتم إنشاء الحجم على العقدة الصحيحة
  • تجنب الأحجام غير المستخدمة

العيوب:

  • تأخير في التركيب الأول

توسيع الأحجام​

تفعيل التوسيع​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true

توسيع حجم​

  1. تعديل PVC لطلب المزيد من التخزين:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
  1. التحقق من التوسيع:
kubectl get pvc pvc-dynamic

ملاحظة: التوسيع مدعوم فقط إذا:

  • allowVolumeExpansion: true في فئة التخزين
  • يدعم المزود التوسيع
  • يدعم نظام الملفات التوسيع (ext4، xfs)

مثال كامل​

الخطوة 1: إنشاء فئة التخزين​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: production-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
storageClassName: production-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi

الخطوة 3: الاستخدام في نشر​

apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data-pvc

فئة التخزين الافتراضية​

تعيين فئة تخزين افتراضية​

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: default-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3

النتيجة: تستخدم PVCs بدون storageClassName هذه فئة التخزين.

PVC بدون فئة تخزين​

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# لا يوجد storageClassName = يستخدم فئة التخزين الافتراضية

الأوامر المفيدة​

عرض فئات التخزين​

# قائمة فئات التخزين
kubectl get storageclass
kubectl get sc

# تفاصيل فئة التخزين
kubectl describe storageclass fast-ssd

عرض PVCs و PVs​

# قائمة PVCs
kubectl get pvc

# عرض PVs التي تم إنشاؤها ديناميكيًا
kubectl get pv

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

توسيع الحجم​

# توسيع PVC
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

# التحقق من الحالة
kubectl get pvc pvc-dynamic

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

1. استخدام التوفير الديناميكي​

تفضيل فئات التخزين على التوفير اليدوي للمرونة.

2. اختيار وضع ربط الحجم المناسب​

  • Immediate: للأحجام المشتركة (NFS)
  • WaitForFirstConsumer: للأحجام المحلية (EBS، Azure Disk)

3. تفعيل التوسيع​

تفعيل allowVolumeExpansion: true للسماح بالتوسيع دون إعادة الإنشاء.

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

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

5. المراقبة​

مراقبة استخدام التخزين والتكاليف.


الملخص​

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

فئة التخزين: تصف فئات التخزين وتتيح التوفير الديناميكي
التوفير الديناميكي: إنشاء تلقائي لـ PVs عند إنشاء PVC
المزودون: مكونات إضافية تنشئ الأحجام (EBS، Azure Disk، GCE PD، NFS، إلخ.)
أوضاع ربط الحجم: Immediate (فوري) أو WaitForFirstConsumer (انتظار الـ Pod)
التوسيع: يسمح بتوسيع حجم موجود
فئة التخزين الافتراضية: تستخدم عندما لا يتم تحديد storageClassName
المزايا: المرونة، الأتمتة، تقليل الإدارة اليدوية


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

الفصل 6.4: StatefulSets مع التخزين المستمر
المختبر 6.3: فئات التخزين والتوفير الديناميكي


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