Миқёси худкори барномаҳои Kubernetes бо истифода аз Prometheus ва KEDA

Миқёси худкори барномаҳои Kubernetes бо истифода аз Prometheus ва KEDAОдами пуфак аз ҷониби Симуанос

Миқёспазирӣ як талаботи калидӣ барои барномаҳои абрӣ мебошад. Бо 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.

Шарҳи мухтасари система

Миқёси худкори барномаҳои Kubernetes бо истифода аз Prometheus ва KEDA

Дар диаграмма тавсифи мухтасари он, ки ҳама чиз кор мекунад, нишон медиҳад:

  1. Ин барнома ченакҳои ҳисобкунии HTTP-ро дар формати Prometheus таъмин мекунад.
  2. Prometheus барои ҷамъоварии ин нишондиҳандаҳо танзим шудааст.
  3. Миқёси Prometheus дар KEDA барои ба таври худкор миқёси барнома дар асоси шумораи хитҳои HTTP танзим карда шудааст.

Ҳоло ман ба шумо дар бораи ҳар як элемент муфассал нақл мекунам.

KEDA ва Прометей

Prometheus як асбоби мониторинг ва огоҳкунии системаи кушодаасос аст, қисми Бунёди компютерии Cloud Cloud. Метрикҳоро аз сарчашмаҳои гуногун ҷамъоварӣ мекунад ва онҳоро ҳамчун маълумоти силсилаи вақт нигоҳ медорад. Барои тасаввур кардани маълумот шумо метавонед истифода баред Графана ё дигар воситаҳои визуализатсия, ки бо API Kubernetes кор мекунанд.

KEDA консепсияи скалерро дастгирӣ мекунад - он ҳамчун пул байни KEDA ва системаи беруна амал мекунад. Татбиқи scaler барои ҳар як системаи мақсаднок хос аст ва аз он маълумот мегирад. Сипас KEDA онҳоро барои назорат кардани миқёси худкор истифода мебарад.

Скалерҳо сарчашмаҳои зиёди маълумотро дастгирӣ мекунанд, масалан, Кафка, Редис, Прометей. Яъне, KEDA метавонад барои ба таври худкор миқёси ҷойгиркунии Kubernetes бо истифода аз ченакҳои Prometheus ҳамчун меъёр истифода шавад.

Аризаи санҷишӣ

Замимаи санҷишии Golang дастрасиро тавассути HTTP таъмин мекунад ва ду вазифаи муҳимро иҷро мекунад:

  1. Китобхонаи муштарии Prometheus Go -ро барои асбоби барнома истифода мебарад ва метрикаи http_requests-ро, ки шумораи хитҳоро дар бар мегирад, истифода мебарад. Нуқтаи ниҳоӣ, ки дар он ченакҳои Prometheus дастрасанд, дар URI ҷойгир аст /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Дар посух ба дархост GET барнома арзиши калидро зиёд мекунад (access_count) дар Redis. Ин роҳи осони иҷрои кор ҳамчун як қисми коркардкунандаи HTTP ва инчунин санҷиши ченакҳои Prometheus аст. Арзиши метрӣ бояд бо арзиш якхела бошад 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)
       }
    

Барнома тавассути Kubernetes ҷойгир карда мешавад Deployment. Хизматрасонӣ низ таъсис дода мешавад ClusterIP, он ба сервери Prometheus имкон медиҳад, ки ченакҳои барномаро ба даст орад.

дар ин ҷо манифести густариш барои барнома.

Сервери Prometheus

Манифести густариши Prometheus аз инҳо иборат аст:

  • ConfigMap — интиқоли конфигуратсияи Prometheus;
  • Deployment — барои ҷойгиркунии Prometheus дар кластери Kubernetes;
  • ClusterIP — хизматрасонӣ барои дастрасӣ ба UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — барои худкор муайян кардани хадамот дар Кубернетес (Авто-кашф).

