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

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

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

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

  • إنشاء StatefulSet مع وحدات تخزين دائمة.
  • فهم توفير الوحدات لكل Pod.
  • التحقق من الهوية الثابتة للـ Pods والوحدات.
  • اختبار استمرارية البيانات أثناء عمليات إعادة التشغيل.
  • فهم الفروق بين StatefulSet وDeployment للتخزين.

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

60-75 دقيقة

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

  • تثبيت وتكوين kubectl.
  • عنقود Kubernetes محلية عاملة (minikube أو kind).
  • معرفة بـ StatefulSets والتخزين الدائم (الفصول 6.4 و7.1).

الجزء 1: إعداد StorageClass​

بالنسبة لـ StatefulSet، يحتاج كل Pod إلى وحدته الخاصة من التخزين الدائم. سنستخدم StorageClass للتوفير الديناميكي.

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

قم بإنشاء ملف storageclass-statefulset.yaml:

# storageclass-statefulset.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: statefulset-storage
provisioner: k8s.io/minikube-hostpath # بالنسبة لـ minikube، أو kubernetes.io/no-provisioner لـ kind
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: false

ملاحظة: إذا كنت تستخدم kind أو مجموعة بدون موفر، ستحتاج إلى إنشاء PVs يدويًا. بالنسبة لهذا المختبر، نفترض استخدام minikube.

قم بتطبيق StorageClass:

kubectl apply -f storageclass-statefulset.yaml

الجزء 2: إنشاء StatefulSet مع التخزين​

سنقوم بإنشاء StatefulSet بسيط يخزن البيانات في وحدات تخزين دائمة.

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

قم بإنشاء ملف statefulset-with-storage.yaml:

# statefulset-with-storage.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-app
spec:
serviceName: web-app-service # اسم الخدمة headless (مطلوب لـ StatefulSet)
replicas: 3 # إنشاء 3 Pods
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html # تركيب وحدة التخزين الدائمة
command: ["/bin/sh", "-c"]
args:
- |
echo "Pod $(hostname) - $(date)" > /usr/share/nginx/html/index.html
echo "بيانات دائمة لـ Pod $(hostname)" >> /usr/share/nginx/html/data.txt
nginx -g "daemon off;"
volumeClaimTemplates: # قالب لإنشاء PVC لكل Pod
- metadata:
name: www # اسم الوحدة (سيتم استخدامه في volumeMounts)
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: statefulset-storage # استخدام StorageClass الخاص بنا
resources:
requests:
storage: 100Mi # حجم الوحدة لكل Pod

توضيح:

  • serviceName: web-app-service: يتطلب StatefulSet خدمة headless لاكتشاف DNS.
  • volumeClaimTemplates: ينشئ تلقائيًا PVC لكل Pod في StatefulSet. سيكون لكل Pod وحدته الخاصة من التخزين الدائم.
  • سيتم تسمية الـ Pods بـ web-app-0، web-app-1، web-app-2 بشكل مرتب.

الخطوة 2.2: إنشاء الخدمة Headless​

يتطلب StatefulSet خدمة headless (ClusterIP مع clusterIP: None) لاكتشاف DNS:

# service-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
clusterIP: None # خدمة headless
selector:
app: web-app
ports:
- port: 80
name: web

قم بتطبيق الخدمة:

kubectl apply -f service-headless.yaml

قم بتطبيق StatefulSet:

kubectl apply -f statefulset-with-storage.yaml

الجزء 3: مراقبة التوفير​

الخطوة 3.1: التحقق من إنشاء الـ Pods​

يتم إنشاء الـ Pods في StatefulSet بشكل متسلسل (واحدًا تلو الآخر):

kubectl get pods -l app=web-app -w

يجب أن ترى الـ Pods يتم إنشاؤها بالترتيب: web-app-0، ثم web-app-1، ثم web-app-2.

الخطوة 3.2: التحقق من PVCs التي تم إنشاؤها​

كل Pod لديه PVC خاص به:

kubectl get pvc

