المختبر 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-0www-web-app-1www-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