اگر تازه وارد Kubernetes شده باشی یا حتی مدتی با آن کار کرده باشی، خیلی زود با مفهومی به نام Pod روبه رو می شوی. اینجاست که سوال Kubernetes Pod مطرح می شود. Kubernetes Pod کوچک ترین واحد اجرایی در این پلتفرم است و تقریبا همه چیز از همین جا شروع می شود. در این مقاله می خواهیم دقیق و کاربردی بررسی کنیم Pod چیست، چرا وجود دارد و چرخه حیات آن چگونه مدیریت می شود.

Kubernetes Pod چیست

Kubernetes Pod کوچک ترین واحدی است که Kubernetes آن را اجرا و مدیریت می کند. Pod می تواند شامل یک یا چند کانتینر باشد که با هم اجرا می شوند و منابع مشترک دارند. این کانتینرها معمولا به شدت به هم وابسته هستند و قرار است کنار هم یک وظیفه مشخص را انجام دهند. Kubernetes Pod در واقع لایه ای بالاتر از کانتینر است و Kubernetes مستقیما با Pod کار می کند، نه با کانتینر تکی.

چرا Kubernetes به Pod نیاز دارد

ممکن است بپرسی چرا Kubernetes مستقیما کانتینرها را مدیریت نمی کند. دلیلش این است که بعضی کانتینرها باید همیشه کنار هم باشند. مثلا یک کانتینر اصلی و یک کانتینر کمکی برای لاگ گیری یا مانیتورینگ. Pod این امکان را می دهد که این کانتینرها به عنوان یک واحد دیده شوند، با هم زمان بندی شوند و با هم از بین بروند.

Pod چه منابعی را به اشتراک می گذارد

کانتینرهای داخل یک Pod منابع مهمی را به اشتراک می گذارند. IP یکسان دارند، می توانند از طریق localhost با هم ارتباط برقرار کنند و Volume های مشترک دارند. این اشتراک باعث می شود ارتباط بین کانتینرها ساده و سریع باشد. البته همین موضوع باعث می شود Pod ها برای اجرای طولانی مدت و Stateful به تنهایی مناسب نباشند.

Pod چگونه ایجاد می شود

به ندرت Pod به صورت مستقیم ساخته می شود. معمولا Pod ها توسط آبجکت های بالادستی مثل Deployment یا Job ایجاد می شوند. این آبجکت ها وضعیت مطلوب را تعریف می کنند و Kubernetes Pod ها را بر اساس آن می سازد. اگر Pod به صورت مستقیم ساخته شود و از بین برود، Kubernetes آن را دوباره ایجاد نمی کند. به همین دلیل در محیط واقعی، Pod مستقیم کمتر استفاده می شود.

چرخه حیات Pod از ابتدا تا حذف

چرخه حیات Pod چند مرحله مشخص دارد. ابتدا Pod ساخته می شود و وارد وضعیت Pending می شود. در این مرحله Kubernetes دنبال Node مناسب می گردد. بعد از زمان بندی، Pod وارد حالت Running می شود. اگر کانتینرها با موفقیت اجرا شوند، Pod فعال است. در نهایت، Pod ممکن است وارد حالت Succeeded یا Failed شود و در صورت نیاز حذف گردد.

وضعیت های مختلف Pod

Pod می تواند وضعیت های مختلفی داشته باشد. Pending یعنی هنوز روی Node اجرا نشده است. Running یعنی حداقل یک کانتینر در حال اجراست. Succeeded یعنی همه کانتینرها با موفقیت تمام شده اند. Failed یعنی حداقل یکی از کانتینرها با خطا متوقف شده است. Unknown هم زمانی اتفاق می افتد که Kubernetes نتواند وضعیت Pod را تشخیص دهد.

Pod و Restart کانتینرها

اگر یکی از کانتینرهای داخل Pod از کار بیفتد، بسته به تنظیمات، Kubernetes می تواند آن را دوباره اجرا کند. این رفتار به Restart Policy بستگی دارد. نکته مهم این است که Restart شدن کانتینر به معنی ایجاد Pod جدید نیست. Pod همان Pod قبلی باقی می ماند، فقط کانتینر داخل آن دوباره اجرا می شود.

