کوبرنتیز Probe و مدیریت منابع داخل کوبرنتیز (قسمت نهم)

تو قسمت نهم از مسیر بلاگ پست‌های کوبرنتیز، میریم سراغ مفاهیم پراب و مدیریت منابع و ریکوئست و لیمیت رو بررسی می‌کنیم.

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

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

kubernetes probes
kubernetes probes
 

در Kubernetes، پراب (Probe) مکانیزمی است که به kubelet کمک می‌کند تا وضعیت سلامت یک کانتینر را بررسی کند. به بیان ساده، پراب‌ها تست‌هایی هستند که به صورت دوره‌ای اجرا می‌شوند تا تشخیص دهند که آیا یک کانتینر:

  1. سالم است (Healthy): یعنی به درستی کار می‌کند.
  2. آماده است (Ready): یعنی می‌تواند درخواست‌های جدید را پردازش کند.
  3. مشکلی دارد (Unhealthy): یعنی به درستی پاسخ نمی‌دهد.

این مکانیزم از طریق صدا زدن یک Handler که توسط کانتیر ایجاد شده، اتفاق می‌افتد.

سه نوع هندلر وجود دارند که به اختصار اونها رو توضیح میدیم.

ExecAction:

یک کامند رو درون کانتینر اجرا میکنه و اگه با status code صفر از کامند خارج بشه اون رو موفقیت آمیز در نظر میگیره و وضعیت کانتینر رو سالم گزارش میکنه.

TCPSocketAction:

به یک پورت خاص پاد از طریق ip پاد متصل میشه و یک TCP Check رو انجام میده و درصورتیکه پورت باز باشه این تست رو موفق در نظر میگیره.

HTTPGetAction:

یک درخواست HTTP GET به ip پاد میزنه در پورت و path مشخص و در صورتیکه response کد بزرگتر مساوی ۲۰۰ و کمتر از ۴۰۰ باشد اون رو موفق در نظر میگیره.

انواع پراب‌ها:

probes workflow
probes workflow
 

۱. Liveness Probe:

برای بررسی اینکه آیا کانتینر سالم است یا نه. اگر کانتینر سالم نباشد، kubelet می‌تواند آن را ری‌استارت کند.

۲. Readiness Probe:

برای بررسی اینکه آیا کانتینر آماده ارائه خدمات است یا نه. اگر آماده نباشد، از لیست پادهای قابل دسترس (Endpoints) حذف می‌شود.

۳. Startup Probe:

برای بررسی اینکه آیا کانتینر توانسته به درستی شروع به کار کند یا نه. این پراب معمولاً برای کانتینرهایی که زمان زیادی برای شروع نیاز دارند استفاده می‌شود.

probes
probes
 

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

probes and loadbalancer
probes and loadbalancer
 

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

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

  • initialDelaySeconds:

تعداد ثانیه‌هایی که پس از شروع کانتینر صبر می‌شود تا پراب‌های startup، liveness یا readiness آغاز شوند. مقدار پیش‌فرض ۰ ثانیه است. حداقل مقدار مجاز ۰ است.

  • periodSeconds:

فاصله زمانی (بر حسب ثانیه) برای اجرای پراب رو با این متغیر نشان می‌دهیم یعنی هر چند ثانیه یکبار پراب مجدد اجرا شود و وضعیت چک شود. مقدار پیش‌فرض ۱۰ ثانیه است. حداقل مقدار مجاز ۱ است.

  • timeoutSeconds:

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

  • successThreshold:

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

  • failureThreshold:

زمانی که یک پراب شکست بخورد، Kubernetes تعداد failureThreshold بار تلاش می‌کند پیش از اینکه تسلیم شود. تسلیم شدن در مورد liveness probe به معنای ری‌استارت کردن پاد است. در مورد readiness probe، پاد به عنوان آماده‌نبودن (Unready) علامت‌گذاری می‌شود. مقدار پیش‌فرض ۳ است. حداقل مقدار مجاز ۱ است.

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

Kubernetes Resource Management:

k8s resource requests and limits
k8s resource requests and limits
 

