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

المختبر 6.3 - StorageClasses والتزويد الديناميكي

أهداف المختبر​

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

  • فهم مفهوم StorageClass.
  • إنشاء StorageClass مخصص.
  • استخدام التزويد الديناميكي مع PVC.
  • فهم الأنواع المختلفة من المزودين.
  • التحقق من التزويد التلقائي لـ PVs.

المدة المقدرة​

45-60 دقيقة

المتطلبات الأساسية​

  • تثبيت وتكوين kubectl.
  • تشغيل عنقود Kubernetes محلية (minikube أو kind).
  • معرفة حول StorageClasses (الفصل 6.3).

الجزء 1: فهم StorageClasses​

تعرف StorageClass "نوع" التخزين بخصائص (مزود، معلمات، مطالبة). يسمح بالتزويد الديناميكي لـ PersistentVolumes.

الخطوة 1.1: سرد StorageClasses الموجودة​

تحقق من StorageClasses المتاحة في مجموعتك:

kubectl get storageclass
# أو
kubectl get sc

على minikube، يجب أن ترى StorageClass افتراضي (مثل standard أو hostpath). على kind، قد يكون هناك standard أو لا يوجد.

تحقق من تفاصيل StorageClass:

kubectl describe storageclass <nom-de-la-storageclass>

الجزء 2: إنشاء StorageClass مخصص​

بالنسبة لمجموعة محلية، سنقوم بإنشاء StorageClass يستخدم hostPath كمزود (عبر مزود محلي أو يدوي).

الخطوة 2.1: إنشاء StorageClass​

أنشئ ملف storageclass-local.yaml:

# storageclass-local.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner # لا يوجد تزويد تلقائي لـ hostPath
volumeBindingMode: WaitForFirstConsumer # انتظر حتى يستخدم Pod الـ PVC قبل إنشاء الـ PV
allowVolumeExpansion: false # لا يسمح بتوسيع الحجم

توضيح:

  • provisioner: kubernetes.io/no-provisioner: يشير إلى عدم وجود تزويد تلقائي. بالنسبة لمجموعة محلية مع hostPath، يجب علينا إنشاء PVs يدويًا، لكن StorageClass يسمح بتجميعها.
  • volumeBindingMode: WaitForFirstConsumer: ينتظر الـ PVC حتى يتم إنشاء Pod قبل ربط الـ PV. هذا يسمح للجدولة باختيار العقدة الصحيحة.
  • allowVolumeExpansion: false: لا يمكن توسيع الأحجام بعد الإنشاء.

قم بتطبيق StorageClass:

kubectl apply -f storageclass-local.yaml

تحقق من أنه تم إنشاؤه:

kubectl get storageclass local-storage

الجزء 3: التزويد الديناميكي (محاكاة)​

للتزويد الديناميكي الحقيقي، ستحتاج إلى مزود مثل:

  • kubernetes.io/aws-ebs (AWS)
  • kubernetes.io/azure-disk (Azure)
  • kubernetes.io/gce-pd (GCP)
  • kubernetes.io/cinder (OpenStack)

على minikube، يمكنك استخدام المزود k8s.io/minikube-hostpath إذا كان متاحًا.

الخطوة 3.1: إنشاء StorageClass مع التزويد الديناميكي (minikube)​

إذا كنت تستخدم minikube، أنشئ StorageClass يستخدم المزود minikube:

# storageclass-minikube.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minikube-dynamic
provisioner: k8s.io/minikube-hostpath # مزود minikube
volumeBindingMode: Immediate # الربط فورًا
reclaimPolicy: Delete # حذف الـ PV عند حذف الـ PVC
allowVolumeExpansion: true # السماح بالتوسيع

قم بتطبيقها:

kubectl apply -f storageclass-minikube.yaml

الخطوة 3.2: إنشاء PVC مع StorageClass​

أنشئ ملف pvc-dynamic.yaml:

# pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: minikube-dynamic # يستخدم StorageClass مع التزويد الديناميكي
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi

قم بتطبيق الـ PVC:

kubectl apply -f pvc-dynamic.yaml

تحقق من أن الـ PVC تم إنشاؤه وأنه تم تزويد PV تلقائيًا:

kubectl get pvc pvc-dynamic
kubectl get pv

يجب أن ترى PV جديد تم إنشاؤه تلقائيًا بحالة Bound ومرتبط بالـ PVC.


الجزء 4: استخدام الـ PVC الديناميكي​

أنشئ Pod يستخدم الـ PVC الديناميكي:

# pod-dynamic-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-dynamic-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'بيانات في حجم ديناميكي - $(date)' > /data/dynamic-data.txt && cat /data/dynamic-data.txt && sleep 3600"]
volumeMounts:
- name: dynamic-storage
mountPath: /data
volumes:
- name: dynamic-storage
persistentVolumeClaim:
claimName: pvc-dynamic

قم بتطبيق الـ Pod:

kubectl apply -f pod-dynamic-pvc.yaml

تحقق من السجلات:

kubectl logs pod-dynamic-pvc

الجزء 5: توسيع الحجم (اختياري)​

إذا كان allowVolumeExpansion: true، يمكنك توسيع PVC بعد إنشائه.

عدل الـ PVC لطلب مساحة أكبر:

kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"200Mi"}}}}'

تحقق من أن الطلب قد تم تحديثه:

kubectl get pvc pvc-dynamic

ملاحظة: يعتمد التوسيع الفعلي للحجم على المزود ونوع التخزين الأساسي.


الجزء 6: التنظيف​

احذف الموارد التي تم إنشاؤها:

kubectl delete pod pod-dynamic-pvc
kubectl delete -f pvc-dynamic.yaml
# سيتم حذف الـ PV تلقائيًا إذا كانت reclaimPolicy: Delete
kubectl delete -f storageclass-minikube.yaml
kubectl delete -f storageclass-local.yaml

ملخص المختبر​

في هذا المختبر، استكشفت StorageClasses و التزويد الديناميكي. تعلمت كيفية إنشاء StorageClasses مخصصة، واستخدام التزويد التلقائي لـ PVs عبر PVCs، وفهم أوضاع الربط المختلفة وسياسات المطالبة.


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

سيعرض لك المختبر الأخير من هذه الوحدة كيفية استخدام PersistentVolumes مع StatefulSets للتطبيقات ذات الحالة.

المختبر 6.4: StatefulSet مع التخزين الدائم


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