
🍥 تفاوت StatefulSets و DaemonSets در Kubernetes — راهنمای کامل برای درک بهتر این مفاهیم مهم
در چند مقاله ی قبلی به بررسی این که Kubernetes چیست و چه کاربردی دارد پرداختیم. در این مقاله می خوایم خیلی ساده به تفاوت StatefulSets و DaemonSets در Kubernetes بپردازیم. در دنیای Kubernetes، وقتی صحبت از اجرای پادها (Pods) میشه، اکثر افراد اول با Deployments
آشنا میشن؛ ابزاری برای اجرای چندین پاد یکسان در کلاستر. ولی وقتی نیاز به رفتارهای خاصتری داریم—مثل اجرای یک پاد روی هر نود یا مدیریت پادهایی با هویت پایدار—اینجاست که دو ابزار قدرتمند دیگه وارد صحنه میشن: StatefulSets و DaemonSets. در این مقاله، با زبانی ساده و کاربردی بهت توضیح میدم که این دو نوع Controller چی هستن، چه تفاوتهایی با هم دارن، و کی باید از هرکدوم استفاده کنید.
🟨 StatefulSet چیست؟
StatefulSet یکی از کنترلرهای Kubernetes است که برای اجرای برنامههایی با حالت (stateful) به کار میرود. به عبارت دیگر، اگر برنامه شما نیاز دارد که شناسه یکتا، دادههای پایدار و ترتیب راهاندازی یا حذف خاص داشته باشد، باید از StatefulSet استفاده کنید.
Stateful Sets: اجرای پادهای Stateful با هویت پایدار
به طور پیشفرض، پادهایی که با Deployment
اجرا میشن، هویتی ندارن. یعنی اسمشون داینامیکه و اگر پاد ریاستارت بشه، ممکنه با اسم و وضعیت جدیدی بیاد بالا. این برای اپلیکیشنهایی که نیاز به حفظ حالت (state) یا داده دارن، مناسب نیست.
✅ اینجاست که StatefulSets به کمک میان.
StatefulSet نوع خاصی از workload controller هست که برای اجرای اپلیکیشنهایی طراحی شده که:
- نیاز به ذخیرهسازی پایدار دارن (مثل دیتابیسها)
- ترتیب اجرا و توقفشون اهمیت داره
- هر پاد باید یک هویت خاص داشته باشه (مثل اسم ثابت یا hostname خاص)
📦 ویژگیهای کلیدی StatefulSet:
هر پاد یک نام ثابت داره (مثلاً
mysql-0
,mysql-1
,mysql-2
)- به هر پاد یک Persistent Volume خاص متصل میشه که حتی بعد از حذف پاد هم باقی میمونه
- پادها به ترتیب اجرا و ترتیب حذف میشن
- برای دیتابیسهایی مثل MySQL, PostgreSQL, MongoDB و اپلیکیشنهای Stateful عالیه
🧪 مثال کاربردی:
اگر بخوای یک کلاستر MongoDB با ۳ نود راهاندازی کنی که هرکدوم نقش خاصی دارن و باید دیتاهاشون حفظ بشه، باید از StatefulSet استفاده کنی.
🟩 DaemonSet چیست؟
DaemonSet نیز یکی از کنترلرهای Kubernetes است که برای اجرای یک پاد روی همه نودها (یا روی نودهای خاص) بهکار میرود. این ابزار برای برنامههایی طراحی شده که باید روی هر نود در کلاستر اجرا شوند، مثل مانیتورینگ، لاگگیری یا مدیریت شبکه.
🔁 DaemonSets: اجرای یک پاد روی همه نودها
تصور کن میخوای روی تمام نودهای کلاستر یک ابزار لاگگیری یا مانیتورینگ نصب کنی. مثلاً بخوای روی همه نودها Prometheus Node Exporter یا یک Log Collector مثل Fluentd اجرا بشه.
✅ اینجاست که DaemonSet وارد عمل میشه.
DaemonSet تضمین میکنه که یک نسخه از یک پاد مشخص، روی هر نود (Node) کلاستر اجرا بشه. اگر نود جدیدی به کلاستر اضافه بشه، پاد مربوطه بهطور خودکار روی اون هم اجرا میشه.
⚙️ ویژگیهای کلیدی DaemonSet:
- اجرای یک پاد در هر نود (بهصورت خودکار)
- مفید برای ابزارهای مانیتورینگ، لاگگیری، امنیت و شبکه
- به محض حذف یک نود، پاد اون هم از بین میره
- به محض اضافه شدن نود جدید، پاد روی اون دیپلوی میشه
🧪 مثال کاربردی:
فرض کن روی همه نودها میخوای Filebeat
برای جمعآوری لاگها نصب کنی. فقط کافیه یک DaemonSet بسازی و Kubernetes خودش روی هر نود یک نسخه از Filebeat اجرا میکنه.
🆚 تفاوت DaemonSet و StatefulSet در یک نگاه
ویژگی | StatefulSet | DaemonSet |
---|---|---|
نوع اپلیکیشن | Stateful (با داده پایدار) | Agentها و سرویسهای سیستمی |
هویت پاد | ثابت (مثلاً pod-0, pod-1) | نه، فقط یک پاد روی هر نود |
حجم ذخیرهسازی | Persistent Volume اختصاصی برای هر پاد | معمولاً نیاز به Volume نداره |
ترتیب اجرا | داره | نداره |
تعداد پادها | مشخص و قابل افزایش با اسکیل | همیشه یکی در هر نود |
موارد استفاده | دیتابیسها، اپهای حساس به ترتیب | مانیتورینگ، لاگگیری، آنتیویروس |
🧠 جمعبندی
- از StatefulSet استفاده کن وقتی به پادهایی با هویت خاص، حجم دائمی و ترتیب اجرا نیاز داری.
- از DaemonSet استفاده کن وقتی میخوای روی همه نودها یک ابزار یا سرویس خاص رو اجرا کنی.
اگر در حال طراحی یک سیستم حرفهای با Kubernetes هستی، بدون درک درست از این دو Controller نمیتونی زیرساخت پایداری بسازی.
منابع
https://semaphore.io/blog/replicaset-statefulset-daemonset-deployments
https://medium.com/@saeedsaleem.04/deployments-statefulsets-and-daemonsets