Kubernetesi rakenduste automaatne skaleerimine Prometheuse ja KEDA abil

Kubernetesi rakenduste automaatne skaleerimine Prometheuse ja KEDA abilBalloon Man by Cimuanos

Skaleeritavus on hĂ€davajalik nĂ”ue pilve rakenduste jaoks. Kubernetesega on rakenduse skaleerimine sama lihtne kui koopia arvu suurendamine vastavale juurutamisele vĂ”i ReplicaSet — kuid see on kĂ€sitsi protsess.

Kubernetes vÔimaldab rakendusi automaatselt skaleerida (st Pods juurutamises vÔi ReplicaSet) deklaratiivselt, kasutades Horizontaalset Pod Autoscaler'i spetsifikatsiooni. Vaikimisi on automaatse skaleerimise kriteeriumiks CPU kasutuse mÔÔdikud (ressursi mÔÔdikud), kuid on vÔimalik integreerida ka kohandatud mÔÔdikud ja vÀlised mÔÔdikud.

Meeskond Mail.ru Kubernetes aaS tÔlkis artikli selle kohta, kuidas kasutada vÀliseid mÔÔdikuid Kubernetesi rakenduste automaatseks skaleerimiseks. NÀitamaks, kuidas kÔik töötab, kasutab autor HTTP-kuulutuste mÔÔdikuid, mida kogutakse Prometheuse abil.

Kubernetes Event Driven Autoscaling (KEDA) rakendab automaatset skaleerimist, mitte horisontaalset automaatset skaleerimist pod'ide jaoks — avatud lĂ€htekoodiga Kubernetes'i operaator. See integreerub algselt Horisontaalse Pod Automaatse Skaleerijaga, et tagada sujuv automaatne skaleerimine (sh nullist skaleerimine) sĂŒndmustest juhitud töökoormuste jaoks. Kood on saadaval aadressil GitHub.

SĂŒsteemi ĂŒlevaade

Kubernetesi rakenduste automaatne skaleerimine Prometheuse ja KEDA abil

Joonisel on lĂŒhike seletus, kuidas kĂ”ik töötab:

  1. Rakendus edastab HTTP pÀringute arvu mÔÔdud Prometheus formaadis.
  2. Prometheus on seadistatud nende nÀitajate kogumiseks.
  3. KEDA Prometheuse skaleerija on konfigureeritud rakenduse automaatseks skaleerimiseks HTTP pÀringute arvu pÔhjal.

NĂŒĂŒd rÀÀgin kĂ”igist elementidest lĂ€hemalt.

KEDA ja Prometheus

Prometheus on avatud lĂ€htekoodiga sĂŒsteemide jĂ€lgimise ja teavitamise tööriistakomplekt, osa Cloud Native Computing Foundation. Kogub mÔÔdud erinevatest allikatest ja salvestab need ajaarvamise andmetena. Andmete visualiseerimiseks vĂ”ib kasutada Grafana vĂ”i muid visualiseerimistööriistu, mis töötavad Kubernetes'i API-ga.

KEDA toetab skaaleri kontseptsiooni — see toimib silla leidmiseks KEDA ja vĂ€list sĂŒsteemi vahel. Skaaleri rakendamine on igale sihtsĂŒsteemile spetsiifiline ja tĂ”mbab andmed sellest. SeejĂ€rel kasutab KEDA neid automaatse skaleerimise juhtimiseks.

Skaalerid toetavad mitmeid andmeallikaid, nagu Kafka, Redis, Prometheus. Seega saab KEDA-d kasutada Kubernetes'i juurutuste automaatseks skaleerimiseks, kasutades kriteeriumina Prometheuse mÔÔdikuid.

Testrakendus

Testimine Golang rakendus vÔimaldab pÀÀseda HTTP kaudu ja tÀidab kahte olulist funktsiooni:

  1. Kasutab Prometheuse Go kliendiraamatukogu rakenduse instrumenteerimiseks ja http_requests mÔÔdiku pakkumiseks, mis sisaldab pÀringute loendurit. Prometheuse mÔÔdikud on kÀttesaadavad URI-l. /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "HTTP pÀringute arv",
       })
    
  2. PÀringu vastuseks GET rakendus suurendab vÔtme vÀÀrtust (access_count) Redis. See on lihtne viis töö tegemiseks osana HTTP töötlejast ja ka Prometheuse mÔÔdikute kontrollimiseks. MÔÔdiku vÀÀrtus peaks olema sama, mis vÀÀrtus 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)
       }
    

Rakendus deployitakse Kubernetes'is kaudu Deployment. Samuti luuakse teenus ClusterIP, see vÔimaldab Prometheus serveril rakenduse mÔÔdikuid saada.

Siin on rakenduse deployimise manifest.

Prometheus Server

Prometheuse deployimise manifest koosneb jÀrgmistest:

  • ConfigMap — Prometheuse konfi edastamiseks;
  • Deployment — Prometheuse deployimiseks Kubernetes klastris;
  • ClusterIP — teenus Prometheuse UI juurde pÀÀsemiseks;
  • ClusterRole, ClusterRoleBinding ja ServiceAccount — teenuste automaatseks avastamiseks Kubernetesis (Auto-discovery).

Siin on manifest Prometheuse kÀivitamiseks.

KEDA Prometheuse ScaledObject

Skaleerija toimib sillana KEDA ja vĂ€list sĂŒsteemi vahel, millest on vajalik mÔÔdikute saamine. ScaledObject — konfigureeritav ressurss, mis tuleb deployida sĂŒndmuste allika, antud juhul Prometheusega, sĂŒnkroniseerimiseks.

ScaledObject sisaldab teavet rakenduse skaleerimise, sĂŒndmuse allika metaandmete (nt ĂŒhenduse saladused, jĂ€rjekorra nimi), kĂŒsitlusintervalli, taastumisperioodi ja teiste andmete kohta. See viib vastava automaatse skaleerimise ressursi juurde (HPA mÀÀratlus) rakenduse skaleerimiseks.

Kui objekt ScaledObject kustutatakse, siis vastav HPA mÀÀratlus eemaldatakse.

Siin on mÀÀratlus ScaledObject meie nÀite jaoks, kus kasutatakse skaaladjust: 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]))

Pange tÀhele jÀrgmisi punkte:

  1. See viitab Deployment nimega go-prom-app.
  2. TĂŒĂŒbi kĂ€ivitaja — Prometheus. Prometheuse serveri aadress mainitakse koos metrika nime, lĂ€vivÀÀrtuse ja PromQL pĂ€ringuga, mida kasutatakse. PromQL pĂ€ring — sum(rate(http_requests[2m])).
  3. Vastavalt pollingInterval, KEDA kĂŒsib eesmĂ€rgi kohta Prometheuse juurest iga viieteistkĂŒmne sekundi jĂ€rel. Toetatakse vĂ€hemalt ĂŒhte podi (minReplicaCount), samas kui maksimaalne podide arv ei ĂŒleta maxReplicaCount (nĂ€ites — kĂŒmme).

Saab seadistada minReplicaCount nulliks. Sel juhul aktiveerib KEDA rakenduse nullist ĂŒheni, seejĂ€rel annab HPA edasi automaatseks skaaleerimiseks. Samuti on vĂ”imalik vastupidine jĂ€rjestus, st skaaleerimine ĂŒhest nulli. NĂ€ites ei valinud me nulli, kuna see on HTTP-teenus, mitte pĂ€ringute sĂŒsteem.

Automaatskaalumise vÔlu

PiirvÀÀrtust kasutatakse rakenduse skaaleerimise kÀivitamiseks. Meie nÀites on PromQL pÀring sum(rate(http_requests[2m])) tagastab HTTP-pÀringute kiirusest (pÀringute arv sekundis) kogustatud vÀÀrtuse, mida mÔÔdetakse viimase kahe minuti jooksul.

Kuna piirvÀÀrtus on kolm, siis toimub ĂŒks alamskaleerimine, kuni vÀÀrtus on sum(rate(http_requests[2m])) vĂ€hem kui kolm. Kui aga vÀÀrtus suureneb, lisandub iga kord, kui sum(rate(http_requests[2m])) see suureneb kolme vĂ”rra, uus alam. NĂ€iteks, kui vÀÀrtus on 12–14, siis on alameid neli.

NĂŒĂŒd proovime seadistada!

EelsÀttimine

KÔik, mida vajate, on Kubernetes klaster ja seadistatud tööriist kubectl. Selles nÀites kasutatakse klastrit minikube, kuid saate valida ka mÔne teise. Klusteri seadistamiseks on juhend.

Installige uusim versioon Macile:

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/

Installige kubectl, et pÀÀseda ligi Kubernetes'i klusterile.

Installige uusim versioon Macile:

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 installimine

Saate KEDA-d rakendada mitmel viisil, need on loetletud dokumentatsioonis. Kasutan monoliitset YAML-i:

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

KEDA ja selle koostisosad installitakse ruumi nimega keda. Kontrollimise kÀsk:

kubectl get pods -n keda

Oodake, kuni KEDA operaatori pod kĂ€ivitub — lĂ€heb olekusse Running State. Ja pĂ€rast seda jĂ€tkake.

Redis'i installimine Helm'i abil

Kui Helm pole installitud, tutvuge selle juhendiga. Maci installimise kÀsk:

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

helm init algatab kohaliku kÀsurea liidese ja installib Tiller'i Kubernetes'i klustisse.

kubectl get pods -n kube-system | grep tiller

Oodake, et Tiller'i pod lÀheb olekusse Running.

