Prometheus жана KEDA аркылуу Kubernetes тиркемелерин автоматтык түрдө масштабдоо

Prometheus жана KEDA аркылуу Kubernetes тиркемелерин автоматтык түрдө масштабдооCimuanos тарабынан жасалган шар адам

Масштабдуулук булут колдонмолору үчүн негизги талап болуп саналат. Kubernetes менен, тиркемени масштабдоо ылайыктуу жайгаштыруу же репликалардын санын көбөйтүү сыяктуу жөнөкөй. ReplicaSet — бирок бул кол менен жасалган процесс.

Kubernetes колдонмолорду автоматтык түрдө масштабдоого мүмкүндүк берет (мисалы, жайгаштыруудагы Pods же ReplicaSet) Horizontal Pod Autoscaler спецификациясын колдонуу менен декларациялык түрдө. Автоматтык масштабдоо үчүн демейки критерий CPU колдонуу көрсөткүчтөрү (ресурстун көрсөткүчтөрү), бирок сиз ыңгайлаштырылган жана сырттан берилген көрсөткүчтөрдү бириктире аласыз.

команда Mail.ru сайтынан Kubernetes aaS Kubernetes тиркемесин автоматтык түрдө масштабдоо үчүн тышкы көрсөткүчтөрдү кантип колдонуу керектиги жөнүндө макаланы которгон. Баары кантип иштээрин көрсөтүү үчүн, автор Prometheus аркылуу чогултулган HTTP кирүү сурамынын көрсөткүчтөрүн колдонот.

Подшокторду горизонталдуу автоскалдаштыруунун ордуна, Kubernetes Event Driven Autoscaling (KEDA) ачык булактуу Kubernetes оператору колдонулат. Окуяга негизделген иш жүктөмдөрү үчүн үзгүлтүксүз автоскалоону (анын ичинде нөлгө чейин/нөлгө чейин) камсыз кылуу үчүн ал Horizontal Pod Autoscaler менен түп-тамыры менен интеграцияланат. Код жеткиликтүү GitHub.

Системанын кыскача баяндамасы

Prometheus жана KEDA аркылуу Kubernetes тиркемелерин автоматтык түрдө масштабдоо

Диаграмма баары кантип иштээрин кыскача сүрөттөйт:

  1. Колдонмо Prometheus форматында HTTP хит санынын көрсөткүчтөрүн берет.
  2. Prometheus бул көрсөткүчтөрдү чогултуу үчүн конфигурацияланган.
  3. KEDAдагы Prometheus масштабдоочу HTTP хиттеринин санына жараша тиркемени автоматтык түрдө масштабдоо үчүн конфигурацияланган.

Эми мен ар бир элемент жөнүндө майда-чүйдөсүнө чейин айтып берем.

KEDA жана Прометей

Prometheus ачык булак системасы мониторинг жана эскертүү куралдары, бөлүгү болуп саналат Cloud Native Computing Foundation. Ар кандай булактардан метрикаларды чогултат жана аларды убакыт серияларынын маалыматтары катары сактайт. Сиз колдоно аласыз маалыматтарды визуалдаштыруу үчүн Графана же Kubernetes API менен иштеген башка визуалдаштыруу куралдары.

KEDA масштабдуу концепцияны колдойт - ал KEDA менен тышкы системанын ортосунда көпүрө болуп иштейт. Масштабды ишке ашыруу ар бир максаттуу системага мүнөздүү жана андан маалыматтарды чыгарат. Андан кийин KEDA аларды автоматтык масштабдоону башкаруу үчүн колдонот.

Scalers бир нече маалымат булактарын колдойт, мисалы, Kafka, Redis, Prometheus. Башкача айтканда, KEDA Prometheus метрикасын критерий катары колдонуп, Kubernetes жайылтууларын автоматтык түрдө масштабдоо үчүн колдонулушу мүмкүн.

Сыноо колдонмо

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) Редисте. Бул 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 Server

Прометейди жайылтуу манифести төмөнкүлөрдөн турат:

  • ConfigMap — Prometheus конфигурациясын өткөрүү;
  • Deployment — Prometheusти Кубернетес кластеринде жайгаштыруу үчүн;
  • ClusterIP — UI Prometheus кирүү кызматы;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — Кубернетестеги кызматтарды автоматтык түрдө аныктоо үчүн (Авто-ачуу).

бул жерде Прометейди иштетүү үчүн манифест.

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 Query - sum(rate(http_requests[2m])).
  3. ылайык pollingInterval,KEDA ар бир он беш секундада Прометейден бутаны сурайт. жок дегенде бир (minReplicaCount), ал эми кабыктардын максималдуу саны ашпайт maxReplicaCount (бул мисалда - он).

Орнотууга болот minReplicaCount нөлгө барабар. Бул учурда, KEDA нөлгө бир жайгаштырууну активдештирет, андан кийин HPAны андан ары автоматтык масштабдоо үчүн көрсөтөт. Тескери тартипте да мүмкүн, башкача айтканда, бирден нөлгө чейин масштабдоо. Мисалда биз нөлдү тандаган жокпуз, анткени бул HTTP кызматы жана талап боюнча система эмес.

Autoscaling ичиндеги сыйкыр

Босого жайгаштырууну масштабдоо үчүн триггер катары колдонулат. Биздин мисалда, 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/

орнотуу kubectlKubernetes кластерине кирүү үчүн.

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. Ошондон кийин, улантыңыз.

Helm аркылуу Redis орнотуу

Эгер сизде Helm орнотулбаса, муну колдонуңуз лидерлик. Mac'ке орнотуу буйругу:

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

helm init жергиликтүү буйрук сабынын интерфейсин инициализациялайт жана ошондой эле орнотот Tiller Kubernetes кластерине.

kubectl get pods -n kube-system | grep tiller

Tiller pod Running абалына кирүү үчүн күтө тургула.

Котормочунун эскертүүсү: Автор 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

Редис штатка киришин күтүңүз Running.

Prometheus серверин жайылтуу

Прометей манифестинин колдонулушу 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 Prometheus колдонуучу интерфейсине (же API серверине) кирүү үчүн http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA Autoscaling конфигурациясын жайылтуу

Түзүү буйругу 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

Эгерде жүк ыраатсыз болсо, жайгаштыруу бир гана поддон иштегенге чейин кыскарат. Эгер сиз чыныгы метриканы текшергиңиз келсе (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 метрикасынын негизинде, Редистеги кезектин узундугу, Кафка темасындагы керектөөчү күтүү.

KEDA тышкы булак менен интеграцияланат жана ошондой эле анын метрикасын Metrics Server аркылуу Horizontal Pod Autoscalerге берет.

Ийгилик!

Дагы эмнени окуу керек:

  1. Өндүрүш чөйрөлөрүндө контейнерлерди жана кубернеттерди иштетүү боюнча мыкты тажрыйбалар жана мыкты тажрыйбалар.
  2. Kubernetes үчүн 90+ пайдалуу куралдар: Жайгаштыруу, башкаруу, мониторинг, коопсуздук жана башкалар.
  3. Биздин канал Telegramдагы Kubernetes айланасында.

Source: www.habr.com

Комментарий кошуу