زمانی که Resource Request را برای کانتینرهای یک پاد مشخص می‌کنید، Scheduler از این اطلاعات برای تصمیم‌گیری در مورد اینکه پاد روی کدام نود قرار بگیرد استفاده می‌کند. زمانی که محدودیت منابع Resource Limit را برای یک کانتینر مشخص می‌کنید، kubelet این محدودیت‌ها را اعمال می‌کند تا کانتینر در حال اجرا اجازه نداشته باشد بیش از حدی که تعیین کرده‌اید از منابع استفاده کند. همچنین kubelet حداقل مقدار درخواست‌شده از آن منبع سیستم را به صورت اختصاصی برای استفاده آن کانتینر رزرو می‌کند.

request and scheduler
request and scheduler
 

در فایل مانیفست پاد، CPU و Memory هر کدام به عنوان یک Resource Type تعریف شده‌اند که می‌توان محدودیت‌هایی در سطح کانتینر برای آن‌ها تعیین کرد. هر نوع منبع دارای یک واحد پایه است. CPU بر حسب هسته‌های پردازشی (cores) مشخص می‌شود و Memory بر حسب بایت (bytes) تعیین می‌گردد. برای هر نوع منبع دو نوع محدودیت قابل تنظیم است: Requests و Limits.

  • Request

مقدار منابعی است که سیستم برای پاد تضمین می‌کند و Kubernetes از این مقدار برای تصمیم‌گیری در مورد اینکه پاد روی کدام نود قرار گیرد استفاده می‌کند. به عبارتی مقدار منابعی است که کوبرنتیز و kubelet تضمین می‌کند که در اختیار pod قرار می‌دهد. مقدار منابعی است که گارانتی می‌کند.

  • Limit

حداکثر مقدار منابعی است که Kubernetes به پاد اجازه می‌دهد استفاده کند. دقت کنید اجازه می‌ده که استفاده کنی ولی گارانتی نمی‌کنه که حتما برای شما تامین کند. اگر داشت در اختیار Pod قرار می‌ده. اصلا گارانتی براش نیست. اگر وجود داشت تامین می‌شود. سقف مصرف منابع pod هست و بیشتر از اون نمی‌تونه pod منابع در اختیار بگیره.

cpu request and limit
cpu request and limit
 

در واقع توی request به کوبرنتیز میگیم تضمین کن که این میزان رو حتما بهش بدی ولی توی limit میگیم اگه داشتی تا این حد بهش بده!

requests and limits
requests and limits
 

پس دیدیم که در کوبرنتیز Requests و Limits مکانیزم‌هایی هستند که برای کنترل منابعی مانند CPU و Memory استفاده می‌شوند. فقط باید به خاطر داشت که مقدار Limit هرگز نمی‌تواند کمتر از مقدار Request باشد. اگر این کار را امتحان کنید، Kubernetes خطا می‌دهد و اجازه اجرای pod را نمی‌دهد.

یه نکته‌ی مهم اینکه این حد و حدود منابع برای pod تنظیم می‌شود. اینکه اون پاد چند تا کانتینر داشته باشه فرقی نمی‌کنه و این منابع برای مجموع اون کانتینرها می‌باشد. اگر ۴ تا کانتینر داشته باشه و میزان لیمنت منابع روی ۲ گیگ رم باشه مجموع اون ۴ تا کانتیر می‌تونن ۲ گیگ رم مصرف کنند. به این نکته توجه کنید که کوچکترین یونیت قابل مدیریت داخل کوبرنتیز Pod است.

برای دیدن اینکه هر نود توی کلاستر داره چه میزان از منابع رو مصرف میکنه میتونید از کامند زیر استفاده کنید.

kubectl get nodes –no-headers | awk ‘{print $1}’ | xargs -I {} sh -c ‘echo {}; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve — ; echo’​

این کامند به صورت مرحله‌ای اجرا می‌شود تا اطلاعات مصرف منابع را برای تمامی نودهای کلاستر Kubernetes نمایش دهد. اجازه دهید مرحله به مرحله آن را توضیح دهیم:

kubectl get nodes –no-headers

این بخش لیستی از تمامی نودهای موجود در کلاستر را بدون نمایش هدر (ستون‌های عنوان) دریافت می‌کند. خروجی این بخش شامل نام نودها است، مثلا:

node – 1
node – 2
node – 3

awk ‘{print $1}’

این دستور ستون اول خروجی (نام نودها) را استخراج می‌کند. در نتیجه، تنها نام نودها به مراحل بعدی منتقل می‌شود.