تفاوت Pod با کانتینر

کانتینر واحد اجرای برنامه است، اما Pod واحد مدیریت Kubernetes است. یک Pod می تواند چند کانتینر داشته باشد، اما هر کانتینر فقط در یک Pod اجرا می شود. Kubernetes Pod مفهوم شبکه، ذخیره سازی و زمان بندی را به کانتینر اضافه می کند. به همین دلیل در معماری Kubernetes همیشه با Pod فکر می کنیم، نه کانتینر تنها.

ارتباط Pod با Node

هر Pod روی یک Node اجرا می شود و نمی تواند بین Node ها جابجا شود. اگر Node از دسترس خارج شود، Pod هم از بین می رود. Kubernetes معمولا Pod جدیدی روی Node دیگر ایجاد می کند، اما این یک Pod جدید است، نه همان قبلی. این نکته برای درک Stateless بودن Pod بسیار مهم است.

Pod و Volume ها

Pod می تواند از Volume ها برای ذخیره داده استفاده کند. Volume ها عمرشان به Pod وابسته است. یعنی وقتی Pod حذف شود، Volume هم از بین می رود، مگر اینکه نوع خاصی از ذخیره سازی استفاده شود. Volume ها برای اشتراک داده بین کانتینرهای داخل Pod بسیار کاربردی هستند.

مدیریت Pod با Label و Selector

Label ها نقش مهمی در مدیریت Pod ها دارند. با Label می توان Pod ها را دسته بندی کرد. Service و Deployment از Selector برای انتخاب Pod ها استفاده می کنند. اگر Label ها درست طراحی نشوند، ارتباط بین اجزای سیستم به هم می ریزد. این موضوع یکی از خطاهای رایج در Kubernetes است.

Pod در مقیاس پذیری چه نقشی دارد

وقتی تعداد Replica ها افزایش پیدا می کند، در واقع Pod های بیشتری ساخته می شوند. Kubernetes Pod واحد اصلی مقیاس پذیری است. هر Pod یک نمونه از اپلیکیشن را اجرا می کند. افزایش یا کاهش بار کاری یعنی اضافه یا حذف Pod ها، نه تغییر داخل یک Pod.

Pod و خودترمیمی در Kubernetes

اگر یک Pod به هر دلیلی از بین برود، Kubernetes به صورت مستقیم آن را جایگزین نمی کند. این کار توسط Deployment یا ReplicaSet انجام می شود. Kubernetes Pod به تنهایی خودترمیم نیست، اما در کنار آبجکت های دیگر بخشی از سیستم خودترمیم Kubernetes می شود.

چه زمانی نباید Pod مستقیم ساخت

ساخت مستقیم Pod برای تست یا آزمایش ممکن است مفید باشد، اما برای محیط عملیاتی توصیه نمی شود. چون اگر Pod حذف شود، چیزی آن را جایگزین نمی کند. در پروژه های واقعی همیشه بهتر است از Deployment، StatefulSet یا Job استفاده شود تا مدیریت Pod ها خودکار باشد.

Pod در معماری واقعی Kubernetes

در معماری واقعی، Pod ها دائما ساخته و حذف می شوند. نباید به Pod به چشم یک موجود دائمی نگاه کرد. Pod یک واحد موقتی است که برای اجرای اپلیکیشن ساخته می شود. اگر این نگاه را بپذیری، طراحی معماری بسیار ساده تر و اصولی تر می شود.

جمع بندی

Kubernetes Pod پایه و اساس اجرای اپلیکیشن در Kubernetes است. همه چیز از Pod شروع می شود و به Pod ختم می شود. اگر بدانی Kubernetes Pod چیست و چرخه حیات آن چگونه کار می کند، درک بقیه مفاهیم Kubernetes برایت خیلی راحت تر خواهد شد. شناخت Pod یعنی فهمیدن قلب تپنده Kubernetes و این قدمی مهم در مسیر حرفه ای شدن است.