дар ин ҷо манифест барои идора кардани Prometheus.

KEDA Prometheus ScaledObject

Скалер ҳамчун пули байни KEDA ва системаи беруна амал мекунад, ки аз он ченакҳо бояд гирифта шаванд. ScaledObject манбаи фармоишӣ аст, ки бояд барои ҳамоҳангсозии ҷойгиркунӣ бо манбаи ҳодиса, дар ин ҳолат Prometheus ҷойгир карда шавад.

ScaledObject дорои маълумоти миқёси густариш, метамаълумоти сарчашмаи ҳодиса (ба монанди асрори пайвастшавӣ, номи навбат), фосилаи овоздиҳӣ, давраи барқарорсозӣ ва дигар маълумот. Он ба манбаи мувофиқи автоматӣ (таърифи HPA) барои миқёси густариш оварда мерасонад.

Вақте ки объект ScaledObject нест карда мешавад, таърифи мувофиқи HPA тоза карда мешавад.

Ин аст таъриф ScaledObject барои мисоли мо, он scaler-ро истифода мебарад 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. Мувофиқи маълумот pollingInterval,KEDA ҳар понздаҳ сония аз Прометей ҳадаф талаб мекунад. Ақаллан як зери (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, аммо шумо метавонед ягон каси дигарро гиред. Барои насб кардани кластер вуҷуд дорад роҳнамо.

Версияи охиринро дар 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/

Set кубектлбарои дастрасӣ ба кластери Kubernetes.

Версияи охиринро дар 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-ро бо якчанд роҳ ҷойгир кунед, онҳо дар рӯйхат оварда шудаанд хуччатхо. Ман 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 бо истифода аз Helm

Агар шумо Helm насб накарда бошед, аз ин истифода баред роҳбарӣ. Фармон барои насб дар Mac:

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

helm init интерфейси сатри фармони маҳаллиро оғоз мекунад ва инчунин насб мекунад Tiller ба кластери Кубернетес.

kubectl get pods -n kube-system | grep tiller

Мунтазир бошед, ки подшипник Tiller ба ҳолати давидан ворид шавад.

Ёддошти тарҷумон: Муаллиф Helm@2-ро истифода мебарад, ки барои насб кардани ҷузъи сервери Tiller талаб мекунад. Ҳоло Helm@3 мувофиқ аст, он қисми серверро талаб намекунад.

Пас аз насб кардани Helm, як фармон барои оғоз кардани Redis кифоя аст:

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

Боварӣ ҳосил кунед, ки 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

Истифодаи манифести Прометей Кашфи хидмати Kubernetes барои Prometheus. Он имкон медиҳад, ки паҳлӯҳои барномаро дар асоси тамғаи хидматӣ динамикӣ кашф кунанд.

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

Шумо инчунин метавонед утилитаро барои Linux ё 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

Агар сарборӣ номувофиқ бошад, ҷойгиркунӣ то ба дараҷае кам карда мешавад, ки танҳо як pod кор мекунад. Агар шумо хоҳед, ки метрикаи воқеиро тафтиш кунед (бо дархости 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, таъхири истеъмолкунанда дар мавзӯи Кафка.

KEDA бо манбаи беруна ҳамгиро мешавад ва инчунин ченакҳои худро тавассути Metrics Server ба Horizontal Pod Autoscaler медиҳад.

Барори кор

Боз чӣ хондан лозим аст:

  1. Таҷрибаҳои беҳтарин ва таҷрибаҳои беҳтарин барои идора кардани контейнерҳо ва кубернетҳо дар муҳити истеҳсолӣ.
  2. 90+ Воситаҳои муфид барои Kubernetes: Ҷойгиркунӣ, идоракунӣ, мониторинг, амният ва ғайра.
  3. Канали мо дар атрофи Kubernetes дар Telegram.

Манбаъ: will.com

Илова Эзоҳ