xargs -I {} sh -c ‘…’

این دستور به ازای هر نام نود ({})، یک شل اسکریپت اجرا می‌کند. داخل این اسکریپت مراحل زیر انجام می‌شود:

الف) echo {}

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

ب) kubectl describe node {}

برای نود فعلی ({})، دستور kubectl describe node اجرا می‌شود. این دستور اطلاعات مفصلی درباره نود ارائه می‌دهد، از جمله منابع تخصیص‌یافته و وضعیت پادهای در حال اجرا.

ج) grep Allocated -A 5

در خروجی دستور بالا، خطوطی که شامل عبارت Allocated هستند و ۵ خط بعد از آن فیلتر می‌شوند. این خطوط اطلاعات مصرف منابع CPU و Memory را نشان می‌دهند.

د) grep -ve Event -ve Allocated -ve percent -ve —

این بخش، خطوطی که شامل عبارت‌های اضافی مانند Event، Allocated، یا percent باشند را فیلتر می‌کند تا خروجی تمیزتر شود و فقط اعداد و اطلاعات مهم نمایش داده شوند.

ه) echo

یک خط خالی بین اطلاعات هر نود چاپ می‌کند تا خوانایی خروجی بهتر شود.

نمونه خروجی:

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

				
					node-1
  CPU Requests:  100m (10%)
  CPU Limits:    200m (20%)
  Memory Requests:  512Mi (25%)
  Memory Limits:    1Gi (50%)

node-2
  CPU Requests:  150m (15%)
  CPU Limits:    300m (30%)
  Memory Requests:  256Mi (10%)
  Memory Limits:    512Mi (20%)

node-3
  CPU Requests:  200m (20%)
  CPU Limits:    400m (40%)
  Memory Requests:  1Gi (50%)
  Memory Limits:    2Gi (100%)
				
			

این کامند به شما امکان می‌دهد به صورت سریع و تمیز مصرف منابع Allocated در هر نود را مشاهده کنید.

مناسب برای بررسی مشکلات مربوط به تخصیص منابع یا شناسایی نودهایی که ممکن است دچار کمبود منابع شوند.

این کامند وابسته به خروجی دقیق دستور kubectl describe node است و ممکن است در نسخه‌های مختلف Kubernetes تغییرات جزئی داشته باشد.


QoS on Kubernetes:

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

زمانی که Kubernetes یک پاد ایجاد می‌کند، یکی از کلاس‌های QoS (Quality of Service) زیر را به آن اختصاص می‌دهد:

Guaranteed:

یک پاد زمانی این کلاس را دریافت می‌کند که شرایط زیر را داشته باشد:

  • مقدار request برای مموری با limit برابر باشد.
  • مقدار request برای cpu با limit برابر باشد.

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

Burstable:

پاد وقتی این کلاس را دریافت می‌کند که برای Memory یا Cpu دارای request و limit باشد. یعنی وقتی که تنظیمات منابع رو داشته باشه تو این کلاس قرار می‌گیره. اگر یادتون باشه ما با limite range که تو namespace ایجاد می کردیم برای همه منابع ست می‌کردیم.

BestEffort:

این کلاس به پادی اختصاص می‌یابد که request و limit مشخصی برای مموری و cpu نداشته باشند.

دیدگاه‌ خود را بنویسید

مقاله های داکرمی

Kubernetes

دیزاین کلاستر (قسمت سیزدهم)

تو قسمت سیزدهم از مسیر بلاگ پست‌های کوبرنتیز، میریم سراغ مفاهیم کنترل دسترسی تا اینکه ببینیم چجوری به کلاستر متصل میشیم و چه فرآیندی طی میشه. Kubernetes خب یه مروری کنیم پست‌های قبلی رو: Kubernetes etcd Observability دواپس چیه و

توضیحات بیشتر »
Kubernetes

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

تو قسمت دوازدهم از مسیر بلاگ پست‌های کوبرنتیز، میریم سراغ مفاهیم کنترل دسترسی تا اینکه ببینیم چجوری به کلاستر متصل میشیم و چه فرآیندی طی میشه. خب یه مروری کنیم پست‌های قبلی رو: دواپس چیه و چرا لازمه؟ اینجا در مورد

توضیحات بیشتر »
پیمایش به بالا