ویرگول
ورودثبت نام
احمد رفیعی
احمد رفیعیمشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
احمد رفیعی
احمد رفیعی
خواندن ۱۲ دقیقه·۱ سال پیش

پادها و مدیریت اونها در کوبرنتیز (قسمت چهارم)

توی این پست میریم سراغ پادها توی کوبر و اونها رو بیشتر میشناسیم و بررسی‌شون می‌کنیم.

Kubernetes Pods
Kubernetes Pods


خب یه مروری کنیم پست‌های قبلی رو:

  • دواپس چیه و چرا لازمه؟  اینجا در مورد دواپس و ضرورت استفاده از آن صحبت کردم.

  • چطور اپلیکیشن مناسب کلاد آماده کنیم؟ و اینجا توضیح دادم که چطور می‌تونیم یه اپلیکیشن مناسب کلاد توسعه بدیم.

  • چه عمقی از لینوکس برای دواپس لازمه؟ و اینجا توضیح دادم که کدوم موارد لینوکس برای دواپس الزامی هست که اول سراغ اون موارد بریم.

  • خودکارش کن,مشکلاتت حل میشه در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما می‌کنه صحبت کردم.

  • در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.

  • در مسیر دواپس به داکر رسیدیم (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.

  • در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.

  • تست نوشتن و شروع مسیر CI/CD (قسمت اول) توی این پست انواع تست رو بررسی کردیم و با ابزارهای CI/CD آشنا شدیم و یه مقایسه بین گیت‌لب و جنکینز داشتیم.

  • در مسیر CI/CD گیت رو بررسی می‌کنیم (قسمت دوم) توی این پست قبل ورود به گیت‌لب نیاز بود که گیت و ورژن کنترل سیستم ها رو یه بررسی کنیم.

  • در مسیر ‌CI/CD شناخت گیت‌لب (قسمت سوم) توی این پست اجزای گیت‌لب رو بررسی کردیم و با کامپوننت‌های مختلفی که داره بیشتر آشنا شدیم.

  • در مسیر ‌CI/CD پایپ‌لاین و رانر گیت‌لب (قسمت چهارم) توی این پست پایپ‌لاین و رانر گیت‌لب رو بررسی کردیم.

  • در مسیر CI/CD وریبل، گیت‌آپس و جمع‌بندی (قسمت پنجم) توی این پست وریبل‌های گیت‌لب رو بررسی کردیم و یه معرفی کوتاه از گیت‌آپس و آتودواپس کردیم و در انتها یه مقدار تجربه‌های خودم رو در گیت‌لب باهاتون به اشتراک گذاشتم.

  • در مسیر Observability، الک (قسمت دوم) توی این پست استک قدرتمند ELK رو بررسی کردیم.

  • در مسیر Observability، جمع بندی استک الک (قسمت سوم) توی این پست بقیه کامپوننت‌های استک الک رو بررسی کردیم و fluentd و fluentbit رو مقایسه کردیم و نهایتا یه معرفی هم روی opensearch داشتیم.

  • در مسیر Observability، استک پرومتئوس (قسمت چهارم) توی این پست یه معرفی اولیه داشتیم روی استک پرومتئوس.

  • در مسیر Observability، استک پرومتئوس (قسمت پنجم) توی این پست یه مقدار کامپوننت های استک پرومتئوس رو بیشتر بررسی کردیم.

  • در مسیر Observability، استک ویکتوریا (قسمت ششم) توی این پست استک ویکتوریا رو معرفی کردیم و سعی کردیم با پرومتئوس مقایسه‌اش کنیم.

  • در مسیر Observability، می‌می‌ر (قسمت هفتم) توی این پست در مورد ابزار میمیر از ابزارهای گرافانا توضیح دادیم و کاربردش رو بررسی کردیم.

  • در مسیر Observability، لوکی (قسمت هشتم) توی این پست در مورد ابزار گرافانا برای مدیریت لاگ یعنی لوکی توضیح دادیم و آخرشم یه معرفی کوتاه رو graylog داشتیم.

  • در مسیر Observability، تمپو (قسمت نهم) توی این پست در مورد تریسینگ توضیح دادیم و گرافانا تمپو رو بررسی کردیم و یه معرفی کوتاه روی Jaeger داشتیم

  • در مسیر Observability، گرافانا (قسمت دهم) توی این پست در مورد گرافانا و HA کردنش و همچنین یه سری از ابزارهاش مثل alloy , incident, on-call توضیح دادیم.

  • آغاز مسیر کوبر (قسمت اول) تو این قدم به معرفی ابزارهای ارکستریشن پرداختیم و مدارک کوبرنتیز رو بررسی کردیم.

  • کوبر سینگل ( قسمت دوم ) توی این قدم در مورد kubectl , kubeconfig توضیح دادیم و تعدادی ابزار رو معرفی کردیم که به کمک اونها میتونیم یک کوبرنتیز دمه‌دستی واسه تست‌هامون داشته باشیم.

  • کامپوننت‌های کوبر ( قسمت سوم ) توی این پست کامپوننت‌های مختلف کوبرنتیز رو بررسی کردیم و اجزای نودهای مستر و ورکر رو دونه دونه بررسی کردیم و توضیح دادیم.

  • پادها و مدیریت اونها در کوبرنتیز (قسمت چهارم) توی این پست در مورد پاد توی کوبرنتیز توضیح دادیم و موارد مربوط به اون رو بررسی کردیم.

  • ورک‌لودهای کوبر و مدیریت منابع کوبر (قسمت پنجم) توی این پست در مورد namespaceها توی کوبر توضیح دادیم و انواع ورک‌لود کوبر رو بررسی کردیم.

  • اگه لازم شد کوبر خودش گنده میشه‌! ( قسمت ششم ) توی این پست در مورد سه نوع ورک‌لود‌ مرتبط با scaling به صورت خودکار در کوبرنتیز توضیح دادیم.

  • نتورک کوبر (قسمت هفتم) توی این قسمت انواع سرویس توی کوبرنتیز رو بررسی کردیم و در مورد مفاهیم اینگرس و نتورک پالیسی توضیح دادیم.

  • استورج کوبرنتیز (قسمت هشتم) توی این قسمت در مورد انواع استورج توی کوبرنتیز توضیح دادیم و مفاهیم PV و PVC و Storage Class رو بررسی کردیم.

  • پراب، ریکوئست و لیمیت (قسمت نهم) توی این قسمت موارد مربوط به محدود کردن منابع کانتینر توی کوبرنتیز رو بررسی کردیم و در مورد انواع ‌probe ها توی کوبرنتیز توضیح دادیم.

  • پاد تو نود (قسمت دهم) توی این قسمت درمورد فرآیند انتقال پاد به نود مناسب مفاهیم پیشرفته‌تری مثل affinity و anti-affinity و taint و toleration رو بررسی کردیم.

  • اولویت پاد و امنیت (قسمت یازدهم) توی این قسمت در مورد تعیین اولویت برای پادها و جنبه‌های مختلف امنیت در کوبرنتیز توضیح دادیم.

  • کنترل دسترسی به کوبر (قسمت دوازدهم) توی این قسمت در مورد مراحل دسترسی به api کوبرنتیز صحبت کردیم و بعدش مفاهیمی مثل سرویس اکانت رو توضیح دادیم.

  • دیزاین کلاستر (قسمت سیزدهم) توی این قسمت در مورد طراحی و دیزاین یک کلاستر و روش‌های مختلفی که داره توضیح دادیم و همچنین تفاوت روش‌های مختلف تقسیم منابع در کلاسترها را بررسی کردیم.

  • مالتی تننسی در کوبر (قسمت چهاردهم) توی این قسمت چالش‌های مربوط به داشتن چند مستاجر بر روی کلاستر کوبرنتیز توضیح دادیم.

  • هلم (قسمت پانزدهم) توی این قسمت پکیج منیجر معروف کوبرنتیز یعنی Helm رو بررسی کردیم و در موردش ویژگی‌ها و کاربردهاش توضیح دادیم.

  • سی آر دی و اُپراتور (قسمت شانزدهم) توی این قسمت در مورد اینکه چطوری یه ریسورس کاستوم شده به کلاستر اضافه کنیم توضیح دادیم و مفهوم اُپراتور رو توی کوبر بررسی کردیم.

  • نصب کلاستر با kubeadm (قسمت هفدهم) توی این قسمت قدم به قدم نحوه نصب یک کلاستر کوبرنتیز رو با استفاده از ابزار kubeadm توضیح دادیم.

  • نصب کلاستر با kubespray (قسمت هجدهم) توی این قسمت نحوه نصب کلاستر با یه پروژه خیلی خوب به نام کیوب اسپری که یه انسیبل خفن برای ستاپ کلاستر رائه میده رو توضیح دادیم.

  • نصب کلاستر با rancher (قسمت نوزدهم) توی این قسمت توضیح دادیم که چطور با استفاده از ابزار RKE یک کلاستر کوبرنتیز راه‌اندازی کنیم.

توصیه می‌کنم که حتما این پست‌ها رو هم مطالعه کنید. بریم که ادامه بدیم.


ساختار پادها و جزئیات اجزای آن (Containerها، Volumeها)

pod
pod

پاد (Pod) کوچک‌ترین واحد اجرایی در کوبرنتیز است که یک یا چند کانتینر را در بر می‌گیرد. کانتینرها درون یک پاد منابع شبکه و فضای ذخیره‌سازی را به اشتراک می‌گذارند. درون هر پاد ممکنه یک یا چند کانتینر و یک یا چند والیوم باشه اما کوچکترین واحدی که کوبرنتیز اونو کنترل میکنه پاد هست.

هر کانتینر یک اپلیکیشن یا سرویس را اجرا می‌کند. آنها بر اساس ایمیج‌های داکر ساخته می‌شوند و درون پاد با یکدیگر ارتباط دارند.

والیوم‌ها فضای ذخیره‌سازی مشترکی هستند که بین کانتینرهای یک پاد به اشتراک گذاشته می‌شوند. آنها برای حفظ داده‌ها در صورت ازبین رفتن یا جابجایی کانتینرها استفاده می‌شوند.

پادهایی که بیش از یک کانتینر دارند به عنوان پادهای مالتی‌پل کانتینر شناخته می‌شوند. این کانتینرها برای انجام وظایف مکمل در کنار هم اجرا می‌شوند.

معمولا توی کوبرنتیز پاد رو به صورت مستقیم نمیسازن حتی پادهایی که یه دونه هستن، به جاش پادهارو با استفاده از ورکلودهایی مثل Deployment و Job میسازن یا اگه نیاز باشه که state پاد رو track کنیم از StatefulSet استفاده میشه. هر پاد معمولا یک اینستنس از اپلیکیشن مورد نظر رو توی خودش داره و سرویس میده و در صورتی‌ نیاز باید تعداد بیشتری از این پادها بالا بیاریم که به این کار رپلیکیشن میگن و معمولا پادهایی که نیاز داریم تعدادشون بیشتر باشه رو Replicated می‌کنیم و با یک ورکلود و کنترلرش اونها رو منیج می‌کنیم.

sidecarinit
sidecarinit
  • کانتینر Sidecar:

معمولا توی پادهایی که چنتا کانتینر دارند یکیشون هست که داره سرویس اصلی رو میده و باقی کانتینر‌ها یه جورایی دارن کارای جانبی اون یک کانتینر اصلی رو میکنن، مثلا لاگی رو جنریت میکنن یا فایلی رو براش آپدیت میکنن و ... به اون کانتینرهای کناری میگن سایدکار.

بررسی Init Container

init container
init container

توی صنعت بعضی کارخونه‌ها یه سری موتورهای خیلی بزرگ دارن که یکی از دغدغه‌های اصلی در مورد اونها روشن کردنشون هست! چون اگه اونها رو مستقیم از حالت سکون به برق وصل کنیم تا شروع به کار کنند، توان مصرفی بسیار بالایی نیاز هست و معمولا تامین اون برق ممکن نیست. به عنوان راه حل میان از یک موتور کوچیکتر در کنار اون بزرگه استفاده میکنن و اول اون کوچیکه رو روشن میکنن تا با کمک اون موتور بزرگ اصلی رو به یه گشتاور حداقلی برسونن و بعد دیگه موتور اصلی رو به برق وصل می‌کنن. به اون موتور کوچیکه میگن اینیت موتور :)

