در حالت عادی ما سعی میکنیم دید خوبی نسبت به منابع و میزان مصرفشون در سرویس داشته باشیم تا همهچی نرمال باشه و درست پیش بره، ولی بیاین به این مورد فکر کنیم که اگه از دستمون در بره چی؟ و نتونیم به درستی لود سرویسمون (pod) رو مدیریت کنیم چی؟، اینجاست که HPA به دادمون میرسه و به خوبی و به صورت خودکار Pod رو اسکیل میکنه، مثلا در زمانی که میزان لود منابعش با مشکل رو به رو بشه.
اسکیل کردن به صورت افقی (Horizontal)، آپدیت شدن منابع workload (مثل deployment و یا statefulset) با این هدف که به صورت خودکار workload رو با توجه به تقاضا کاهش بده. در ساده ترین تعریف از اسکیل کردن افقی، میشه به این مورد اشاره کرد که در کنار یک پاد چندین پاد دیگه ایجاد میشه تا load بین این podها تقسیم بشه، در این جا autoscaling به این معنی هستش اگه لود کاهش پیدا کنه به صورت خودکار تعداد پادهای ساخته شده هم کم میشه تا به minimumترین حالت (یعنی مقداری که براش تعریف شده) برسه.
عکس زیر نمایی از HPA هستش که چه طوری کار میکنه، metrics-server اطلاعات مورد نیاز رو به HPA میفرسته و HPA (با توجه به منابع مصرف شده (قانونی که براش تعریف شده)) تصمیم میگیره که اسکیل پاد رو بیشتر کنه یا کمتر. به عنوان مثال اگه میزان مصرف CPU بیشتر از 80درصد باشه HPA تصمیم میگیره تا scale-UP کنه و اگه میزان مصرفش به 10درصد رسید تصمیم به scale-DOWN میکنه (البته پادهای ساخته شده رو کمتر میکنه تا به مینیموم ترین مقدار برسه).
برای پیاده سازی این سناریو نیاز داریم که metrics-server رو نصب کنیم، برای این مورد ما از Helm استفاده کردیم و نیاز توی values فایل یه تغییری بدیم، مقدار replicas رو بزاریم 2 و همین طور نیازه توی defaultArgs مقدار kubelet-insecure-tls-- رو هم وارد کنیم.
$ helm install metrics-server metrics-server/metrics-server -f values-file.yml
بعد از نصب دستورهای زیر رو میتونیم استفاده کنیم تا میزان مصرف podها و یا Nodeها رو ببنیم:
$ kubectl top nodes
$kubectl top pods -n <namespace>
برای تست یک اپلیکیشن میسازیم و نیاز داریم برای اپلیکیشنی که میسازیم resource رو توی منیفست استفاده کنیم. به عنوان مثال میزان استفاده از CPU رو توی resource میتونیم بزاریم.
$ kubectl apply -f php-apache.yml
بعد از ساخته شدن اپلیکیشن، میتونیم 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 تعریف شده برسه.
تا اینجا ما از autoscaling/v1 استفاده کردیم، ولی حالا توی نسخه جدیدتر میتونیم کارای بهتری مثل multiple metrics و یا custom metrics تعریف کنیم. به عنوان مثال در نمونه HPA زیر هم حالتی برای scaleUp تعریف کردیم و هم برای scaleDown کردن اپلیکیشن:
ما دسترسی به متریک های زیادی داریم که بتونیم قانون های خودمون رو تعریف کنیم، ما حتی میتونیم از label ها هم استفاده کنیم جدای از CPU و Ram. به عنوان مثال توی نمونه زیر ما متریک http_requests رو با لیبل verb استفاده کردیم:
توی سناریو بالا ما توی یک خط HPA رو تعریف کردیم، میتونیم همین قانون رو توی manifest قرار بدیم تا بعد به راحتی بتونیم تغییر بدیم، توی عکس زیر دقیقا همون سناریو رو توی manifest قرار دادیم و apply کردیم:
سعی شد توی این مقاله نمونه های کاملی از ساخت اپلیکیشن تا لود انداختن روی اپلیکیشن رو پیاده سازی کنیم و همین طور از HPAی که تعریف کردیم مطمئن شدیم که به درستی کار میکنه، نمونهای از v1 رو دیدیم و همین طور v2، توی نسخه v2 ما قابلیتهای بیشتری داریم هم توی متریک نویسی و هم توی قوانین scale UP/DOWN کردن اپلیکیشن ها.
منابع:
HorizontalPodAutoscaler Walkthrough
make a Kubernetes autoscaling HPA