Ali
Ali
خواندن ۴ دقیقه·۲۴ روز پیش

مقیاس افقی - Horizontal Pod Autoscaling

در حالت عادی ما سعی میکنیم دید خوبی نسبت به منابع و میزان مصرفشون در سرویس داشته باشیم تا همه‌چی نرمال باشه و درست پیش بره، ولی بیاین به این مورد فکر کنیم که اگه از دستمون در بره چی؟ و نتونیم به درستی لود سرویسمون (pod) رو مدیریت کنیم چی؟، اینجاست که HPA به دادمون میرسه و به خوبی و به صورت خودکار Pod رو اسکیل میکنه، مثلا در زمانی که میزان لود منابعش با مشکل رو به رو بشه.

HPA
HPA


اسکیل کردن به صورت افقی (Horizontal)، آپدیت شدن منابع workload (مثل deployment و یا statefulset) با این هدف که به صورت خودکار workload رو با توجه به تقاضا کاهش بده. در ساده ترین تعریف از اسکیل کردن افقی، میشه به این مورد اشاره کرد که در کنار یک پاد چندین پاد دیگه ایجاد میشه تا load بین این podها تقسیم بشه، در این جا autoscaling به این معنی هستش اگه لود کاهش پیدا کنه به صورت خودکار تعداد پادهای ساخته شده هم کم میشه تا به minimumترین حالت (یعنی مقداری که براش تعریف شده) برسه.

عکس زیر نمایی از HPA هستش که چه طوری کار میکنه، metrics-server اطلاعات مورد نیاز رو به HPA میفرسته و HPA (با توجه به منابع مصرف شده (قانونی که براش تعریف شده)) تصمیم میگیره که اسکیل پاد رو بیشتر کنه یا کمتر. به عنوان مثال اگه میزان مصرف CPU بیشتر از 80درصد باشه HPA تصمیم میگیره تا scale-UP کنه و اگه میزان مصرفش به 10درصد رسید تصمیم به scale-DOWN میکنه (البته پادهای ساخته شده رو کمتر میکنه تا به مینیموم ترین مقدار برسه).

HPA with metrics-server
HPA with metrics-server

نصب metrics-server

برای پیاده سازی این سناریو نیاز داریم که metrics-server رو نصب کنیم، برای این مورد ما از Helm استفاده کردیم و نیاز توی values فایل یه تغییری بدیم، مقدار replicas رو بزاریم 2 و همین طور نیازه توی defaultArgs مقدار kubelet-insecure-tls-- رو هم وارد کنیم.

$ helm install metrics-server metrics-server/metrics-server -f values-file.yml

Metrics-server
Metrics-server

بعد از نصب دستورهای زیر رو میتونیم استفاده کنیم تا میزان مصرف podها و یا Nodeها رو ببنیم:

$ kubectl top nodes

$kubectl top pods -n <namespace>


اپلیکیشن php-apache

برای تست یک اپلیکیشن میسازیم و نیاز داریم برای اپلیکیشنی که میسازیم resource رو توی منیفست استفاده کنیم. به عنوان مثال میزان استفاده از CPU رو توی resource میتونیم بزاریم.

apache
apache

$ kubectl apply -f php-apache.yml


تعریف HPA

بعد از ساخته شدن اپلیکیشن، میتونیم HPA رو براش تعریف کنیم، ما در این سناریو به صورت کامند لاین تعریف کردیم که توی یک خط تعریف میشه که کدوم Deployment ما براش HPA لحاظ بشه:

$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max 10

در مثال بالا ما تعریف کردیم برای deploymentی با اسم php-apache که اگه درصد استفاده CPUش بیشتر از 50 شد بهش replicas اضافه بشه و حداکثر تعدادی که میتونه اضافه کنه 10 هستش و همین طور در زمان کاهش هم کمترین مقدار 1 هستش.


لود تست

برای این که تست کنیم که واقعا این HPA تعریف شده به درستی کار میکنه، یک busybox میاریم بالا و لود میندازیم روی اپلیکیشن php-apache مون:

$ kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -C "while sleep 0.01; do wget -q -O- http://php-apache; done"

بعد از اجرا کردن دستور بالا، لود مناسبی رو، روی اپلیکیشن php-apache میندازیم که میتونیم از طریق دستور kubectl get hpa --watch، وضعیت HPA تعریف شده رو ببینیم:

توی عکس میبینیم که درصد استفاده از CPU بیشتر از حد تعریف شده هستش و همین طور تعداد replicas ساخته شده تا اینجای کار 5 عدد هستش، این مورد ادامه پیدا میکنه تا میزان استفاده از CPU به کمتر از 50درصد برسه یا مقدار replicas به مقدار max تعریف شده برسه.


تعریف کردن چند metrics و یا custom metrics

تا اینجا ما از autoscaling/v1 استفاده کردیم، ولی حالا توی نسخه جدیدتر میتونیم کارای بهتری مثل multiple metrics و یا custom metrics تعریف کنیم. به عنوان مثال در نمونه HPA زیر هم حالتی برای scaleUp تعریف کردیم و هم برای scaleDown کردن اپلیکیشن:


متریک های خاص

ما دسترسی به متریک های زیادی داریم که بتونیم قانون های خودمون رو تعریف کنیم، ما حتی میتونیم از label ها هم استفاده کنیم جدای از CPU و Ram. به عنوان مثال توی نمونه زیر ما متریک http_requests رو با لیبل verb استفاده کردیم:


تعریف HPA به صورت manifest

توی سناریو بالا ما توی یک خط HPA رو تعریف کردیم، میتونیم همین قانون رو توی manifest قرار بدیم تا بعد به راحتی بتونیم تغییر بدیم، توی عکس زیر دقیقا همون سناریو رو توی manifest قرار دادیم و apply کردیم:


سعی شد توی این مقاله نمونه های کاملی از ساخت اپلیکیشن تا لود انداختن روی اپلیکیشن رو پیاده سازی کنیم و همین طور از HPAی که تعریف کردیم مطمئن شدیم که به درستی کار میکنه، نمونه‌ای از v1 رو دیدیم و همین طور v2، توی نسخه v2 ما قابلیت‌های بیشتری داریم هم توی متریک نویسی و هم توی قوانین scale UP/DOWN کردن اپلیکیشن ها.

منابع:

Horizontal Pod Autoscaling

HorizontalPodAutoscaler Walkthrough

make a Kubernetes autoscaling HPA


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