کلاؤڈ ایپلی کیشنز کے لیے اسکیل ایبلٹی ایک کلیدی ضرورت ہے۔ Kubernetes کے ساتھ، کسی درخواست کو اسکیل کرنا اتنا ہی آسان ہے جتنا کہ مناسب تعیناتی کے لیے نقل کی تعداد میں اضافہ کرنا یا ReplicaSet لیکن یہ ایک دستی عمل ہے۔
Kubernetes ایپلی کیشنز کو خود بخود اسکیل کرنے کی اجازت دیتا ہے (یعنی تعیناتی میں پوڈز یا ReplicaSetHorizontal Pod Autoscaler تفصیلات کا استعمال کرتے ہوئے اعلانیہ انداز میں۔ خودکار پیمانے کے لیے پہلے سے طے شدہ معیار CPU استعمال میٹرکس (وسائل میٹرکس) ہے، لیکن آپ اپنی مرضی کے مطابق اور بیرونی طور پر فراہم کردہ میٹرکس کو مربوط کر سکتے ہیں۔
ٹیم Mail.ru سے Kubernetes aaS Kubernetes ایپلیکیشن کو خود بخود اسکیل کرنے کے لیے بیرونی میٹرکس کے استعمال کے بارے میں ایک مضمون کا ترجمہ کیا۔ یہ دکھانے کے لیے کہ سب کچھ کیسے کام کرتا ہے، مصنف HTTP رسائی کی درخواست کے میٹرکس کا استعمال کرتا ہے، جو Prometheus کے ذریعے جمع کیے جاتے ہیں۔
پوڈز کی افقی آٹو اسکیلنگ کے بجائے، Kubernetes Event Driven Autoscaling (KEDA) استعمال کیا جاتا ہے، ایک اوپن سورس Kubernetes آپریٹر۔ یہ مقامی طور پر Horizontal Pod Autoscaler کے ساتھ ضم کرتا ہے تاکہ ایونٹ سے چلنے والے کام کے بوجھ کے لیے ہموار آٹو اسکیلنگ (بشمول/صفر سے) فراہم کی جا سکے۔ کوڈ دستیاب ہے۔ GitHub کے.
نظام کا مختصر جائزہ
خاکہ ایک مختصر وضاحت دکھاتا ہے کہ سب کچھ کیسے کام کرتا ہے:
ایپلیکیشن پرومیتھیس فارمیٹ میں HTTP ہٹ کاؤنٹ میٹرکس فراہم کرتی ہے۔
پرومیتھیس کو ان میٹرکس کو جمع کرنے کے لیے ترتیب دیا گیا ہے۔
KEDA میں Prometheus سکیلر کو HTTP ہٹ کی تعداد کی بنیاد پر ایپلیکیشن کو خود بخود اسکیل کرنے کے لیے ترتیب دیا گیا ہے۔
اب میں آپ کو ہر ایک عنصر کے بارے میں تفصیل سے بتاؤں گا۔
KEDA اور Prometheus
Prometheus ایک اوپن سورس سسٹم مانیٹرنگ اور الرٹنگ ٹول کٹ ہے، حصہ کلاؤڈ آبائی کمپیوٹنگ فاؤنڈیشن. مختلف ذرائع سے میٹرکس اکٹھا کرتا ہے اور انہیں ٹائم سیریز ڈیٹا کے طور پر اسٹور کرتا ہے۔ ڈیٹا کو تصور کرنے کے لیے آپ استعمال کر سکتے ہیں۔ گرافانا یا دیگر ویژولائزیشن ٹولز جو Kubernetes API کے ساتھ کام کرتے ہیں۔
KEDA اسکیلر کے تصور کی حمایت کرتا ہے - یہ KEDA اور بیرونی نظام کے درمیان ایک پل کا کام کرتا ہے۔ اسکیلر کا نفاذ ہر ہدف کے نظام کے لیے مخصوص ہے اور اس سے ڈیٹا نکالتا ہے۔ KEDA پھر انہیں خودکار پیمانے پر کنٹرول کرنے کے لیے استعمال کرتا ہے۔
اسکیلرز متعدد ڈیٹا ذرائع کی حمایت کرتے ہیں، مثال کے طور پر، کافکا، ریڈیس، پرومیتھیس۔ یعنی، KEDA کو Prometheus میٹرکس کو بطور معیار استعمال کرتے ہوئے Kubernetes کی تعیناتیوں کو خود بخود پیمانے کے لیے استعمال کیا جا سکتا ہے۔
ٹیسٹ کی درخواست
گولانگ ٹیسٹ ایپلیکیشن HTTP کے ذریعے رسائی فراہم کرتی ہے اور دو اہم کام انجام دیتی ہے:
ایپلیکیشن کو آلہ بنانے اور http_requests میٹرک فراہم کرنے کے لیے Prometheus Go کلائنٹ لائبریری کا استعمال کرتا ہے، جس میں ہٹ کاؤنٹ ہوتا ہے۔ اختتامی نقطہ جہاں پرومیٹیس میٹرکس دستیاب ہیں URI پر واقع ہے۔ /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
ایک درخواست کے جواب میں GET ایپلی کیشن کلید کی قدر میں اضافہ کرتی ہے (access_count) ریڈیس میں۔ HTTP ہینڈلر کے حصے کے طور پر کام کرنے کا یہ ایک آسان طریقہ ہے اور Prometheus میٹرکس کو بھی چیک کریں۔ میٹرک قدر قدر کے برابر ہونی چاہیے۔ access_count Redis میں.
ایپلیکیشن کوبرنیٹس کے ذریعے تعینات کیا گیا ہے۔ Deployment. ایک سروس بھی بنائی گئی ہے۔ ClusterIP، یہ پرومیتھیس سرور کو ایپلیکیشن میٹرکس حاصل کرنے کی اجازت دیتا ہے۔
سکیلر KEDA اور بیرونی نظام کے درمیان ایک پل کا کام کرتا ہے جس سے میٹرکس حاصل کرنے کی ضرورت ہے۔ ScaledObject ایک حسب ضرورت وسیلہ ہے جس کی تعیناتی کو ایونٹ کے ماخذ کے ساتھ ہم آہنگ کرنے کے لیے تعینات کرنے کی ضرورت ہے، اس صورت میں Prometheus.
ScaledObject تعیناتی اسکیلنگ کی معلومات، ایونٹ کے ماخذ میٹا ڈیٹا (جیسے کنکشن کے راز، قطار کا نام)، پولنگ وقفہ، بحالی کی مدت، اور دیگر ڈیٹا پر مشتمل ہے۔ اس کے نتیجے میں تعیناتی کو پیمانہ کرنے کے لیے متعلقہ آٹو اسکیلنگ ریسورس (HPA ڈیفینیشن) نکلتا ہے۔
جب کوئی اعتراض ScaledObject حذف کر دیا جاتا ہے، متعلقہ HPA تعریف صاف ہو جاتی ہے۔
یہ ہے تعریف ScaledObject ہماری مثال کے طور پر، یہ اسکیلر کا استعمال کرتا ہے۔ Prometheus:
وہ اشارہ کرتا ہے۔ Deployment نام کے ساتھ go-prom-app.
محرک کی قسم - 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، لیکن آپ کوئی اور لے سکتے ہیں۔ وہاں ایک کلسٹر انسٹال کرنے کے لئے ہے رہنما.
helm init مقامی کمانڈ لائن انٹرفیس کو شروع کرتا ہے اور انسٹال بھی کرتا ہے۔ Tiller کوبرنیٹس کلسٹر تک۔
kubectl get pods -n kube-system | grep tiller
ٹلر پوڈ کے چلنے والی حالت میں داخل ہونے کا انتظار کریں۔
مترجم کا نوٹ: مصنف Helm@2 کا استعمال کرتا ہے، جس کے لیے Tiller سرور جزو کو انسٹال کرنے کی ضرورت ہوتی ہے۔ اب Helm@3 متعلقہ ہے، اسے سرور کے حصے کی ضرورت نہیں ہے۔
ہیلم انسٹال کرنے کے بعد، Redis کو شروع کرنے کے لیے ایک کمانڈ ہی کافی ہے:
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 پرومیٹیس یوزر انٹرفیس (یا 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 تعیناتی کو بڑھا رہا ہے اور نئے پوڈز لانچ کرتا ہے۔ یہ یقینی بنانے کے لیے اپنا 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 کی تعیناتیوں کو (صفر سے/صفر تک) خود بخود پیمانے کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، Prometheus میٹرکس کی بنیاد پر، Redis میں قطار کی لمبائی، Kafka موضوع میں صارفین کی تاخیر۔
KEDA ایک بیرونی ذریعہ کے ساتھ ضم ہوتا ہے اور میٹرکس سرور کے ذریعے Horizontal Pod Autoscaler کو اپنے میٹرکس بھی فراہم کرتا ہے۔