الفصل 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
توسيع حجم
- تعديل PVC لطلب المزيد من التخزين:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
- التحقق من التوسيع:
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