behnam.hasanbeygi
behnam.hasanbeygi
خواندن ۴ دقیقه·۴ سال پیش

HPA in kubernetes

سلام خسته نباشید!

میخوام امروز راجب horizontal pod autoscaler صحبت کنم و یک اموزش مختصری هم برای شما قرار بدم!

مفهوم HPA چی هست!؟

شما تصور کنید در ساعت به خصوصی از شبانه روز مقدار load که وارد میشه برای web application که دارید افزایش پیدا میکنه مثلا در ساعت ۸ شب که کارمندا برگشتن خونه میخوان قسط هاشون از طریق یک web application پرداخت کنن مقدار load که به این web application وارد میشه جواب گوی این همه request یا درخواست نیست پس بنابراین web app داون میشه ۵۰۲ ظاهر میشه! در بقیه طول شبانه روز شاید این سیستم جواب گوی درخواست ها باشه ولی تو یک زمان های خاصی حالا به دلیل درخواست زیاد web app شما از میدان به خارج میشه شاید فکر کنید مشکل از کد شماست! نه اینجور نیست!

یکی از سرویس های جذاب kubernetes این قابلیت برای شما فراهم میکنه که بر اساس میزان بالا رفتن استفاده pod ها از cpu یا memory تعداد pod ها یا web application شما رو افزایش و کاهش میده به صورت dynamic.

شما باید اول تو ذهنتون تصور کنید چی میخوایید و چطوری بهش دست پیدا کنید!

شما میخوایید به صورت اتوماتیک مقدار pod های که دارید افزایش پیدا کنه و سپس کاهش پیدا کنه !!

پس شما باید یه سیستمی رو پیاده سازی کنید که میزان استفاده pod ها از cpu و RAM بهتون نشون بده و بعدش یک trigger بزارید که اگر از این حد مقدار استفاده از cpu یا RAM توسط pod بیشتر شد مقدار replica یا pod های شما رو افزایش بده!

نیازمندی ها:

یک کلاستر kubernetes

کامند kubectl

مرحله ی اول:

تو این مرحله باید یک ابزار رو روی کلاستر نصب کنید که به شما میزان RAM و CPU استفاده شده توسط pod رو نشون بده!

دو تا ابزار وجود داره یکی heapster و دیگری kubernetes-metric

به دلیل اینکه kubernetes-metric جدید تر و heapster یه جورای deprecated شده ما از k-metrics استفاده میکنیم!

توی repository خودم به ادرس زیر

https://github.com/Behnamhb/kubernetes.git

تو این repo سه تا فایل رو مشاهده میکنید

components.yaml

hpa.yaml

nginx-deployment.yaml

با کامند زیر kubernetes-metric توی کلاستر خودتون فعال کنید

kubectl create -f components.yaml

چند لحظه صبر کنید تا image pull بشه و بعد command زیر رو اجرا کن

kubectl top nodes

باید خروجی شبیه به عکس زیر بهت بده

initial components
initial components


مرحله ی دوم !

تو این مرحله باید یک deployment برای web app خودتون بنویسید

من به طور مثال من یک deployment برای nginx نوشتم بدین شکل!

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx

labels:

app: nginx

spec:

replicas: 1

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx

resources:

limits:

cpu : 100m

requests:

cpu: 100m

مهم ترین قسمت این deployment خط های اخر که شما میای محدودیتی رو برای استفاده ی pod از مقدار cpu سرورت میکنی که اینجا من ۱۰۰m رو انتخاب کردم

با کامند زیر این deployment روی کلاستر پیاده سازی کنید

kubectl create -f nginx-deployment.yaml

و بعد از ساخته شدن یک pod حالا میریم برای مرحله ی بعد

مرحله ی سوم !

تو این قسمت میای hpa.yaml رو پیاده سازی میکنی!

apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

name: nginx

spec:

maxReplicas: 5

minReplicas: 1

scaleTargetRef:

apiVersion: apps/v1

kind: Deployment

name: nginx

targetCPUUtilizationPercentage: 20

تو این yaml فایل ما اومدیم یک kind تشکیل دادیم از نوع HorizontalPodAutoscaler که اسم هست nginx و چیزی که مد نظر ما هست اینه که حداقل ۱ pod در حال اجرا باشهmin و حداکثر ۵ تا pod در حالتی که load رو webapp زیاد هست افزایش پیدا بکنه max یعنی گستره ای بین ۱ تا ۵ تا pod رو براتون اجرا میکنه! تو این قسمت targetCPUUtilizationPercentage یک trigger تعریف کردیم که میگه اگر مجموع مصرف cpu بیش تر از ۲۰ درصد بشه تعداد pod ها رو افزایش میده و مرحله به مرحله به ۵ تا میرسونه!

با کامند زیر hpa روی کلاستر اعمال کنید

kubectl create -f hpa.yaml

مرحله ی اخر

تست کردن این موضوع به این شکل که باید از یک command به اسم siege استفاده کنید که روی web app تون load ریخته بشه!

اولین یک سرویس بنویسید که این deployment بتونه دیده بشه یا به قول معروف یک راهی داشته باشه به جهان

kubectl expose deploy nginx --port 80 --type NodePort

وقتی سرویس ساخته شد یک پورت اختصاص داده میشه به این deployment که اون رو اگر روی browser تون چک کنید بایدwelcome nginx رو بتونید ببینید!

حالا اگر IP هر کدوم از worker هاتون رو با port مورد نظر(برای من اینجا ۳۲۵۷۴ به صورت رندوم ساخته میشه ) توی browser چک کنید بایدwelcome رو ببینید!

خب قبل از load ریختن چک میکنیم مقدار pod هامون که تعدادش چندتاست

حالا این command رو اجرا میکنیم برای ریختن load روی deployment

اگر کامند siege رو ندارید اون رو نصب کنید

apt-get install siege

yum install siege

siege -q -c 5 -t 3m http://IP:PORT

حالا چک کنید ببینید مقدار pod های شما افزایش پیدا میکنه !

تعداد replicas رو نگاه کنید که ۴ عدد و به ۵ هم میرسه ! اون target دقت کنید عدد سمت چپ مربوط به load کلی که بر روی cpu افتاده از طرف pod و عدد سمت راست همون مقدار ۲۰ درصدی که تعیین کردیم برای افزایش یا کاهش pod ها

و بعد از حدود ۵ دقیقه از تموم شدن command siege باید تعداد pod ها به همون عدد ۱ برگرده به این صورت


امیدوارم که خوشتون اومده باشه :)

هر سوالی نظری و انتقادی داشتید با کمال میل میپذیرم و راه های پیدا کردن من هم ساده س

behnam hasanbeygi

رو تو گوگل بنویسید لینکدین من نمایش داده میشه !

kubernetesdevopshpahorizentalautoscalinglinux
MLOps and data science @ AIFA team
شاید از این پست‌ها خوشتان بیاید