مقیاس پذیری یک نیاز کلیدی برای برنامه های کاربردی ابری است. با Kubernetes، مقیاسبندی یک برنامه به سادگی افزایش تعداد کپیها برای استقرار مناسب یا ReplicaSet - اما این یک فرآیند دستی است.
Kubernetes اجازه می دهد تا برنامه ها به طور خودکار مقیاس شوند (یعنی Pods در یک استقرار یا ReplicaSet) به صورت اعلامی با استفاده از مشخصات Horizontal Pod Autoscaler. معیار پیشفرض برای مقیاسبندی خودکار، معیارهای استفاده از CPU (معیارهای منابع) است، اما میتوانید معیارهای سفارشی و ارائهشده خارجی را ادغام کنید.
تیم Kubernetes aaS از Mail.ru مقاله ای در مورد نحوه استفاده از معیارهای خارجی برای مقیاس خودکار یک برنامه Kubernetes ترجمه کرد. برای نشان دادن اینکه همه چیز چگونه کار می کند، نویسنده از معیارهای درخواست دسترسی HTTP استفاده می کند که با استفاده از Prometheus جمع آوری می شوند.
به جای مقیاس خودکار افقی pods، Kubernetes Event Driven Autoscaling (KEDA) استفاده می شود، یک اپراتور Kubernetes منبع باز. این به طور بومی با Horizontal Pod Autoscaler ادغام می شود تا مقیاس خودکار یکپارچه (از جمله از/صفر) را برای بارهای کاری مبتنی بر رویداد فراهم کند. کد موجود در GitHub.
مروری کوتاه بر سیستم
نمودار شرح مختصری از نحوه کار همه چیز را نشان می دهد:
این برنامه معیارهای تعداد بازدید HTTP را در قالب Prometheus ارائه می دهد.
پرومتئوس برای جمع آوری این معیارها پیکربندی شده است.
مقیاسکننده Prometheus در KEDA به گونهای پیکربندی شده است که به طور خودکار برنامه را بر اساس تعداد بازدیدهای HTTP مقیاسبندی کند.
اکنون در مورد هر عنصر به طور کامل به شما خواهم گفت.
KEDA و پرومتئوس
Prometheus یک مجموعه ابزار مانیتورینگ و هشدار سیستم منبع باز است بنیاد رایانش بومی ابر. معیارها را از منابع مختلف جمع آوری می کند و آنها را به عنوان داده های سری زمانی ذخیره می کند. برای تجسم داده ها می توانید استفاده کنید گرافانا یا سایر ابزارهای تجسمی که با Kubernetes API کار می کنند.
KEDA از مفهوم مقیاس کننده پشتیبانی می کند - به عنوان پلی بین KEDA و سیستم خارجی عمل می کند. پیاده سازی مقیاس کننده برای هر سیستم هدف خاص است و داده ها را از آن استخراج می کند. سپس KEDA از آنها برای کنترل مقیاس بندی خودکار استفاده می کند.
مقیاسکنندهها از چندین منبع داده مانند کافکا، ردیس، پرومتئوس پشتیبانی میکنند. یعنی، KEDA را می توان برای مقیاس خودکار استقرار Kubernetes با استفاده از معیارهای Prometheus به عنوان معیار استفاده کرد.
نرم افزار تست
برنامه تست Golang دسترسی را از طریق HTTP فراهم می کند و دو عملکرد مهم را انجام می دهد:
از کتابخانه مشتری Prometheus Go برای ابزار دقیق برنامه و ارائه معیار http_requests که حاوی تعداد بازدید است استفاده می کند. نقطه پایانی که معیارهای Prometheus در آن موجود است در URI قرار دارد /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
در پاسخ به یک درخواست GET برنامه مقدار کلید را افزایش می دهد (access_count) در ردیس. این یک راه آسان برای انجام کار به عنوان بخشی از یک کنترل کننده HTTP و همچنین بررسی معیارهای Prometheus است. مقدار متریک باید با مقدار یکسان باشد access_count در ردیس
برنامه از طریق Kubernetes مستقر شده است Deployment. یک سرویس نیز ایجاد می شود ClusterIP، به سرور Prometheus اجازه می دهد تا معیارهای برنامه را بدست آورد.
مقیاسکننده بهعنوان پلی بین KEDA و سیستم خارجی عمل میکند که باید معیارها را از آن بهدست آورد. ScaledObject یک منبع سفارشی است که باید برای همگام سازی استقرار با منبع رویداد، در این مورد Prometheus، مستقر شود.
ScaledObject حاوی اطلاعات مقیاس بندی استقرار، ابرداده منبع رویداد (مانند اسرار اتصال، نام صف)، فاصله نظرسنجی، دوره بازیابی و سایر داده ها است. این منجر به منبع مقیاس خودکار متناظر (تعریف HPA) برای مقیاسبندی استقرار میشود.
وقتی یک شی ScaledObject حذف می شود، تعریف HPA مربوطه پاک می شود.
در اینجا تعریف است ScaledObject برای مثال ما، از مقیاسکننده استفاده میکند Prometheus:
نوع ماشه - Prometheus. آدرس سرور Prometheus به همراه نام متریک، آستانه و پرس و جو PromQL، که مورد استفاده قرار خواهد گرفت. درخواست PromQL - sum(rate(http_requests[2m])).
طبق pollingIntervalKEDA هر پانزده ثانیه یک هدف از پرومتئوس درخواست می کند. حداقل یکی زیر (minReplicaCount، و حداکثر تعداد غلاف ها تجاوز نمی کند maxReplicaCount (در این مثال - ده).
می تواند نصب کند minReplicaCount برابر با صفر در این مورد، KEDA استقرار صفر به یک را فعال می کند و سپس HPA را برای مقیاس بندی خودکار بیشتر در معرض دید قرار می دهد. ترتیب معکوس نیز امکان پذیر است، یعنی مقیاس بندی از یک به صفر. در مثال، ما صفر را انتخاب نکردیم زیرا این یک سرویس HTTP است و یک سیستم درخواستی نیست.
جادوی درون مقیاس خودکار
آستانه به عنوان یک ماشه برای مقیاس بندی استقرار استفاده می شود. در مثال ما، پرس و جو PromQL sum(rate (http_requests [2m])) نرخ درخواست HTTP تجمیع شده (درخواست در ثانیه) را که در دو دقیقه گذشته اندازه گیری شده است، برمی گرداند.
از آنجایی که مقدار آستانه سه است، به این معنی است که یک زیر در حالی که مقدار وجود دارد sum(rate (http_requests [2m])) کمتر از سه اگر مقدار افزایش یابد، هر بار یک زیر اضافی اضافه می شود sum(rate (http_requests [2m])) سه افزایش می یابد. به عنوان مثال، اگر مقدار از 12 تا 14 باشد، تعداد غلاف ها چهار است.
حالا بیایید راه اندازی آن را امتحان کنیم!
از پیش تنظیم
تنها چیزی که نیاز دارید یک خوشه Kubernetes و یک ابزار پیکربندی شده است kubectl. این مثال از یک خوشه استفاده می کند minikube، اما شما می توانید هر نوع دیگری را بردارید. برای نصب یک کلاستر وجود دارد رهبری.
kubectl apply -f prometheus.yaml
//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created
بررسی کنید که همه چیز شروع شده است:
kubectl get pods -l=app=prometheus-server
منتظر بمانید تا پرومتئوس به حالت اولیه برود Running.
استفاده کنید kubectl port-forward برای دسترسی به رابط کاربری Prometheus (یا سرور API) در http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
نتیجه چیزی شبیه به این است:
time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with
namespace default and name keda-hpa-go-prom-app"
زیر برنامه ها را بررسی کنید. یک نمونه باید در حال اجرا باشد زیرا minReplicaCount برابر 1:
kubectl get pods -l=app=go-prom-app
بررسی کنید که منبع HPA با موفقیت ایجاد شده است:
kubectl get hpa
شما باید چیزی شبیه به:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
بررسی سلامت: دسترسی به برنامه
برای دسترسی به نقطه پایانی REST برنامه ما، اجرا کنید:
اکنون می توانید با استفاده از آدرس به برنامه Go خود دسترسی پیدا کنید http://localhost:8080. برای این کار دستور را اجرا کنید:
curl http://localhost:8080/test
نتیجه چیزی شبیه به این است:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
در این مرحله Redis را نیز بررسی کنید. خواهید دید که کلید access_count به 1 افزایش یافت:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
مطمئن شوید که مقدار متریک است http_requests همان:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
در این صورت نتیجه واقعی است 1,686057971014493 و در فیلد نمایش داده می شود value. این برای مقیاس بندی کافی نیست، زیرا آستانه ای که ما تعیین می کنیم 3 است.
بار بیشتر!
در ترمینال جدید، بر تعداد پادهای برنامه نظارت کنید:
kubectl get pods -l=app=go-prom-app -w
بیایید بار را با استفاده از دستور افزایش دهیم:
./hey -n 2000 http://localhost:8080/test
پس از مدتی، HPA را خواهید دید که مقیاس استقرار و راه اندازی pod های جدید را انجام می دهد. HPA خود را بررسی کنید تا مطمئن شوید:
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 1830m/3 (avg) 1 10 6 4m22s
اگر بار ناسازگار باشد، استقرار تا جایی کاهش می یابد که فقط یک غلاف در حال اجرا باشد. اگر می خواهید متریک واقعی را بررسی کنید (بازگردانده شده توسط پرس و جو PromQL)، از دستور استفاده کنید:
//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server
نتیجه
KEDA به شما این امکان را می دهد که به طور خودکار استقرارهای Kubernetes خود را (به/از صفر) بر اساس داده های معیارهای خارجی مقیاس کنید. به عنوان مثال، بر اساس معیارهای پرومتئوس، طول صف در Redis، تأخیر مصرف کننده در موضوع کافکا.
KEDA با یک منبع خارجی ادغام می شود و همچنین معیارهای خود را از طریق Metrics Server به Horizontal Pod Autoscaler ارائه می دهد.