در دنیای کوبرنتیز مفاهیم و جزئیات بسیار زیادی وجود دارد که نیاز است بهصورت جداگانه با تکتک آنها آشنا شویم. پاد یا Pod یکی از آن مفاهیم و بخشهای اصلی در کوبرنتیز است که با فهم درست از آن میتوانیم در هنگام استفاده، به صورت بسیار مؤثری از آن بهره ببریم.
پادها در واقع کوچکترین واحدهای اجرایی در کوبرنتیز هستند که شامل یک یا چند کانتینر میشوند. هر کدام از این کانتینرها میتوانند حامل یک برنامه یا باینری اجرایی باشند.
در این مطلب از وبلاگ همروش قصد داریم با چیستی پاد به صورت عمیق آشنا شده و همچنین شیوه کاری و ضرورت وجود آن را درک کنیم.
پاد (Pod) چیست؟
پادها بیدوام (ephemeral) هستند به این معنی که اگر یک پاد با خطا یا مشکل روبهرو شود، کوبرنتیز آن را متوقف میکند و یک نسخه جدید از آن پاد را ایجاد میکند تا همه چیز بهصورت عادی به کار خود ادامه دهد.
در یک طبقهبندی دیگر میتوان پادها را نوعی از شئ یا Object در محیط کوبرنتیز دانست. پادها در اجرا کردن کانتینرها در کلاستر کوبرنتیز نقش حیاتی را ایفا میکند.
کوبرنتیز از پادها برای اجرا کردن یک نمونه از اپلیکیشن استفاده میکند و در واقع هر پاد نماینده یک نمونه از اپلیکیشن است، به همین دلیل اگر قصد داشته باشیم که اپلیکیشنمان را بهصورت افقی مقیاسدهی کنیم میتوانیم نمونه پادهای جدیدی را به آن اضافه نماییم.
هر پاد میتواند حاوی یک یا چندین کانتینر (به شکل گروهی) باشد. منابعی نیز که در هر پاد وجود دارد میتواند در بین این کانتینرها به اشتراک گذاشته شود (منابعی مانند حافظه ذخیرهسازی، شبکه، فضانامها).
حال برای اینکه بهصورت بهتری با نقش پاد و ارتباط آن با دیگر بخشهای کوبرنتیز را درک کنید، بیایید مرزبندی میان پادها، با کانتینرها، نودها و کلاسترها را مشخص کنیم.
رابطه پادها با کانتینرها، نودها و کلاسترها در محیط کوبرنتیز
یکی از کلیدیترین نقش پادها در محیط کوبرنتیز این است که یک ارتباط را با مفاهیم بالاتر از خود ایجاد کند. به همین دلیل نیاز است که شیوه تعامل پادها با دیگر بخشهای کلیدی در کوبرنتیز را بهخوبی درک کنیم.
رابطه پاد با کانتینر
کانتینر شامل تمام کتابخانهها و ملزوماتی میشود که برای اجرای اپلیکیشن لازم است. از طرفی دیگر پادها در این پروسه به کوبرنتیز کمک میکنند تا با ایجاد محیطی یکپارچه، کانتینرهای مربوط به یک اپلیکیشن را مدیریت کند.
رابطه پاد با Node
در کوبرنتیز هر نود در واقع یک ماشین مجازی است که مسئول میزبانی از پادها را بر عهده دارد.
در حالی که هر پاد برای اجرا شدن به یک Node نیاز دارد اما تمام نودها مسئولیت میزبانی پادها را بر عهده نمیگیرند. برای مثال Master Node وظیفه کنترل کردن سازگاری پاد با نود (Pod Scheduling) را دارد اما این Worker Node است که از پادها میزبانی میکند.
رابطه پاد با کلاستر
کلاستر در کوبرنتیز به گروهی از نودها اطلاق میشود (در این نودها باید حتما یک Master Node وجود داشته باشد). کلاسترها کمک میکنند تا پادها بتوانند با نودهایی که از پیکربندی و سیستم عاملهای متفاوتی استفاده میکنند بهخوبی تعامل برقرار کرده و ناسازگاری به وجود نیاید.
در تصویر زیر میتوانید سلسله مراتب تمام این موارد را بهخوبی مشاهده کنید:
انواع پاد
پادها براساس تعداد کانتینری که در خود ذخیره میکنند به دو نوع Single-Container و Multi-Container تقسیم میشوند. در زیر به صورت خلاصه به هر کدام از این دو مورد خواهیم پرداخت:
تک کانتینر یا Single-Container
پادها در کوبرنتیز معمولا تنها یک کانتینر را در خود قرار میدهند (کانتینری که تمام نیازمندیها برای اجرا اپلیکیشن را در خود نگهداری میکند).
این دست از پادها فرایند ایجاد و پیکربندی بسیار سادهای دارند و به کوبرنتیز این قابلیت را میدهد که بهصورت غیر مستقیم کانتینرها را کنترل کند.
چند کانتینر یا Multi-Container
پادها در این حالت چندین کانتینر را که برای ارائه یک هدف یا سرویس استفاده میشوند، میزبانی میکنند. در این حالت کانتینرها میتوانند از طریق یک شبکه با همدیگر ارتباط برقرار کنند و منابع را به اشتراک بگذارند.
از آنجایی که تمام این کانتینرها در یک پاد قرار میگیرند، کوبرنتیز با آنها به عنوان یک واحد مشترک تعامل برقرار میکند. این موضوع منجر میشود تا فرایند مدیریتی سادهتر باشد.
اجزا و چگونگی کار پادها
پادها براساس یکسری از قواعد که در کلاستر کوبرنتیز تعیین میشود عمل میکنند. همچنین پیکربندیهای مربوط به پادها در زمان ایجادشان تعیین میشود. در ادامه به صورت مرحله به مرحله با شیوه کار کردن پادها آشنا خواهیم شد.
چرخه کاری
چرخه کاری و زندگی هر پاد براساس قصد و هدفی که در کلاستر کوبرنتیز تعریف شده پیش میرود. همچنین این موضوع به شئ یا Objectیی که باعث بوجود آوردن پاد میشود نیز ربط پیدا میکند.
برای مثال Objectهایی مانند jobs و cronjobs پادهایی را ایجاد میکنند که بعد از اتمام وظایفشان از بین میروند (برای مثال پادهایی که مسئولیت گزارشگیری یا بکاپگیری هستند).
از طرفی دیگر Objectهایی مانند Deployment و Daemon پادهایی را ایجاد میکنند که بهصورت خودکار نابود نشده و کاربران باید بهصورت دستی اینکار را انجام دهند.
هر پاد به صورت کلی یک وضعیت یا Status دریافت میکند که بهصورت کلی پنج مورد هستند:
- وضعیت Pending: در این حالت کوبرنتیز پاد مربوطه را قبول کرده و کانتینر در حال آماده شدن برای اجراست.
- وضعیت Running: در این حالت حداقل یک کانتینر به حالت اجرا درآمده است.
- وضعیت Succeeded: در این حالت پاد مربوطه وظیفه محوله را بهخوبی انجام داده است. اگر پاد بهصورت خودکار نابود یا متوقف شود در این وضعیت این کار صورت میگیرد.
- وضعیت Failed: در این حالت یک یا چند کانتینر بنابر دلیل یا دلایلی نتوانستهاند اجرا شوند.
- وضعیت Unknown: این حالت زمانی اتفاق میافتد که پاد نمیتواند با نودی که قرار است روی آن اجرا شود ارتباط برقرار کند.
لاگها
کوبرنتیز برای هر کدام از کانتینرهایی که درون یک پاد اجرا میشود یکسری لاگ تولید میکند. با وجود اینکه هر کانتینر شامل یکسری قوانین برای مدیریت و ایجاد لاگها میشود اما کوبرنتیز براساس قالب استاندارد CRI این لاگها را تولید میکند
کنترلرها
کنترلرها از جمله Objectهای اصلی در کوبرنتیز است که پادها را ایجاد میکند و روی سلامتی و تعداد آنها نیز نظارت دارد. همچنین کنترلرها عملیاتهایی مانند راهاندازی مجدد و متوقف کردن پادها را انجام میدهند. در زیر به صورت کامل با اجزا کنترلر آشنا خواهید شد:
- ReplicaSet: مسئول ایجاد پادها.
- Deployment: مسئول ایجاد یک ReplicaSet پیکربندی شده و پیکربندیهای مختلف.
- DaemonSet: کنترل اینکه کدام نود مسئول ایجاد کدام پاد خواهد بود بر عهده این بخش است.
- StatefulSet: مسئول ایجاد اپلیکیشنهای Stateful (برای مثال سرویسهایی که دادههای احراز هویت کاربران را نگهداری میکنند) و ایجاد پادها مربوطه.
- Job: ایجاد پادهایی که بعد از انجام وظایفشان به صورت موفق، به صورت خودکار نابود میشوند.
- CronJob: کمک کننده به Job برای هماهنگ کردن پادها.
قالبها
در فرایند کاری هر پاد، قالبها نقش مهمی را ایفا میکنند. هر قالب که در واقع یک فایل با فرمت YAML است کانتینرهایی که یک پاد قرار است اجرا کند را تعریف میکند. کنترلرها براساس این قالبهای پیکربندی شده تصمیم میگیرند که به چه صورتی یک پاد جدید را ایجاد کنند.
کاربران برای بهروزرسانی پیکربندی مربوط به پادها از فیلد PodTemplate در کنترلر استفاده میکنند.
شبکه و ارتباط گیری
هر پادی که در کلاستر کوبرنتیز تعریف میشود یک آیپی آدرس منحصر به فرد در همان کلاستر را دریافت میکند. کانتینرهایی که در داخل یک پاد قرار میگیرند نیز این آدرس را به همراه namespace و پورت مربوطه به اشتراک میگذارند.
به این شکل یک ارتباط درونی در داخل پاد شکل میگیرد. در تصویر زیر میتوانید این ساز و کار را مشاهده کنید.
اگر یک کانتینر در یک پاد قصد داشته باشد با یک کانتینر در پاد دیگری (در همان کلاستر) ارتباط برقرار کند این کار از طریق IP Networking انجام خواهد شد. پادها در این حالت یک ارتباط مجازی Ethernet ایجاد کرده و روی نودها با همدیگر ارتباط برقرار میکنند.
ذخیرهسازی
دادههای هر پاد در بخش Volumes ذخیرهسازی میشوند، همچنین مسیر ذخیرهسازی این دادهها توسط تمام کانتینرهایی که در همان پاد حضور دارند قابل دسترس است.
به صورت کلی در دنیای پادها دو شکل از فضای ذخیرهسازی وجود دارد که در زیر آنها را مشاهده میکنید:
- Persistent Volumes: این نوع از فضای ذخیرهسازی دائمی بوده و به چرخه زندگی پادها مرتبط نمیشود. بنابراین زمانی که یک پاد متوقف یا نابود میشود این بخش کماکان باقی میماند.
- Ephemeral Volumes: این نوع از فضای ذخیره سازی با از بین رفتن یا متوقف شدن پادها نیز از بین میرود.
کاربران میتوانند از طریق فایل YAML هر کدام از این موارد را به صورت جداگانه تعیین و پیکربندی کنند.
مزایای استفاده از پادها در کوبرنتیز
یکی از دلایلی که باعث محبوبیت بالای کوبرنتیز شده است وجود ساختار پادهاست. با استفاده از پادها، کوبرنتیز میتواند کارایی کانتینرها را بهبود بخشد، میزان مصرف منابع را کاهش دهد و از متوقف نشدن فرایند دیپلوی مطمئن شود.
در ادامه ما با چند مورد از مهمترین مزیتهای استفاده از پاد در محیط کوبرنتیز آشنا خواهیم شد.
انتزاعات سطح کانتینر
از آنجایی که Podها یک لایه انتزاعی از کانتینرهایی هستند که میزبانی میکنند، کوبرنتیز میتواند با کانتینرهای مختلف به عنوان یک واحد یکپارچه در کلاستر تعامل برقرار کرده و در نتیجه فرایند مدیریت و پیکربندی سادهتر و یکپارچهتری داشته باشد.
به اشتراکگذاری منابع
تمام کانتینرهایی که در یک پاد قرار میگیرند از یک Namespace استفاده میکنند. از این جهت قابلیت ارتباطگیری کانتینرها با همدیگر بسیار سادهتر شده است. جدای از اینکه کانتینرهای موجود در یک پاد میتوانند از یک شبکه مشترک بهره بگیرند، منابع دیگری مانند Storage Volumes نیز به صورت مشترک در دسترس همگی آنها خواهد بود. این موضوع برای مدیریت اپلیکیشنهای Stateful بسیار کاربردی است.
Load Balancing
پادها میتوانند در سرتاسر یک کلاستر تکثیر یا Replicate شوند به همین دلیل با استفاده از یک سرویس Load Balancing شما میتوانید ترافیک ورودی را بین پادهای مختلف به اشتراک بگذارید.
مقیاسپذیری
کوبرنتیز براساس یکسری قواعد تعیین شده میتواند به راحتی تعداد پادهای تکثیر شونده را افزایش یا کاهش دهد. بنابراین شما به سادگی میتوانید پروژههایتان را مقیاسدهی کنید.
بررسی وضعیت سلامت
پادها به ما این امکان را میدهند تا به صورت خودکار و دائمی وضعیت سلامتیشان را بررسی کنیم. همچنین در صورت وجود مشکل، کوبرنتیز به راحتی میتواند پادها را Restart کند. تمام این موارد در نهایت باعث میشوند تا نرخ Down-Time اپلیکیشن ما بسیار کاهش پیدا کند.
جمعبندی
پادها بخش بسیار مهم و حیاتی در چرخه کاری کوبرنتیز به شمار میآیند. درک عمیق چیستی و چگونگی کار کردن پادها به شما کمک میکند تا به صورت حرفهایتری در کوبرنتیز عمل کنید.
در این مطلب از وبسایت همروش ما با چیستی Podها، انواع و چگونگی کار کردن آنها و همچنین مزیتهایی که به ما ارائه میدهند صحبت کردیم.