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

الفصل 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-0
  • web-1
  • web-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.local
  • web-1.web-service.default.svc.cluster.local
  • web-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​

الخاصيةDeploymentStatefulSet
الهويةعشوائية (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 # إصدار جديد

العملية:

  1. تحديث web-2 (الأخير)
  2. تحديث web-1
  3. تحديث 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