Prometheus اور KEDA کا استعمال کرتے ہوئے Kubernetes ایپلی کیشنز کو آٹو اسکیلنگ کرنا

Prometheus اور KEDA کا استعمال کرتے ہوئے Kubernetes ایپلی کیشنز کو آٹو اسکیلنگ کرنابیلون مین بذریعہ Cimuanos

کلاؤڈ ایپلی کیشنز کے لیے اسکیل ایبلٹی ایک کلیدی ضرورت ہے۔ Kubernetes کے ساتھ، کسی درخواست کو اسکیل کرنا اتنا ہی آسان ہے جتنا کہ مناسب تعیناتی کے لیے نقل کی تعداد میں اضافہ کرنا یا ReplicaSet لیکن یہ ایک دستی عمل ہے۔

Kubernetes ایپلی کیشنز کو خود بخود اسکیل کرنے کی اجازت دیتا ہے (یعنی تعیناتی میں پوڈز یا ReplicaSetHorizontal Pod Autoscaler تفصیلات کا استعمال کرتے ہوئے اعلانیہ انداز میں۔ خودکار پیمانے کے لیے پہلے سے طے شدہ معیار CPU استعمال میٹرکس (وسائل میٹرکس) ہے، لیکن آپ اپنی مرضی کے مطابق اور بیرونی طور پر فراہم کردہ میٹرکس کو مربوط کر سکتے ہیں۔

ٹیم Mail.ru سے Kubernetes aaS Kubernetes ایپلیکیشن کو خود بخود اسکیل کرنے کے لیے بیرونی میٹرکس کے استعمال کے بارے میں ایک مضمون کا ترجمہ کیا۔ یہ دکھانے کے لیے کہ سب کچھ کیسے کام کرتا ہے، مصنف HTTP رسائی کی درخواست کے میٹرکس کا استعمال کرتا ہے، جو Prometheus کے ذریعے جمع کیے جاتے ہیں۔

پوڈز کی افقی آٹو اسکیلنگ کے بجائے، Kubernetes Event Driven Autoscaling (KEDA) استعمال کیا جاتا ہے، ایک اوپن سورس Kubernetes آپریٹر۔ یہ مقامی طور پر Horizontal Pod Autoscaler کے ساتھ ضم کرتا ہے تاکہ ایونٹ سے چلنے والے کام کے بوجھ کے لیے ہموار آٹو اسکیلنگ (بشمول/صفر سے) فراہم کی جا سکے۔ کوڈ دستیاب ہے۔ GitHub کے.

نظام کا مختصر جائزہ

Prometheus اور KEDA کا استعمال کرتے ہوئے Kubernetes ایپلی کیشنز کو آٹو اسکیلنگ کرنا

خاکہ ایک مختصر وضاحت دکھاتا ہے کہ سب کچھ کیسے کام کرتا ہے:

  1. ایپلیکیشن پرومیتھیس فارمیٹ میں HTTP ہٹ کاؤنٹ میٹرکس فراہم کرتی ہے۔
  2. پرومیتھیس کو ان میٹرکس کو جمع کرنے کے لیے ترتیب دیا گیا ہے۔
  3. KEDA میں Prometheus سکیلر کو HTTP ہٹ کی تعداد کی بنیاد پر ایپلیکیشن کو خود بخود اسکیل کرنے کے لیے ترتیب دیا گیا ہے۔

اب میں آپ کو ہر ایک عنصر کے بارے میں تفصیل سے بتاؤں گا۔

KEDA اور Prometheus

Prometheus ایک اوپن سورس سسٹم مانیٹرنگ اور الرٹنگ ٹول کٹ ہے، حصہ کلاؤڈ آبائی کمپیوٹنگ فاؤنڈیشن. مختلف ذرائع سے میٹرکس اکٹھا کرتا ہے اور انہیں ٹائم سیریز ڈیٹا کے طور پر اسٹور کرتا ہے۔ ڈیٹا کو تصور کرنے کے لیے آپ استعمال کر سکتے ہیں۔ گرافانا یا دیگر ویژولائزیشن ٹولز جو Kubernetes API کے ساتھ کام کرتے ہیں۔

KEDA اسکیلر کے تصور کی حمایت کرتا ہے - یہ KEDA اور بیرونی نظام کے درمیان ایک پل کا کام کرتا ہے۔ اسکیلر کا نفاذ ہر ہدف کے نظام کے لیے مخصوص ہے اور اس سے ڈیٹا نکالتا ہے۔ KEDA پھر انہیں خودکار پیمانے پر کنٹرول کرنے کے لیے استعمال کرتا ہے۔

اسکیلرز متعدد ڈیٹا ذرائع کی حمایت کرتے ہیں، مثال کے طور پر، کافکا، ریڈیس، پرومیتھیس۔ یعنی، KEDA کو Prometheus میٹرکس کو بطور معیار استعمال کرتے ہوئے Kubernetes کی تعیناتیوں کو خود بخود پیمانے کے لیے استعمال کیا جا سکتا ہے۔

ٹیسٹ کی درخواست

گولانگ ٹیسٹ ایپلیکیشن HTTP کے ذریعے رسائی فراہم کرتی ہے اور دو اہم کام انجام دیتی ہے:

  1. ایپلیکیشن کو آلہ بنانے اور http_requests میٹرک فراہم کرنے کے لیے Prometheus Go کلائنٹ لائبریری کا استعمال کرتا ہے، جس میں ہٹ کاؤنٹ ہوتا ہے۔ اختتامی نقطہ جہاں پرومیٹیس میٹرکس دستیاب ہیں URI پر واقع ہے۔ /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. ایک درخواست کے جواب میں GET ایپلی کیشن کلید کی قدر میں اضافہ کرتی ہے (access_count) ریڈیس میں۔ HTTP ہینڈلر کے حصے کے طور پر کام کرنے کا یہ ایک آسان طریقہ ہے اور Prometheus میٹرکس کو بھی چیک کریں۔ میٹرک قدر قدر کے برابر ہونی چاہیے۔ access_count Redis میں.
    func main() {
           http.Handle("/metrics", promhttp.Handler())
           http.HandleFunc("/test", func(w http.ResponseWriter, r 
    *http.Request) {
               defer httpRequestsCounter.Inc()
               count, err := client.Incr(redisCounterName).Result()
               if err != nil {
                   fmt.Println("Unable to increment redis counter", err)
                   os.Exit(1)
               }
               resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

ایپلیکیشن کوبرنیٹس کے ذریعے تعینات کیا گیا ہے۔ Deployment. ایک سروس بھی بنائی گئی ہے۔ ClusterIP، یہ پرومیتھیس سرور کو ایپلیکیشن میٹرکس حاصل کرنے کی اجازت دیتا ہے۔

یہاں درخواست کے لیے تعیناتی مینی فیسٹ.

پرومیتھیس سرور

Prometheus تعیناتی مینی فیسٹ پر مشتمل ہے:

  • ConfigMap - Prometheus config کو منتقل کرنے کے لیے؛
  • Deployment - کوبرنیٹس کلسٹر میں پرومیتھیس کی تعیناتی کے لیے؛
  • ClusterIP - UI Prometheus تک رسائی کے لیے خدمت؛
  • ClusterRole, ClusterRoleBinding и ServiceAccount - کبرنیٹس (آٹو ڈسکوری) میں خدمات کی خودکار کھوج کے لیے۔

یہاں Prometheus چلانے کے لئے ظاہر.

KEDA Prometheus ScaledObject

سکیلر KEDA اور بیرونی نظام کے درمیان ایک پل کا کام کرتا ہے جس سے میٹرکس حاصل کرنے کی ضرورت ہے۔ ScaledObject ایک حسب ضرورت وسیلہ ہے جس کی تعیناتی کو ایونٹ کے ماخذ کے ساتھ ہم آہنگ کرنے کے لیے تعینات کرنے کی ضرورت ہے، اس صورت میں Prometheus.

ScaledObject تعیناتی اسکیلنگ کی معلومات، ایونٹ کے ماخذ میٹا ڈیٹا (جیسے کنکشن کے راز، قطار کا نام)، پولنگ وقفہ، بحالی کی مدت، اور دیگر ڈیٹا پر مشتمل ہے۔ اس کے نتیجے میں تعیناتی کو پیمانہ کرنے کے لیے متعلقہ آٹو اسکیلنگ ریسورس (HPA ڈیفینیشن) نکلتا ہے۔

جب کوئی اعتراض ScaledObject حذف کر دیا جاتا ہے، متعلقہ HPA تعریف صاف ہو جاتی ہے۔

یہ ہے تعریف ScaledObject ہماری مثال کے طور پر، یہ اسکیلر کا استعمال کرتا ہے۔ Prometheus:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
 name: prometheus-scaledobject
 namespace: default
 labels:
   deploymentName: go-prom-app
spec:
 scaleTargetRef:
   deploymentName: go-prom-app
 pollingInterval: 15
 cooldownPeriod:  30
 minReplicaCount: 1
 maxReplicaCount: 10
 triggers:
 - type: prometheus
   metadata:
     serverAddress: 
http://prometheus-service.default.svc.cluster.local:9090
     metricName: access_frequency
     threshold: '3'
     query: sum(rate(http_requests[2m]))

براہ کرم درج ذیل نکات پر توجہ دیں:

  1. وہ اشارہ کرتا ہے۔ Deployment نام کے ساتھ go-prom-app.
  2. محرک کی قسم - Prometheus. پرومیتھیس سرور ایڈریس کا ذکر میٹرک نام، حد اور کے ساتھ کیا گیا ہے۔ PromQL استفسار، جو استعمال کیا جائے گا۔ PromQL سوال - sum(rate(http_requests[2m])).
  3. کے مطابق 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، لیکن آپ کوئی اور لے سکتے ہیں۔ وہاں ایک کلسٹر انسٹال کرنے کے لئے ہے رہنما.

میک پر تازہ ترین ورژن انسٹال کریں:

curl -Lo minikube 
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/

سیٹ کریں کیوبیکٹلKubernetes کلسٹر تک رسائی حاصل کرنے کے لیے۔

میک پر تازہ ترین ورژن انسٹال کریں:

curl -LO 
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

KEDA کی تنصیب

آپ KEDA کو کئی طریقوں سے تعینات کر سکتے ہیں، وہ درج ہیں۔ دستاویزات. میں یک سنگی YAML استعمال کر رہا ہوں:

kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml

KEDA اور اس کے اجزاء نام کی جگہ میں نصب ہیں۔ keda. چیک کرنے کا حکم:

kubectl get pods -n keda

KEDA آپریٹر کے شروع ہونے اور جانے کا انتظار کریں۔ Running State. اور اس کے بعد، جاری رکھیں.

ہیلم کا استعمال کرتے ہوئے Redis انسٹال کرنا

اگر آپ کے پاس ہیلم انسٹال نہیں ہے تو اسے استعمال کریں۔ قیادت. میک پر انسٹال کرنے کا حکم:

brew install kubernetes-helm
helm init --history-max 200

helm init مقامی کمانڈ لائن انٹرفیس کو شروع کرتا ہے اور انسٹال بھی کرتا ہے۔ Tiller کوبرنیٹس کلسٹر تک۔

kubectl get pods -n kube-system | grep tiller

ٹلر پوڈ کے چلنے والی حالت میں داخل ہونے کا انتظار کریں۔

مترجم کا نوٹ: مصنف Helm@2 کا استعمال کرتا ہے، جس کے لیے Tiller سرور جزو کو انسٹال کرنے کی ضرورت ہوتی ہے۔ اب Helm@3 متعلقہ ہے، اسے سرور کے حصے کی ضرورت نہیں ہے۔

ہیلم انسٹال کرنے کے بعد، Redis کو شروع کرنے کے لیے ایک کمانڈ ہی کافی ہے:

helm install --name redis-server --set cluster.enabled=false --set 
usePassword=false stable/redis

تصدیق کریں کہ Redis کامیابی سے شروع ہو گیا ہے:

kubectl get pods/redis-server-master-0

Redis ریاست میں جانے کا انتظار کریں۔ Running.

درخواست کی تعیناتی

تعیناتی کا حکم:

kubectl apply -f go-app.yaml

//output
deployment.apps/go-prom-app created
service/go-prom-app-service created

چیک کریں کہ سب کچھ شروع ہو گیا ہے:

kubectl get pods -l=app=go-prom-app

Redis ریاست میں داخل ہونے کا انتظار کریں۔ Running.

Prometheus سرور کی تعیناتی

Prometheus manifest استعمال کرتا ہے۔ Prometheus کے لیے Kubernetes سروس کی دریافت. یہ سروس لیبل کی بنیاد پر ایپلیکیشن پوڈز کی متحرک دریافت کی اجازت دیتا ہے۔

kubernetes_sd_configs:
   - role: service
   relabel_configs:
   - source_labels: [__meta_kubernetes_service_label_run]
     regex: go-prom-app-service
     action: keep

تعینات کرنے:

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.

kubectl port-forward service/prometheus-service 9090

KEDA آٹو اسکیلنگ کنفیگریشن تعینات کرنا

بنانے کا حکم ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

KEDA آپریٹر لاگز کو چیک کریں:

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 اینڈ پوائنٹ تک رسائی حاصل کرنے کے لیے، چلائیں:

kubectl port-forward service/go-prom-app-service 8080

اب آپ ایڈریس کا استعمال کر کے اپنی 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

لوڈ تخلیق

ہم استعمال کریں گے۔ ہے - بوجھ پیدا کرنے کی افادیت:

curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64 
&& chmod a+x hey

آپ یوٹیلیٹی کو ڈاؤن لوڈ بھی کر سکتے ہیں۔ لینکس یا ونڈوز.

اسے چلائیں:

./hey http://localhost:8080/test

پہلے سے طے شدہ طور پر، یوٹیلیٹی 200 درخواستیں بھیجتی ہے۔ آپ Prometheus میٹرکس کے ساتھ ساتھ Redis کا استعمال کرتے ہوئے اس کی تصدیق کر سکتے ہیں۔

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201

اصل میٹرک کی قدر کی توثیق کریں (PromQL استفسار کے ذریعہ واپس کیا گیا):

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}

اس صورت میں اصل نتیجہ ہے 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 استفسار کے ذریعے واپس کیا گیا)، تو کمانڈ استعمال کریں:

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'

صفائی

//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 کو اپنے میٹرکس بھی فراہم کرتا ہے۔

گڈ لک!

اور کیا پڑھنا ہے:

  1. پیداواری ماحول میں کنٹینرز اور کبرنیٹس کو چلانے کے لیے بہترین طرز عمل اور بہترین طریقہ کار.
  2. Kubernetes کے لیے 90+ مفید ٹولز: تعیناتی، انتظام، نگرانی، حفاظت اور مزید.
  3. ٹیلیگرام میں ہمارا چینل Around Kubernetes.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں