سلام خسته نباشید!
میخوام امروز راجب 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
باید خروجی شبیه به عکس زیر بهت بده
مرحله ی دوم !
تو این مرحله باید یک 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
رو تو گوگل بنویسید لینکدین من نمایش داده میشه !