احمد رفیعی
احمد رفیعی
خواندن ۱۳ دقیقه·۲ روز پیش

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

توی این قسمت میخوایم ورک‌لودهای کوبرنتیز رو باهم بررسی کنیم اما قبلش با هم namespace و resource quota رو میبینم و در مورد مدیریت منابع کلاستر توضیح میدیم.


kubernetes workload
kubernetes workload


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

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


در محیط‌های Kubernetes، مدیریت منابع و جداسازی پروژه‌ها و تیم‌ها از اهمیت ویژه‌ای برخوردار است. استفاده از Namespaces، Resource Quotas و LimitRange ابزارهایی قدرتمند برای دستیابی به این اهداف بهمون میده.

کوبرنتیز Namespace:

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

بنابراین با استفاده از نیم‌اسپیس میتونیم منابع کلاستر رو بین چندین یوزر تقسیم کنیم. نیم‌اسپیس‌هایی که اول اسمشون با -kube شروع میشه مربوط به سیستم کوبرنتیز هستن و ما نباید اسم نیم‌اسپیس‌هایی که میسازیم رو ازاین فرمت انتخاب کنیم. نه اینکه نتونیم بلکه بهتره که این کار رو نکنیم.

Kubernetes Namespaces
Kubernetes Namespaces

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

default:

یکی از نیم‌اسپیس‌هایی هست که به صورت پیش‌فرض هست و هیچی داخلش نیست و ما می‌تونیم سرویس‌های خودمون رو اونجا داشته باشیم. تنها یه سرویس داخلش ساخته شده. نیم‌اسپیس پیش‌فرض کوبرنتیز نیز می‌باشد.

kube-system:

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

kube-public:

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

kube-node-lease:

این نیم‌اسپیس Lease آبجکت‌هارو توی هرنود نگهداری میکنه. نود لیزها به kubelet امکان اینو میدن که heartbeats بفرستن تا control plane بتونه failure های نود رو تشخیص بده.

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

بررسی Resource Quota:

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

کنترل مصرف منابع مثل محدود کردن میزان CPU، حافظه، فضای دیسک و دیگر منابع ، جلوگیری از این که یک تیم یا پروژه بتواند منابع کل کلاستر را مصرف کند و اختلال در ح-هکلاستر ایجاد کند، از مزایای ریسورس‌کوتا هستن.

ResourceQuota & LimitRange
ResourceQuota & LimitRange

بررسی Limit Range:

توی کوبرنتیز LimitRange ابزاری برای تعیین محدودیت‌های پیش‌فرض و حداکثر/حداقل منابع برای پادها و کانتینرها در یک Namespace است. این قابلیت تضمین می‌کند که هر پاد یا کانتینر حداقل و حداکثر منابع مشخصی مصرف کند. بنابراین با استفاده از LimitRange می‌تونیم مصرف منابع یک پاد رو کنترل کنیم که زیاد نشه.

LimitRange & ResourceQuota
LimitRange & ResourceQuota

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

توی قدم بعدی میریم سراغ ورکلودهای کوبرنتیز ...

ورک‌لودهای کوبرنتیز:

kubernetes workloads
kubernetes workloads

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

هر پادی توی کلاستر یه lifecycle داره، مثلا موقعی که یه پاد داره روی کلاستر ران میشه و به یه مشکل مثل fault توی نودی که این پاد روش اومده بالا میخوره، معنیش اینه که تمام پادهای رو اون نود fail می‌کنند و نهایتا رفتاری که باید کوبرنتیز نشون بده این هست که به جای پادهایی که خراب شدن، پاد جدید ایجاد کنه روی کلاستر حتی اگه بعدا اون نود که به fault خورده برگرده به حالت healthy. حالا برای اینکه کارمون رو راحت‌تر کنیم نیازی نیست بریم مستقیم با پادها کار کنیم.

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

  • ReplicaSet
replicaset
replicaset

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

replicaset
replicaset


  • Deployment
deployment
deployment

دیپلویمنت همون رپلیکاست هست ولی با دوتا فرق مهم، هم حافظه داره و هم میشه باهاش حرف زد!!! البته برای اینکه راحت‌تر درکش کنیم این‌طوری می‌گیم.

حافظه داره یعنی اینکه versioning داره و بهمون قابلیت rollout و rollback میده، مثلا وقتی یه نسخه‌ی جدید از اپلیکیشنمون می‌دیم و ایمیج اون دیپلویمنت رو آپدیت می‌کنیم اگر خواسته باشیم می‌تونیم برگردیم به استیت قبلی و ایمیج قبلی خودمون و بریم روی نسخه‌ی قبلی. یه نکته‌ی مهم اینکه دیپلویمنت برای اینکه بتونه این history رو داشته باشه خودش داره از ReplicaSet استفاده می‌کنه و با استفاده از آن این کار رو انجام می‌ده.

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

در ادامه مسیر انواع استراتژی‌هارو توضیح میدیم.

deployment
deployment

