الفصل 6.4 - StatefulSets والتخزين الدائم
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم StatefulSets وخصائصها
- نشر التطبيقات stateful مع التخزين الدائم
- فهم الهويات الثابتة لـ Pods
- استخدام volumeClaimTemplates
- فهم الفروقات مع Deployments
- إدارة التوسع المرتب
مقدمة
تعتبر Deployments مثالية للتطبيقات stateless (بدون حالة). بالنسبة للتطبيقات stateful (ذات الحالة) مثل قواعد البيانات، تحتاج إلى StatefulSets.
ما هو StatefulSet؟
يدير StatefulSet عمليات النشر والتوسع لمجموعة من Pods مع:
- هويات ثابتة: أسماء Pods متوقعة (web-0, web-1, web-2)
- تخزين دائم: كل Pod لديه حجمه الخاص
- ترتيب مضمون: نشر وتوسع مرتب
- خدمة headless: خدمة بدون ClusterIP لاكتشاف DNS
الخصائص الرئيسية
1. هويات ثابتة
أسماء الـ Pods:
web-0web-1web-2
الفوائد:
- هوية ثابتة حتى بعد إعادة التشغيل
- DNS ثابت لاكتشاف الخدمة
- تخزين مرتبط بالهوية
2. تخزين دائم فردي
كل Pod لديه حجمه الدائم الخاص الذي يتم إنشاؤه عبر volumeClaimTemplates.
3. ترتيب مضمون
النشر: ترتيب تصاعدي (0, 1, 2)
الحذف: ترتيب تنازلي (2, 1, 0)
التوسع: مرتب
4. خدمة Headless
تسمح خدمة headless (بدون ClusterIP) باكتشاف DNS ثابت.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None # خدمة headless
selector:
app: web
ports:
- port: 80
DNS:
web-0.web-service.default.svc.cluster.localweb-1.web-service.default.svc.cluster.localweb-2.web-service.default.svc.cluster.local
مثال كامل
الخطوة 1: إنشاء الخدمة headless
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None
selector:
app: web
ports:
- port: 80
name: http
الخطوة 2: إنشاء StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web-service" # يجب أن يتطابق مع الخدمة headless
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
name: http
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 10Gi
النتيجة:
- 3 Pods:
web-0,web-1,web-2 - 3 PVCs:
www-web-0,www-web-1,www-web-2 - كل Pod لديه حجمه الخاص
VolumeClaimTemplates
تقوم volumeClaimTemplates بإنشاء PVC تلقائيًا لكل Pod.
الخصائص:
- إنشاء تلقائي لـ PVCs
- الاسم:
{template-name}-{pod-name} - كل Pod لديه PVC خاص به
- يتم حذف PVCs فقط إذا تم حذف الـ Pod
الفروقات: Deployment مقابل StatefulSet
| الخاصية | Deployment | StatefulSet |
|---|---|---|
| الهوية | عشوائية (random-abc123) | ثابتة (web-0, web-1) |
| التخزين | مشترك أو مؤقت | فردي دائم |
| التوسع | عشوائي | ترتيب مضمون |
| الخدمة | ClusterIP عادي | Headless (DNS) |
| حالة الاستخدام | تطبيقات stateless | تطبيقات stateful (DB، إلخ) |
| إعادة التشغيل | اسم جديد | نفس الاسم |
حالات الاستخدام
1. قواعد البيانات
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
template:
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 50Gi
2. التطبيقات ذات الحالة
- أنظمة الملفات الموزعة
- التخزين المؤقت مع البيانات الدائمة
- التطبيقات ذات الهويات الثابتة
3. الخدمات التي تتطلب ترتيب
- تكرار رئيس-تابع
- التطبيقات مع النصاب
- الخدمات مع انتخاب القائد
التوسع
التوسع لأعلى
kubectl scale statefulset web-statefulset --replicas=5
النتيجة: إنشاء web-3 ثم web-4 بالترتيب.
التوسع لأسفل
kubectl scale statefulset web-statefulset --replicas=2
النتيجة: حذف web-2 ثم web-1 بالترتيب التنازلي.
مهم: لا يتم حذف PVCs تلقائيًا. احذفها يدويًا إذا لزم الأمر.
التحديثات
تحديث متدرج
spec:
updateStrategy:
type: RollingUpdate
template:
spec:
containers:
- name: nginx
image: nginx:1.21 # إصدار جديد
العملية:
- تحديث
web-2(الأخير) - تحديث
web-1 - تحديث
web-0(الأول)
عند الحذف
spec:
updateStrategy:
type: OnDelete
العملية: التحديث فقط عند حذف Pod يدويًا.
أوامر مفيدة
الإنشاء والإدارة
# إنشاء StatefulSet
kubectl apply -f statefulset.yaml
# عرض StatefulSets
kubectl get statefulset
kubectl get sts
# عرض Pods
kubectl get pods -l app=web
# التفاصيل
kubectl describe statefulset web-statefulset
التوسع
# زيادة النسخ
kubectl scale statefulset web-statefulset --replicas=5
# تقليل النسخ
kubectl scale statefulset web-statefulset --replicas=2
عرض الحجوم
# عرض PVCs المنشأة
kubectl get pvc
# عرض التفاصيل
kubectl describe pvc www-web-0
أفضل الممارسات
1. الاستخدام للتطبيقات stateful
StatefulSets فقط للتطبيقات ذات الحالة. استخدم Deployments للتطبيقات stateless.
2. خدمة Headless مطلوبة
دائمًا قم بإنشاء خدمة headless لاكتشاف DNS.
3. التخزين المناسب
اختر وضع الوصول الصحيح (RWO لقواعد البيانات).
4. النسخ الاحتياطي
قم بإعداد نسخ احتياطية منتظمة للحجوم.
5. المراقبة
راقب الحالة والأداء لكل Pod.
الملخص
في هذا الفصل، تعلمت:
StatefulSet: يدير التطبيقات stateful مع هويات ثابتة
الخصائص: أسماء متوقعة، حجوم فردية، ترتيب مضمون، خدمة headless
volumeClaimTemplates: إنشاء تلقائي لـ PVCs لكل Pod
حالات الاستخدام: قواعد البيانات، التطبيقات ذات الحالة، الخدمات المرتبة
الفروقات: هوية ثابتة مقابل عشوائية، تخزين فردي مقابل مشترك
التوسع: ترتيب مضمون (تصاعدي للزيادة، تنازلي للتقليل)
التحديثات: RollingUpdate (عكس) أو OnDelete
الخطوات التالية
الوحدة 7: الأحمال المتقدمة (StatefulSets بشكل متعمق، DaemonSets، Jobs)
المختبر 6.4: StatefulSet مع التخزين الدائم
الفصل تم إنشاؤه في: ديسمبر 2024