يجب أن ترى ثلاثة PVCs:

  • www-web-app-0
  • www-web-app-1
  • www-web-app-2

كل PVC مرتبط بـ PV خاص به:

kubectl get pv

الخطوة 3.3: التحقق من البيانات في كل Pod​

كل Pod لديه بياناته الدائمة الخاصة:

# Pod 0
kubectl exec web-app-0 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt

# Pod 1
kubectl exec web-app-1 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-1 -- cat /usr/share/nginx/html/data.txt

# Pod 2
kubectl exec web-app-2 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-2 -- cat /usr/share/nginx/html/data.txt

يجب أن يعرض كل Pod اسمه الخاص وبياناته الخاصة.


الجزء 4: اختبار الاستمرارية​

الخطوة 4.1: إضافة بيانات فريدة​

أضف بيانات فريدة لكل Pod:

kubectl exec web-app-0 -- sh -c "echo 'بيانات فريدة لـ Pod 0 - $(date)' >> /usr/share/nginx/html/data.txt"
kubectl exec web-app-1 -- sh -c "echo 'بيانات فريدة لـ Pod 1 - $(date)' >> /usr/share/nginx/html/data.txt"
kubectl exec web-app-2 -- sh -c "echo 'بيانات فريدة لـ Pod 2 - $(date)' >> /usr/share/nginx/html/data.txt"

تحقق من البيانات:

kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt

الخطوة 4.2: حذف Pod​

احذف Pod لاختبار الاستمرارية:

kubectl delete pod web-app-0

سيقوم StatefulSet بإعادة إنشاء Pod تلقائيًا بنفس الاسم (web-app-0).

انتظر حتى يصبح الـ Pod الجديد في حالة Running:

kubectl get pods -l app=web-app

الخطوة 4.3: التحقق من الاستمرارية​

تحقق من أن البيانات لا تزال موجودة بعد إعادة التشغيل:

kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt

يجب أن ترى جميع البيانات السابقة، بما في ذلك "بيانات فريدة لـ Pod 0"، مما يثبت أن وحدة التخزين الدائمة قد تم تركيبها بنفس البيانات.


الجزء 5: توسيع StatefulSet​

الخطوة 5.1: زيادة عدد النسخ​

قم بزيادة عدد الـ Pods:

kubectl scale statefulset web-app --replicas=5

تحقق من إنشاء Pods وPVCs جديدة:

kubectl get pods -l app=web-app
kubectl get pvc

يجب أن ترى web-app-3 وweb-app-4 مع PVCs الخاصة بهم.

الخطوة 5.2: تقليل عدد النسخ​

قم بتقليل عدد الـ Pods:

kubectl scale statefulset web-app --replicas=2

تحقق من أن الـ Pods يتم حذفها بالترتيب العكسي (من الأكبر إلى الأصغر):

kubectl get pods -l app=web-app -w

مهم: لا يتم حذف PVCs تلقائيًا. تحقق:

kubectl get pvc

PVCs الخاصة بالـ Pods المحذوفة (www-web-app-2، www-web-app-3، www-web-app-4) لا تزال موجودة، مما يحافظ على البيانات.


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

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

kubectl delete statefulset web-app
kubectl delete service web-app-service
kubectl delete pvc -l app=web-app # حذف جميع PVCs الخاصة بـ StatefulSet
# سيتم حذف PVs تلقائيًا إذا كانت reclaimPolicy: Delete
kubectl delete -f storageclass-statefulset.yaml

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

في هذا المختبر، استكشفت استخدام StatefulSets مع التخزين الدائم. تعلمت كيفية إنشاء StatefulSet مع volumeClaimTemplates، ومراقبة التوفير المتسلسل للـ Pods والوحدات، واختبار استمرارية البيانات أثناء عمليات إعادة التشغيل، وفهم سلوك التوسيع مع الوحدات الدائمة.


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

هذه الوحدة حول التخزين الآن مكتملة. يمكنك الانتقال إلى الوحدة 7 حول الأحمال المتقدمة.

الوحدة 7: الأحمال المتقدمة


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