دقت کنید که وقتی میگیم مثلا دیپلویمنت گارانتی میکنه یه تعداد مشخصی از پادهای سرویس‌تون رو، منظور این نیست که دیگه شما یه دیپلویمنت بزنی دیگه بعدش میتونی دست رو قرآن بذاری که داون نمیشه هیچ‌وقت!!! دیپلویمنت کاری که میکنه اضافه کردن یه کنترلر هست که اون تعداد رو چک کنه ولی اگه فرآیند بالا اومدن پادهای دیپلویمنت fail بشه که اصلا بعید نیست دیگه دیپلویمنت کاریش نمیتونه بکنه که دلایل مختلفی هم میتونه داشته باشه این مساله، مثلا ممکنه resource quota و limit range جلومون رو بگیره یا توی pull کردن ایمیج به ارور بخوریم که اتفاقا بسیار متداول هست برای ماهایی که این سمت آب‌های نیلگون هستیم یا مثلا دیپلویمنت permission های کافی رو نداشته باشه یا readiness probe ها fail کنن یا کانفیگ اشتباه منجر به درست کار نکردن اپلیکیشن در runtime بشه و ...

دیپلویمنت تنهای موقعی rollout میکنه و میره ورژن بعدی که تغییری توی پاد تمپلت اونو تریگر کنه مثلا لیبل‌ها آپدیت بشن یا ایمیج کانتینرهاش تغییر کنن، آپدیت های دیگه مثل scale کردن دیپلویمنت منجربه تریگر کردن rollout نمیشه.

  • DaemonSet
daemonset
daemonset

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

ممکنه یه سوال اینجا پیش بیاد که فرقش با static pod چیه؟ پاسخ این هست که درسته که هم استاتیک پاد و هم دیمن‌ست اسکجولر کوبرنتیز را ignore می‌کنند و روی همه نودهایی که باشن بالا میان ولی تفاوت اینجاست که استاتیک پاد رو kubelet بالا میاره و اصلا به کنترل پلین نیازی نداره و بیشتر برای دیپلوری کردن کامپوننت‌های control plane ازش استفاده می‌کنیم ولی دیمن‌ست رو Api-Server بعد از درخواست کنترلر دیمن‌ست می‌سازه و روند ساختش مثل پادهای عادی هست و همون مسیر رو طی میکنه و ازش بیشتر برای ایجنت‌های مانیتورینگ و لاگ و ... استفاده می‌کنیم.

daemonset
daemonset
  • StatefulSet
statefulset
statefulset

این ورک‌لود همونطوری که از اسمش مشخصه اومده تا برای دیپلوی کردن اپلیکیشن‌های stateful بهمون کمک کنه. به نوعی شبیه دیپلویمنت برامون یه دسته از پاد رو گارانتی میکنه که بالا باشه اما مشخصه‌ای که داره ordering و uniqueness پادهاش هست و به ترتیب میاد بالا یا اگه پاک کنیم به ترتیب شماره از آخر شروع میکنه به پاک کردن، که این مساله بهمون کمک میکنه تا بتونیم با استفاده از statefulset اپلیکیشن‌های stateful رو روی کلاسترمون دیپلوی کنیم.

چنتا نکته که درمورد statefulset خوبه حواسمون بهش باشه:

اگه یه statefulset رو پاک کنیم یا scale down کنیم، والیوم‌هایی که بهش داده شده بود پاک نمیشن که به نظرم این چیز بدی نیست ولی اگر ندونیم بد چون ممکنه مجدد اسکیلش رو زیاد کنیم و بیاد از همون والیوم قبلی استفاده کنه. پس بهش دقت کنیم.

برای ارتباط با پادهای statefulset از headless service باید استفاده کنیم که در بخش نتورک در ادامه مسیر بیشتر توضیح خواهم داد در موردش. به زبان ساده سرویسی هست که لودبالانس نمی‌کنه و همه‌ی درخواست‌های ما رو به یکی از پادها می‌رسونه.

هیچ گارانتی وجود نداره که اگه statefulset رو پاک کنیم پاد‌های اون هم terminate میکنن و از بین میرن.

پادهایی که بالا میان hostname شون از یه الگو پیروی میکنه که شامل نام stateful و شماره ترتیب پاد هست، به این صورت هر پاد نام یونیکی داره.

statefulset
statefulset
  • Job & CronJob
kubernetes job
kubernetes job

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

kubernetes cronjob
kubernetes cronjob


در ادامه مسیرمون میریم سراغ استراتژی‌های مختلف دیپلویمنت و ورک‌لودهای مربوط به auto scaling در کوبرنتیز رو بررسی می‌کنیم. 🌹

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




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

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

🫀 Follow DockerMe 🫀

🔔 Follow YouTube 🔔

📣 Follow Instagram 📣

🖇 Follow LinkedIn DockerMe🖇

🔎 Follow Linkedin Ahmad Rafiee 🔎

🕊 Follow Twitter 🕊



ci cdآموزش دواپسآموزش کوبرنتیزkubernetesکوبرنتیز
مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
شاید از این پست‌ها خوشتان بیاید