اینیت کانتینرها هم همینجوری هستن، کانتینرهایی هستند که قبل از کانتینرهای اصلی در یک پاد اجرا می‌شوند و کارهای اولیه مانند تنظیمات یا انتظار برای منابع خارجی رو انجام میدن تا بعد از اونها کانتیر اصلی کارش را انجام دهد.
تا زمانی که همه Init Containerها تکمیل نشوند، کانتینرهای اصلی شروع به کار نمی‌کنند.
مثلا یک Init Container که قبل از اجرای اپلیکیشن، فایل‌های پیکربندی را دانلود و آماده می‌کند.

بررسی Static Pod

static pod
static pod

توی پست‌های قبلی توضیح دادیم که درخواست ایجاد پاد به api-server میرسه و بعد scheduler نود مقصد رو مشخص میکنه و بعد api-server درخواست ایجاد این پاد رو میده به kubelet رو اون نود تا ایجاد بشه. اما خود api-server و scheduler هم پاد هستن، خود اینارو کی میاره بالا ؟!! اینجاست که سرو کله‌ی استاتیک پاد پیدا میشه، کیوبلت میگه آقاجان من اصلا کاری ندارم api-server چی میگه و ... اگر مانیفست پادی رو توی مسیر

/etc/kubernetes/manifests

