Prometheus ۽ KEDA استعمال ڪندي ڪبرنيٽس ايپليڪيشنن کي خودڪار ڪرڻ

Prometheus ۽ KEDA استعمال ڪندي ڪبرنيٽس ايپليڪيشنن کي خودڪار ڪرڻبلون انسان پاران Cimuanos

ڪلائوڊ ايپليڪيشنن لاءِ اسڪاليبلٽي هڪ اهم ضرورت آهي. ڪبرنيٽس سان، ايپليڪيشن کي اسڪيل ڪرڻ ايترو آسان آهي جيترو مناسب ڊيپلائيشن لاءِ نقلن جو تعداد وڌائڻ يا ReplicaSet - پر اهو هڪ دستي عمل آهي.

Kubernetes ايپليڪيشنن کي خودڪار طريقي سان ماپ ڪرڻ جي اجازت ڏئي ٿو (يعني پوڊس ۾ ڊيپلائيمينٽ يا ReplicaSet) افقي پوڊ آٽو اسڪيلر جي وضاحت کي استعمال ڪندي بيان ڪيل انداز ۾. خودڪار اسڪيلنگ لاءِ ڊفالٽ معيار سي پي يو استعمال ميٽرڪس (وسيع ميٽرڪس) آهي، پر توهان ڪسٽم ۽ خارجي طور تي مهيا ڪيل ميٽرڪس کي ضم ڪري سگهو ٿا.

ٽيم Mail.ru کان Kubernetes aaS هڪ مضمون جو ترجمو ڪيو ويو آهي ته ڪيئن استعمال ڪجي ٻاهرين ميٽرڪس کي خودڪار طريقي سان ماپڻ لاءِ ڪبرنيٽس ايپليڪيشن. اهو ڏيکارڻ لاءِ ته سڀ ڪجهه ڪيئن ڪم ڪري ٿو، ليکڪ استعمال ڪري ٿو HTTP رسائي جي درخواست ميٽرڪس، جيڪي گڏ ڪيا ويا آهن پروميٿيس استعمال ڪندي.

پوڊز جي افقي آٽو اسڪيلنگ جي بدران، ڪبرنيٽس ايونٽ ڊريوين آٽو اسڪيلنگ (KEDA) استعمال ڪيو ويندو آهي، هڪ اوپن سورس ڪبرنيٽس آپريٽر. اهو مقامي طور تي Horizontal Pod Autoscaler سان ضم ڪري ٿو ته ايونٽ تي هلندڙ ڪم لوڊ لاءِ بيحد آٽو اسڪيلنگ (بشمول / صفر کان) مهيا ڪرڻ لاءِ. ڪوڊ تي دستياب آهي GitHub.

سسٽم جو مختصر جائزو

Prometheus ۽ KEDA استعمال ڪندي ڪبرنيٽس ايپليڪيشنن کي خودڪار ڪرڻ

ڊراگرام هڪ مختصر وضاحت ڏيکاري ٿو ته هر شي ڪيئن ڪم ڪري ٿي:

  1. ايپليڪيشن پروميٿيوس فارميٽ ۾ HTTP هٽ ڳڻپ ميٽرڪس مهيا ڪري ٿي.
  2. Prometheus انهن ماپن کي گڏ ڪرڻ لاءِ ترتيب ڏنو ويو آهي.
  3. KEDA ۾ Prometheus اسڪيلر ترتيب ڏنل آهي خودڪار طريقي سان ايپليڪيشن کي ماپڻ لاءِ HTTP هٽن جي تعداد جي بنياد تي.

هاڻي مان توهان کي هر عنصر بابت تفصيل سان ٻڌايان ٿو.

KEDA ۽ Prometheus

Prometheus هڪ اوپن سورس سسٽم مانيٽرنگ ۽ خبردار ڪرڻ وارو ٽول ڪٽ آهي، حصو ڪلائوڊ اصلي ڪمپيوٽنگ فائونڊيشن. مختلف ذريعن کان ميٽرڪ گڏ ڪري ٿو ۽ انهن کي ٽائيم سيريز ڊيٽا طور محفوظ ڪري ٿو. ڊيٽا کي ڏسڻ لاء توهان استعمال ڪري سگهو ٿا گرافانا يا ٻيا بصري اوزار جيڪي ڪبرنيٽس API سان ڪم ڪن ٿا.

KEDA اسڪيلر جي تصور کي سپورٽ ڪري ٿو - اهو KEDA ۽ خارجي نظام جي وچ ۾ هڪ پل جي طور تي ڪم ڪري ٿو. اسڪيلر لاڳو ڪرڻ هر ٽارگيٽ سسٽم لاء مخصوص آهي ۽ ان مان ڊيٽا ڪڍي ٿو. KEDA وري انهن کي استعمال ڪري ٿو خودڪار اسڪيلنگ کي ڪنٽرول ڪرڻ لاءِ.

اسڪالر ڪيترن ئي ڊيٽا ذريعن کي سپورٽ ڪن ٿا، مثال طور، ڪافڪا، ريڊس، پروميٿيوس. اهو آهي، KEDA استعمال ڪري سگهجي ٿو خودڪار طور تي ڪبرنيٽس جي ڊيپلائيمينٽ کي ماپڻ لاءِ Prometheus metrics کي معيار طور استعمال ڪندي.

ٽيسٽ ايپليڪيشن

گولانگ ٽيسٽ ايپليڪيشن HTTP ذريعي رسائي فراهم ڪري ٿي ۽ ٻه اهم ڪم انجام ڏئي ٿي:

  1. استعمال ڪري ٿو Prometheus Go ڪلائنٽ لئبريري ايپليڪيشن کي اوزار ڏيڻ ۽ مهيا ڪرڻ لاءِ http_requests ميٽرڪ، جنهن ۾ هٽ ڳڻپ شامل آهي. آخري پوائنٽ جتي پروميٿيوس ميٽرڪس موجود آهن URI تي واقع آهي /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. هڪ درخواست جي جواب ۾ GET اپليڪيشن ڪي جي قيمت وڌائي ٿي (access_count) ريڊس ۾. هي HTTP هينڊلر جي حصي طور ڪم ڪرڻ جو هڪ آسان طريقو آهي ۽ پرومٿيوس ميٽرڪس کي به چيڪ ڪريو. ميٽرڪ قدر لازمي طور تي ساڳيو هجڻ گهرجي access_count ريڊس ۾.
    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 سرور

Prometheus جي مقرري جي منشور تي مشتمل آهي:

  • ConfigMap - Prometheus config کي منتقل ڪرڻ لاء؛
  • Deployment - ڪبرنيٽس ڪلستر ۾ پروميٿيس کي ترتيب ڏيڻ لاء؛
  • ClusterIP - UI Prometheus تائين رسائي جي خدمت؛
  • ClusterRole, ClusterRoleBinding и ServiceAccount - Kubernetes (خودڪار دريافت) ۾ خدمتن جي خودڪار ڳولڻ لاء.

هتي 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. Prometheus سرور ايڊريس سان گڏ ذڪر ڪيو ويو آهي ميٽرڪ نالو، حد ۽ PromQL سوال، جيڪو استعمال ڪيو ويندو. PromQL سوال - sum(rate(http_requests[2m])).
  3. جي مطابق pollingIntervalKEDA هر پندرهن سيڪنڊن ۾ Prometheus کان هڪ ٽارگيٽ جي درخواست ڪري ٿو. گهٽ ۾ گهٽ هڪ هيٺ (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 تائين آهي، پوء پوڊ جو تعداد چار آهي.

هاڻي اچو ته ان کي ترتيب ڏيڻ جي ڪوشش ڪريو!

اڳئين سيٽنگ

توهان کي صرف هڪ ڪبرنيٽس ڪلستر ۽ ترتيب ڏنل يوٽيلٽي جي ضرورت آهي kubectl. هي مثال ڪلستر استعمال ڪري ٿو minikubeپر توهان ڪنهن ٻئي کي وٺي سگهو ٿا. اتي موجود ڪلستر کي انسٽال ڪرڻ لاء رهنمائي ڪندڙ.

Mac تي جديد نسخو انسٽال ڪريو:

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/

سيٽ ڪيوبڪبلڪبرنيٽس ڪلستر تائين رسائي حاصل ڪرڻ لاء.

Mac تي جديد نسخو انسٽال ڪريو:

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 کي ڪيترن ئي طريقن سان ترتيب ڏئي سگھو ٿا، اھي درج ٿيل آھن دستاويز. مان استعمال ڪري رهيو آهيان monolithic YAML:

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

KEDA ۽ ان جا حصا نالا اسپيس ۾ نصب ٿيل آھن keda. چيڪ ڪرڻ لاء حڪم:

kubectl get pods -n keda

KEDA آپريٽر جي شروع ٿيڻ لاءِ انتظار ڪريو ۽ وڃو Running State. ۽ ان کان پوء، جاري رکو.

Helm استعمال ڪندي Redis انسٽال ڪرڻ

جيڪڏهن توهان وٽ هيلم نصب نه آهي، هي استعمال ڪريو قيادت. Mac تي انسٽال ڪرڻ لاءِ حڪم:

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

helm init مقامي ڪمانڊ لائن انٽرفيس کي شروع ڪري ٿو ۽ انسٽال ڪري ٿو Tiller Kubernetes ڪلستر ڏانهن.

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

تصديق ڪريو ته ريڊس ڪاميابي سان شروع ٿي چڪو آهي:

kubectl get pods/redis-server-master-0

رياست ۾ وڃڻ لاء ريڊس جو انتظار ڪريو 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 استعمال ڪري ٿو پرومٿيوس لاءِ ڪبرنيٽس سروس دريافت. اهو خدمت ليبل جي بنياد تي ايپليڪيشن پوڊ جي متحرڪ دريافت جي اجازت ڏئي ٿو.

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 Prometheus يوزر انٽرفيس (يا 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 metrics سان گڏوگڏ 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 توهان کي اجازت ڏئي ٿو ته خود بخود توهان جي ڪبرنيٽس ڊيپلائيمينٽ کي ماپڻ (صفر کان/ تائين) خارجي ميٽرڪس جي ڊيٽا جي بنياد تي. مثال طور، Prometheus metrics جي بنياد تي، ريڊس ۾ قطار جي ڊيگهه، ڪافڪا موضوع ۾ صارفين جي ويڪرائي.

KEDA هڪ خارجي ماخذ سان ضم ٿي ٿو ۽ پڻ مهيا ڪري ٿو ان جي ميٽرڪس کي Metrics سرور ذريعي Horizontal Pod Autoscaler.

ڪامياب!

ٻيو ڇا پڙهو:

  1. پيداوار جي ماحول ۾ ڪنٽينرز ۽ ڪبرنيٽس کي هلائڻ لاءِ بهترين طريقا ۽ بهترين طريقا.
  2. ڪبرنيٽس لاءِ 90+ مفيد اوزار: مقرري، انتظام، نگراني، سيڪيورٽي ۽ وڌيڪ.
  3. اسان جو چينل Around Kubernetes ٽيليگرام ۾.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو