د Prometheus او KEDA په کارولو سره د کبرنیټس غوښتنلیکونه اتومات کول

د Prometheus او KEDA په کارولو سره د کبرنیټس غوښتنلیکونه اتومات کولد بالون مین د Cimuanos لخوا

توزیع کول د کلاوډ غوښتنلیکونو لپاره کلیدي اړتیا ده. د Kubernetes سره، د غوښتنلیک اندازه کول دومره ساده دي لکه څنګه چې د مناسب ځای پرځای کولو لپاره د نقلونو شمیر زیاتول یا ReplicaSet - مګر دا یو لاسي پروسه ده.

Kubernetes غوښتنلیکونو ته اجازه ورکوي چې په اتوماتيک ډول اندازه شي (د بیلګې په توګه پوډونه په ځای پرځای کولو کې یا ReplicaSet) د افقی پوډ آټوسکلر مشخصاتو په کارولو سره په اعلاناتي ډول. د اتوماتیک پیمانه کولو لپاره اصلي معیار د CPU کارولو میټریک (د سرچینو میټریک) دی، مګر تاسو کولی شئ دودیز او بهرنۍ چمتو شوي میټریکونه یوځای کړئ.

ټیم Kubernetes aaS له Mail.ru څخه د کوبرنیټس غوښتنلیک په اتوماتيک ډول اندازه کولو لپاره د بهرني میټریکونو کارولو څرنګوالي په اړه یوه مقاله ژباړلې. د ښودلو لپاره چې هرڅه څنګه کار کوي، لیکوال د HTTP لاسرسي غوښتنې میټریک کاروي، کوم چې د پرومیتیس په کارولو سره راټول شوي.

د پوډونو افقی اتوماتیک کولو پرځای، د Kubernetes Event Driven Autoscaling (KEDA) کارول کیږي، د خلاصې سرچینې Kubernetes آپریټر. دا په اصلي ډول د افقی پوډ آټوسکلر سره مدغم کوي ترڅو د پیښې لخوا پرمخ وړل شوي کاري بارونو لپاره بې سیمه اتوماتیک کول (په شمول له صفر څخه) چمتو کړي. کوډ په کې شتون لري GitHub.

د سیسټم لنډه کتنه

د Prometheus او KEDA په کارولو سره د کبرنیټس غوښتنلیکونه اتومات کول

ډیاګرام یو لنډ توضیح ښیي چې څنګه هرڅه کار کوي:

  1. غوښتنلیک د پرومیټیوس فارمیټ کې د HTTP هټ شمیرنې میټریک چمتو کوي.
  2. Prometheus د دې میترونو راټولولو لپاره ترتیب شوی.
  3. په KEDA کې د پرومیتیوس سکیلر ترتیب شوی ترڅو غوښتنلیک په اتوماتيک ډول د HTTP هیټونو شمیر پراساس اندازه کړي.

اوس زه به تاسو ته د هر عنصر په اړه په تفصیل سره ووایم.

KEDA او Prometheus

Prometheus د خلاصې سرچینې سیسټم نظارت او خبرتیا وسیله ده، برخه د بادل اصلي کمپیوټري بنسټ. د مختلفو سرچینو څخه میټریکونه راټولوي او د وخت لړۍ ډیټا په توګه یې ذخیره کوي. د معلوماتو لیدو لپاره تاسو کولی شئ وکاروئ ګرافانا یا نور د لید وسیلې چې د Kubernetes API سره کار کوي.

KEDA د سکیلر مفهوم ملاتړ کوي - دا د KEDA او بهرني سیسټم تر مینځ د پل په توګه کار کوي. د سکیلر تطبیق د هر هدف سیسټم لپاره ځانګړی دی او له هغې څخه ډاټا استخراجوي. KEDA بیا دوی د اتوماتیک اندازه کولو کنټرول لپاره کاروي.

سکیلرز د ډیری ډیټا سرچینو ملاتړ کوي، د بیلګې په توګه، کافکا، ریډیس، پرومیتیس. دا دی، KEDA د معیارونو په توګه د Prometheus میټریکونو په کارولو سره د کبرنیټس ګمارنې په اتوماتيک ډول اندازه کولو لپاره کارول کیدی شي.

د ازموینې غوښتنلیک

د ګولنګ ټیسټ غوښتنلیک د 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په Redis کې. دا د HTTP هینډلر برخې په توګه د کار کولو لپاره اسانه لار ده او د پرومیتیس میټریک هم چیک کړئ. د میټریک ارزښت باید د ارزښت سره ورته وي 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، دا د پرومیټیوس سرور ته اجازه ورکوي چې د غوښتنلیک میټریک ترلاسه کړي.

دلته د غوښتنلیک لپاره د پلي کولو څرګندونه.

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

د پرومیتیس ګمارنې منشور عبارت دي له:

  • ConfigMap - د پرومیتیوس ترتیب لیږدولو لپاره؛
  • Deployment - د کوبرنیټس کلستر کې د پرومیتیس ځای پرځای کولو لپاره؛
  • ClusterIP - UI Prometheus ته د لاسرسي لپاره خدمت؛
  • ClusterRole, ClusterRoleBinding и ServiceAccount - په Kubernetes کې د خدماتو د اتوماتیک کشف لپاره (آتو کشف).

دلته د پرومیتیس چلولو لپاره څرګند.

KEDA Prometheus ScaledObject

سکیلر د KEDA او بهرني سیسټم تر مینځ د پل په توګه کار کوي چې له هغې څخه میټریکونه باید ترلاسه شي. ScaledObject یو دودیز سرچینه ده چې د پیښې سرچینې سره د ګمارنې همغږي کولو لپاره ګمارل کیدو ته اړتیا لري ، پدې حالت کې پرومیتیوس.

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 پورې وي، نو د پوډونو شمیر څلور دی.

اوس راځئ چې د دې تنظیم کولو هڅه وکړو!

presetting

ټول هغه څه چې تاسو ورته اړتیا لرئ د 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/

سیټ kubectlد 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. او له هغې وروسته، دوام ورکړئ.

د هیلم په کارولو سره د ریډیس نصب کول

که تاسو هیلم نصب نه کړئ، دا وکاروئ مشرتابه. په ماک کې د نصبولو امر:

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

helm init د محلي کمانډ لاین انٹرفیس پیل کوي او هم یې نصبوي Tiller د Kubernetes کلستر ته.

kubectl get pods -n kube-system | grep tiller

د ټیلر پوډ ته انتظار وکړئ چې روان حالت ته ننوځي.

د ژباړونکي یادښت: لیکوال Helm@2 کاروي، کوم چې د ټیلر سرور برخې نصبولو ته اړتیا لري. اوس 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

د ریډیس حالت ته د ننوتلو لپاره انتظار وکړئ Running.

د پرومیتیوس سرور ځای په ځای کول

د 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 د پرومیتیوس کارن انٹرفیس (یا 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

پدې وخت کې ریډیس هم چیک کړئ. تاسو به دا کلید وګورئ 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

تاسو هم کولی شئ د دې لپاره افادیت ډاونلوډ کړئ لینوکس او یا Windows.

چل یې کړئ:

./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 تاسو ته اجازه درکوي په اتوماتيک ډول د بهرني میټریکونو معلوماتو پراساس خپل د کوبرنیټس ګمارنې (له صفر څخه) اندازه کړئ. د مثال په توګه، د Prometheus میټریکونو پر بنسټ، په ریډیس کې د قطار اوږدوالی، د کافکا موضوع کې د مصرف کونکي ځنډ.

KEDA د یوې بهرنۍ سرچینې سره مدغم کیږي او د میټریک سرور له لارې افقی پوډ آټوسکلر ته خپل میټریک چمتو کوي.

ښه چانس!

نور څه ولولئ:

  1. د تولید چاپیریال کې د کانټینرونو او کبرنیټ چلولو لپاره غوره تمرینونه او غوره کړنې.
  2. د کبرنیټس لپاره 90+ ګټورې وسیلې: ځای په ځای کول، مدیریت، څارنه، امنیت او نور ډیر څه.
  3. زموږ چینل په ټیلیګرام کې د کوبرنیټس شاوخوا.

سرچینه: www.habr.com

Add a comment