ببینم، اونو میارم بالا ! استاتیک پادها پادهایی هستند که مستقیماً توسط Kubelet در هر نود ایجاد می‌شوند، بدون اینکه در API سرور ثبت شوند. پس ما میتونیم api-server و ... که نیاز داریم بیان بالا با استفاده از استاتیک پاد ایجادشون کنیم. یا مثلا ممکنه برای اجرای سرویس‌های خیلی حیاتی ازش استفاده کنیم. دقت کنید این پاد ها بدون کنترل پلین و فقط توسط kubelet اجرا می شوند.

بررسی و توضیح Pod Template

pod template
pod template

پاد تمپلت یک قالب است که مشخصات پادها را تعریف می‌کند و در منابعی مانند Deployment، ReplicaSet و ... استفاده می‌شود.

مثلا در یک Deployment، از Pod Template برای تعریف نسخه جدید اپلیکیشن استفاده می‌شود تا در هنگام به‌روزرسانی، پادهای جدید با این قالب ساخته شوند.

بررسی pod phase:

pod phase
pod phase

پادها توی کوبرنیز میتونن توی حالت‌های مختلفی قرار بگیرن که در ادامه هرکدوم رو به اختصار توضیح میدیم.

Pending:

زمانیکه یه پاد توسط کوبرنتیز پذیرفته شده اما هنوز یک یا چندتا از کانتیرهای اون پاد آماده نشده باشند، حالا به دلیل اینکه ایمیج‌شون دانلود نشده یا مثلا هنوز اسکجولر تکلیفشون رو مشخص نکرده و ... میگیم که این پاد پندینگ هست.