TÔlkija mÀrkus: Autor kasutab Helm@2, mis vajab Tilleri serverikomponendi installimist. KÀesoleval ajal on aktiivne Helm@3, mille jaoks serveriosa ei ole vajalik.

PĂ€rast Helmi installimist piisab Redis’i kĂ€ivitamiseks ĂŒhest kĂ€sklusest:

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

Veendu, et Redis on edukalt kÀivitatud:

kubectl get pods/redis-server-master-0

Oota, kuni Redis'i pod jÔuab olekusse Running.

Rakenduse juurutamine

KĂ€sk rakenduse juurutamiseks:

kubectl apply -f go-app.yaml

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

Kontrolli, et kÔik on kÀivitatud:

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

Oota, kuni Redis jÔuab olekusse Running.

Prometheuse serveri juurutamine

Prometheuse manifest kasutab Kubernetes Teenuse Avastamine Prometheusele. See vĂ”imaldab dĂŒnaamiliselt avastada rakenduse pode teenuse sildi pĂ”hjal.

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

Juurutamiseks:

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

Kontrolli, et kÔik on kÀivitatud:

kubectl get pods -l=app=prometheus-server

Oodake, kuni Prometheus lÀheb olekusse Running.

Kasutage kubectl port-forward et pÀÀseda Prometheuse kasutajaliidese (vÔi API serveri) juurde aadressil http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA automaatse skaleerimise konfiguratsiooni juurutamine

KĂ€sk faili loomiseks ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Kontrollige KEDA operaatori logisid:

KEDA_POD_NAME=$(kubectl get pods -n keda 
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda

Tulemus nÀeb vÀlja umbes selline:

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"

Kontrollige rakenduse poodi. Üks eksemplar peaks olema kĂ€ivitatud, kuna minReplicaCount on vĂ”rdsed 1:

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

Kontrollige, et HPA ressurss on edukalt loodud:

kubectl get hpa

Peaksite nÀgema midagi sellist:

NAME                   REFERENCE                TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (avg)   1         10        1          45s

Töökindluse kontroll: juurdepÀÀs rakendusele

Et pÀÀseda meie rakenduse REST lÔpp-punkti, kÀivitage:

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

NĂŒĂŒd saate pÀÀseda Go rakendusele, kasutades aadressi http://localhost:8080. Selleks kĂ€ivitage kĂ€sk:

curl http://localhost:8080/test

Tulemus nÀeb vÀlja umbes selline:

Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Access count 1

Selle etapi juures kontrollige ka Redis. NÀete, et vÔtme access_count vÀÀrtus on suurenenud kuni 1:

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"

Veenduge, et mÔÔtme vÀÀrtus http_requests on sama:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1

Koormuse genereerimine

Kasvame hey — koormuse genereerimise tööriista:

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

Saate ka tööriista alla laadida Linux vÔi Windows.

KĂ€ivitage see:

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

Vaikimisi saadab tööriist 200 pÀringut. Saate seda kontrollida, kasutades Prometheuse mÔÔtmeid ning ka Redis'i.

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

Kinnitage tegeliku mÔÔtme vÀÀrtus (mille PromQL pÀring tagastab):

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"]}]}}

Sel juhul on tegelik tulemus 1,686057971014493 ja kuvatakse vÀljale value. Seda ei piisa skaleerimiseks, kuna seame piiri vÀÀrtus on 3.

Rohkem koormust!

Uues terminalis jÀlgige rakenduse podide arvu:

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

Suurendame koormust jÀrgmise kÀsuga:

./hey -n 2000 http://localhost:8080/test

MÔne aja pÀrast nÀete, et HPA skaleerib rakendust ja kÀivitab uusi pode. Kontrollige HPA-d, et veenduda:

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

Kui koormus on ebastabiilne, vĂ€hendatakse rakendust punkti, kus töötab ainult ĂŒks pod. Kui soovite kontrollida tegelikku mÔÔdikut (mille tagastab PromQL pĂ€ring), kasutage kĂ€sku:

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

Kustutus

//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

KokkuvÔte

KEDA vÔimaldab automaatselt skaleerida teie Kubernetes rakendusi (nullist ja tagasi) vÀliste mÔÔdikute andmete pÔhjal. NÀiteks Prometheus mÔÔdikutest, Redis jÀrjekorra pikkusest, Kafka teemade tarbimise viivitusest.

KEDA integreerub vÀlise allikaga ja pakub selle mÔÔdikud lÀbi Metrics Serveri Horisontaalsesse Pod Automaatse Skaleerijasse.

Edu!

Mida veel lugeda:

  1. Parimad praktikad ja soovitused konteinerite ja Kubernetes'i kÀitamiseks tootmisringkondades..
  2. 90+ kasulikku tööriista Kubernetes'ile: juurutamine, haldamine, jÀlgimine, turvalisus ja mitte ainult.
  3. Meie kanal Kubernetesest Telegramis.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster