الـ Deployment ممتاز للتطبيقات بلا حالة، لكن ماذا عن قواعد البيانات وأنظمة التخزين التي تحتاج هويّةً وتخزينًا ثابتين؟ هنا يأتي الـ StatefulSet. درس متقدّم يبني على الـ Deployment.
المشكلة: التطبيقات ذات الحالة
في الـ Deployment، الـ pods متطابقة وقابلة للاستبدال بلا تمييز — وهذا مثاليّ لخادم ويب. لكنّ قاعدة بيانات موزّعة تحتاج أن يعرف كل عضو هويّته (مَن الأساسي؟)، وأن يحتفظ ببياناته حتى لو أُعيد تشغيله. الـ pods المؤقّتة المجهولة لا تكفي هنا.
ما هو الـ StatefulSet؟
الـ StatefulSet كائن يدير التطبيقات ذات الحالة (Stateful) بثلاث ضمانات لا يقدّمها الـ Deployment:
- هويّة شبكية ثابتة: يحصل كل pod على اسم ترتيبيّ مستقرّ (
db-0،db-1،db-2) يبقى ثابتًا عبر إعادة التشغيل. - تخزين مستقرّ لكل نسخة: يرتبط كل pod بتخزينه الخاصّ الذي يتبعه، فلا تضيع بياناته عند إعادة الجدولة.
- ترتيب في النشر والتوسيع: تُنشأ الـ pods وتُحذف بترتيب متوقّع (
0ثم1ثم2)، وهو ما تحتاجه أنظمة كثيرة للتهيئة الصحيحة.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
spec:
serviceName: db
replicas: 3
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: db
image: postgres:17
StatefulSet مقابل Deployment
| Deployment | StatefulSet | |
|---|---|---|
| الهويّة | pods مجهولة متطابقة | أسماء ترتيبية ثابتة |
| التخزين | مشترك/عابر عادةً | مخصّص ومستقرّ لكل نسخة |
| الترتيب | لا يهمّ | مضمون |
| الاستخدام | تطبيقات بلا حالة | قواعد بيانات، أنظمة موزّعة |
متى تستخدمه؟
استخدم StatefulSet فقط حين تحتاج هويّةً أو تخزينًا مستقرًّا (قواعد بيانات، طوابير، أنظمة تجميع). للتطبيقات بلا حالة، يبقى الـ Deployment أبسط وأنسب.
الخطوات التالية
يعتمد التخزين المستقرّ على الأحجام الدائمة (Persistent Volumes) — وهي الموضوع التالي. راجع الفرق مع الـ Deployment.