Running:

زمانیکه یه پاد به یک نود مشخص باند شده باشه و تمام کانتینرهای اون ساخته شدن باشند و حداقل یکی از اونها در حال ران شدن باشه یا پروسه ای رو توی حالت start داشته باشه میگیم که این پاد رانینگ هست.

Succeeded:

زمانیکه تمام کانتینرهای توی پاد به صورت موفق terminate شده باشند و ری‌استارت هم نشده باشند میگیم که پاد ساکسیدد شده.

Failed:

زمانیکه تمام کانتینرهای توی پاد terminate شده باشند و حداقل یکی‌شون توی حالت failure بوده باشه زمان terminate شدن، حالا یا با exit code جز صفر terminate شده باشه یا اینکه توسط سیستم فرقی نمیکنه. توی این حالت میگیم که پاد فِیل شده.

Unknown:

زمانیکه وضعیت پاد قابل تشخیص نباشه که معمولا به علت ایراد در کانکشن بین api-server و نودی که پاد روی اون هست این اتفاق میافته، میگیم که پاد Unknown هست.

بررسی Container States:

کانتینرها هم مثل پادها میتونن توی استیت‌های مختلفی باشند که در ادامه به اختصار توضیح میدم:

Waiting:

اگه یه کانتینر نه توی استیت Running باشه و نه استیت Terminated اون موقع توی استیت ویتینگ هست!!!

موقعیکه یه کانتینر توی حالت ویتینگ هست یعنی هنوز داره آپریشن‌هایی که برای بالا اومدن نیاز داره رو انجام میده تا اصطلاحا استارت‌آپش کامل بشه.

Running:

استیت رانینگ به این معنی هست که کانتینر بدون مشکل داره اجرا میشه و اگه یه poststart (جلوتر میگم چیه) داشته اون اجرا شده و تموم شده.

Terminated:

یه کانتینر توی حالت terminated هست زمانیکه شروع به اجرا کرده باشه و بعدش یا کارشو کامل کرده باشه و پروسه‌اش کامل شده باشه یا اینکه به هردلیلی fail شده باشه.

بررسی PostStart و PreStop:

PreStart & PostStop
PreStart & PostStop

کوبرنتیز بهمون این امکان رو میده که یه سری اکشن‌های کاستوم‌شده رو تو زمان‌های مشخصی در lifecycle کانتینر اجرا کنیم که بهشون میگیم PreStop and PostStart lifecycle hooks.

بلافاصله بعد از اینکه کانتینر ساخته میشه و قبل از اینکه entrypoint command اجرا شه، PostStart hook اجرا میشه که یوزکیسش مثلا میشه ستاپ کردن کانفیگ یا اجرای یه سری اسکریپت برای آماده کردن environment یا آماده سازی دیتابیس و ...

و درست قبل از اینکه کانتینر terminated بشه PreStop hook اجرا میشه که معمولا تسک‌های cleanup و مواردی مثل gracefully shutting down یا ذخیره کردن state یا ارسال نوتیف استاپ شدن سرویس یوزکیس‌های مرتبط باهاش هستن.

بررسی لیبل و سلکتور :

label & selector
label & selector
  • لیبل‌ها (Labels): برچسب‌های کلید-مقداری هستند که به منابع کوبرنتیز اضافه می‌شوند تا آنها را دسته‌بندی و سازماندهی کنیم.

  • سلکتورها (Selectors): ابزارهایی هستند که به ما امکان می‌دهند منابع را بر اساس لیبل‌هایشان انتخاب کنیم.

لیبل‌ها به آبجکت‌های‌ کوبرنتیز مثل پادها اضافه میشن و ازشون برای مشخص کردن دسته‌ای از آبجکت‌ها استفاده میشه، لیبل‌ها هم زمان ساخت میشه اضافه کرد و هم بعدش میتونن اضافه بشن یا تغییر کنند. هر کلید لیبل برای یک آبجکت باید به صورت یونیک باشه.

label & selector
label & selector

نکته مهمی که اینجا هست اینه که کوبرنتیز داره یه کار سخت رو با استفاده از موضوعات ساده‌ای مثل لیبل و سلکتور انجامش میده، حالا در ادامه بهتر متوجهش میشیم ولی مثلا با یه لیبل سلکتور تمام پادهای اپلیکیشن ما میرن میشنن پشت سرویسی که باید و به همین راحتی لودبالانس انجام میشه.

بررسی و توضیح Annotations و تفاوتش با Labels

با استفاده از انوتیشین میتونید متادیتای دلخواه‌تون رو به آبجکت‌ها و پادهای کوبر اضافه کنید. مثلا شماره تماس افرادیکه مسئولیت نگهداری اون پاد رو دارن یا اطلاعاتی که زمان دیباگ کردن کمک کننده هستن. انوتیشین‌ها میتونن هر نوع دیتایی رو نگه دارن و کلید و مقدار های انوتیشین محدودیت خاصی ندارن، بنابراین میتونید برای ذخیره اطلاعاتی که به نظرتون لازمه ازش استفاده کنید.

annotations
annotations

هم لیبل و هم انوتیشن در واقع دارن متادیتا به آبجکت‌ها کوبرنتیز اضافه می‌کنند، درحالیکه لیبل‌ها امکان این رو بهمون میدن که آبجکت‌ها کوبرنتیز رو به نوعی شناسایی کنیم و سازماندهی کنیم ولی انوتیشن‌ها اینطور نیستند. لیبل‌ها محدودیت‌های RFC 1123 رو دارند اما انوتیشن روی کلید و مقدارهاش محدودیتی نداره.

لیبل‌ها در کنار سلکتور استفاده می‌شوند و به صورت داخلی هم کوبرنتیز ازشون استفاده میکنه و محدودیت‌های naming کوبرنتیز با اونها انجام میشه در حالیکه انوتیشن‌ها بیشتر توسط ابزارها و افرادیکه با کلاستر کار می‌کنند استفاده میشن.


بررسی و توضیح Finalizers و کاربرد آن

finalizer
finalizer

فاینالایزر مکانیزمی در کوبرنتیز هستند که قبل از حذف یک منبع، عملیات خاصی را اجرا می‌کنند.

کاربرد فاینالایزر توی جلوگیری از حذف منابع تا زمانی که عملیات پاک‌سازی انجام شود.
در واقع فاینالایزرها کلیدهایی هستن توی namespace که به کوبرنتیز میگن تا زمانیکه یه شروط خاصی برقرار نشدن اجازه حذف یه سری ریسورس که از قبل مارک کردن رو نده.

معمولا از فاینالایزرها روی pv و pvc توی کوبرنتیز استفاده می‌کنیم که از پاک شدن اشتباهی والیوم‌ها جلوگیری کنیم.

توی این پست سعی کردیم تا بیشتر با پادها توی کوبرنتیز آشنا بشیم و ببینیم که چطوری اونها رو مدیریت می‌کنند.

مراقب خودتون باشید. 🌹🐳🌹



با ما متخصص شوید
با ما متخصص شوید


خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.

🫀 Follow DockerMe 🫀

🔔 Follow YouTube 🔔

📣 Follow Instagram 📣

🖇 Follow LinkedIn DockerMe🖇

🔎 Follow Linkedin Ahmad Rafiee 🔎

🕊 Follow Twitter 🕊

کوبرنتیزkubernetesk8s
۷
۱
احمد رفیعی
احمد رفیعی
مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
شاید از این پست‌ها خوشتان بیاید