Kubernetes'e rakenduste automaatne skaleerimine Prometheuse ja KEDA abil

Kubernetes'e rakenduste automaatne skaleerimine Prometheuse ja KEDA abilBalloon Man by Cimuanos

Skaleeritavus on pilve rakenduste pĂ”hivajadus. Kuberneteses on rakenduse skaleerimine sama lihtne kui koopia arvu suurendamine vastavale kasutusele vĂ”i ReplicaSet — kuid see on kĂ€sitsi protsess.

Kubernetes vÔimaldab rakenduste automaatset skaleerimist (st Pod rakenduses vÔi ReplicaSet) deklaratiivsel viisil, kasutades Horizontal Pod Autoscaler spetsifikatsiooni. Vaikimisi on automaatse skaleerimise kriteeriumid CPU kasutuse meetrikad (ressursimeetrikad), kuid saab integreerida ka kohandatud meetrikad ja vÀlise pakkumisega meetrikad.

Meeskond Kubernetes aaS Mail.ru-lt tÔlkis artikli sellest, kuidas kasutada vÀlist mÔÔdikud Kubernetes rakenduse automaatseks skaleerimiseks. Autori poolt nÀidatud, kuidas kÔik töötab, kasutatakse HTTP pÀringute mÔÔdikud, mis kogutakse Prometheus'e abil.

Horisonthaalsete podide automaatse skaleerimise asemel rakendatakse Kubernetes Event Driven Autoscaling (KEDA) — avatud lĂ€htekoodiga Kubernetes operaator. See integreerub algselt Horizontal Pod Autoscaleriga, et tagada sujuv automaatne skaleerimine (sealhulgas nullist skaleerimine) sĂŒndmustele orienteeritud töökoormustele. Kood on saadaval GitHub.

SĂŒsteemi töö ĂŒlevaade

Kubernetes'e rakenduste automaatne skaleerimine Prometheuse ja KEDA abil

Skeemil on lĂŒhike kirjeldus sellest, kuidas kĂ”ik töötab:

  1. Rakendus pakub HTTP-pÀringute arvust mÔÔdikud Prometheus formaadis.
  2. Prometheus on seadistatud nende nÀitajate kogumiseks.
  3. Prometheuse skaleerija KEDA-s on seadistatud rakenduse automaatseks skaleerimiseks lÀhtudes HTTP pÀringute arvust.

NĂŒĂŒd tutvustan iga elementi detailselt.

KEDA ja Prometheus

Prometheus on avatud lĂ€htekoodiga rakenduste komplekt sĂŒsteemide jĂ€lgimiseks ja hoiatamiseks, osa Cloud Native Computing Foundation. See kogub mÔÔdikud erinevatest allikatest ja salvestab need ajareadana. Andmete visualiseerimiseks saab kasutada Grafana vĂ”i muid visualiseerimisvahendeid, mis töötavad Kubernetes API-ga.

KEDA toetab skaleerija kontseptsiooni — see toimib sillana KEDA ja vĂ€list sĂŒsteemi vahel. Skaleerija teostus on spetsiifiline iga sihtsĂŒsteemi jaoks ja tĂ”mbab sealt andmeid. SeejĂ€rel kasutab KEDA neid automaatse skaleerimise haldamiseks.

Skalerid toetavad mitmeid andmeallikaid, nagu Kafka, Redis, Prometheus. See tÀhendab, et KEDA-d saab kasutada Kubernetes'i rakenduste automaatseks skaleerimiseks, kasutades kriteeriumina Prometheuse mÔÔdikute jÀrgi.

Testrakendus

Testimine Golang-rakendus, mis pakub juurdepÀÀsu HTTP kaudu ja tÀidab kahte olulist funktsiooni:

  1. Kasutab Prometheuse Go kliendiraamatukogu rakenduse instrumenteerimiseks ja HTTP pÀringute mÔÔdiku http_requests, mis sisaldab pÀringute loenduri, pakkumiseks. Prometheuse mÔÔdikute kaudu juurdepÀÀsetav lÔpp-punkt on URI-l /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "http pÀringute arv",
       })
    
  2. PÀringule vastates GET rakendus suurendab vÔtme vÀÀrtust (access_count) Redis'is. See on lihtne viis töö tegemiseks HTTP töötlejana ning ka Prometheuse mÔÔdikute kontrollimiseks. MÔÔdiku vÀÀrtus peaks olema sama kui vÀÀrtus access_count Redis'is.
    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("Ei saanud Redis loenduri vÀÀrtust suurendada", err)
                   os.Exit(1)
               }
               resp := "JuurdepÀÀs " + time.Now().String() + "nJuurdepÀÀsude arv " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

Rakenduse juurutamine Kubernetes'i kaudu Deployment. Samuti luuakse teenus ClusterIP, mis vÔimaldab Prometheuse serveril rakenduse mÔÔdikute hankimist.

Siin rakenduse juurutamise manifest.

Prometheuse server

Prometheuse juurutamise manifest koosneb jÀrgmistest:

  • ConfigMap — Prometheuse konfi ĂŒlekandmiseks;
  • Deployment — Prometheuse juurutamiseks Kubernetes'i klastris;
  • ClusterIP — teenus soovib juurdepÀÀsu Prometheuse UI-le;
  • ClusterRole, ClusterRoleBinding ja ServiceAccount — teenuste autoavastamise toimimiseks Kubernetes'is (Auto-discovery).

Siin Prometheuse kÀivitamise manifest.

KEDA Prometheus ScaledObject

Skaleri toimib sillana KEDA ja vĂ€list sĂŒsteemi vahel, kust tuleb mÔÔdikud saada. ScaledObject — kohandatav ressurss, mille tuleb juurutada, et sĂŒnkroniseerida juurutamine ĂŒrituste allikaga, antud juhul Prometheusega.

ScaledObject sisaldab teavet juurutamise skaleerimise kohta, ĂŒrituse allika metaandmeid (nt ĂŒhenduse saladused, jĂ€rjekorra nimi), kĂŒsitluse intervalli, taastumisperioodi ja muid andmeid. See toob kaasa vastava automaatse skaleerimise ressursi (HPA mÀÀratlemine), et skaleerida juurutamist.

Kui objekt ScaledObject kustutatakse, vastav HPA mÀÀramine tĂŒhistatakse.

Siin on mÀÀratlemine ScaledObject meie nÀite jaoks, kasutatakse skaalijat 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]))

Arvestage jÀrgmisi punkte:

  1. See osutab Deployment nimega go-prom-app.
  2. Triggere tĂŒĂŒbi — Prometheus. Prometheuse serveri aadress mainitakse koos mÔÔdiku nime, lĂ€vivÀÀrtuse ja PromQL pĂ€ringuga, mida kasutatakse. PromQL pĂ€ring on sum(rate(http_requests[2m])).
  3. Vastavalt pollingInterval, KEDA kĂŒsib sihtpunkti Prometheux 'ilt igal viiel sekundil. Minimaalne koormuse arv on vĂ€hemalt ĂŒks (minReplicaCount), maksimaalne koormus ei ĂŒleta maxReplicaCount nĂ€ites kĂŒmme.

Seda saab seada minReplicaCount nulliks. Sellisel juhul aktiveerib KEDA rakenduse nullist ĂŒhte ja seejĂ€rel annab HPA tĂ€iendavaks automaatseks skaleerimiseks. On vĂ”imalus skaleerida ka ĂŒhte kuni nullini. NĂ€ites ei ole nulli valitud, kuna see on HTTP-teenus, mitte pĂ€ringute sĂŒsteem.

Automaatse skaleerimise maagia

LÀvivÀÀrtust kasutatakse rakenduse skaleerimise trigerina. Meie nÀites PromQL pÀring sum(rate(http_requests[2m])) tagastab HTTP-pÀringute kiirus (pÀringute arv sekundis), mis mÔÔdetakse viimase kahe minuti jooksul.

Kuna lĂ€vivÀÀrtus on kolm, on ĂŒks koormus, kuni vÀÀrtus on sum(rate(http_requests[2m])) alla kolme. Kui vÀÀrtus tĂ”useb, lisatakse igal kerral ĂŒks koormus, kui sum(rate(http_requests[2m])) see tĂ”useb kolme vĂ”rra. NĂ€iteks, kui vÀÀrtus tĂ”useb 12-lt 14-le, siis koormuste arv on neli.

NĂŒĂŒd proovime seadistada!

Eelseade

KĂ”ik, mida vajate — Kubernetes klaster ja seadistatud utiliit kubectl. NĂ€ites kasutatakse klastrit minikube, kuid vĂ”ite valida mĂ”ne muu. Klastri 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 klastrile.

Paigaldage 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

KEDA-d saab juurutada mitmel viisil, need on loetletud dokumentatsioon. Ma kasutan monoliitset YAML-i:

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

KEDA ja selle komponendid installitakse nimekirja keda. Kontrollimiseks kasutage kÀsku:

kubectl get pods -n keda

Oodake, kuni KEDA Operator jÔuab olekusse Running State. Ja seejÀrel jÀtkake.

Redis installimine Helmiga

Kui teil ei ole Helm-i, kasutage seda juhendit. Maci installimiseks kasutage kÀsku:

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

helm init algatab kohaliku kÀskude liidese ja installib Tiller Kubernetes klastrisse.

kubectl get pods -n kube-system | grep tiller

Oodake, kuni Tilleri pod jÔuab olekusse Running.

TÔlkija mÀrkus: Autor kasutab Helm@2, mis vajab serveri komponenti Tiller. Praegu on aktuaalne Helm@3, mille jaoks serveri osa pole vajalik.

PĂ€rast Helmi installimist piisab Redis kĂ€ivitamiseks ĂŒhest kĂ€sust:

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

Veenduge, et Redis oleks edukalt kÀivitunud:

kubectl get pods/redis-server-master-0

Oodake, kuni Redis jÔuab olekusse KÀimas.

Rakenduse juurutamine

KĂ€sk juurutamiseks:

kubectl apply -f go-app.yaml

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

Kontrollige, et kÔik oleks kÀimas:

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

Oodake, kuni Redis jÔuab olekusse KÀimas.

Prometheuse serveri juurutamine

Prometheuse manifest kasutab Kubernetes Service Discovery Prometheusele. See vĂ”imaldab dĂŒnaamiliselt tuvastada rakenduse podid 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

Kontrollige, et kÔik oleks kÀimas:

kubectl get pods -l=app=prometheus-server

Oodake, kuni Prometheuse pod jÔuab olekusse KÀimas.

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

kubectl port-forward service/prometheus-service 9090

KEDA automaatmÔÔtmise konfiguratsiooni juurutamine

KĂ€sk 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 nii:

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 instants peab olema aktiveeritud, kuna minReplicaCount vĂ”rdub 1:

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

Kontrollige, et HPA ressurs on edukalt loodud:

kubectl get hpa

Te peaksite nÀgema midagi sellist:

NIMI                   VIIDATAV                CIELDID     MINPODS   MAXPODS   REPLIKAD   VANUS
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (keskmine)   1         10        1          45s

Töökorras kontrollimine: juurdepÀÀs rakendusele

Rakenduse REST-lÔpp-punkti ligipÀÀsuks kÀivitage:

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

NĂŒĂŒd pÀÀsete Go rakendusele juurde, kasutades aadressi http://localhost:8080. Selleks tĂ€itke kĂ€sk:

curl http://localhost:8080/test

Tulemus nÀeb vÀlja umbes nii:

JuurdepÀÀsetud 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
JuurdepÀÀsukordade arv 1

Selle sammu kÀigus kontrollige ka Redis. NÀete, et vÔti access_count on suurenenud 1-ni:

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//vÀljastus
"1"

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

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

Koormuse loomine

Kasutame hey — koormuse genereerimise utiliiti:

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

Samuti vÔite allalaadida utiliidi Linux vÔi Windows.

KĂ€ivitage see:

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

Vaikimisi saadab utiliit 200 pÀringut. Saate seda kontrollida Prometheuse mÔÔdikute ja ka Redis'i abil.

curl http://localhost:8080/metrics | grep http_requests
//vÀljastus
# 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
//vÀljastus
201

Kinnitage tegeliku mÔÔdiku vÀÀrtus (tagasinurga pÀringu kaudu):

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//vÀljastus
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}

Selles osas on tegelik tulemus 1,686057971014493 ja kuvatakse vÀljale value. Seda ei piisa skaleerimiseks, kuna seatud lÀvi on 3.

Rohkem koormust!

Uues terminalis jÀlgige rakenduse poodide arvu:

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

Suurendame koormust kÀsuga:

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

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

kubectl get hpa
Nimi                   Viide                    SihtmÀrgid      MINPODS  MAXPODS  Replikad  Vanus
keda-hpa-go-prom-app   Deployment/go-prom-app  1830m/3 (avg)   1        10       6         4m22s

Kui koormus ei ole ĂŒhtlane, siis rakendus vĂ€heneb punktini, kus töötab ainult ĂŒks pod. Kui soovite vaadata tegelikku mÔÔdikut (mida tagastab PromQL pĂ€ring), siis kasutage kĂ€sku:

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

Puhastamine

//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'i rakendusi (nullist/ nulli) nende mÔÔdikute pÔhjal, mis pÀrinevad vÀlistest allikatest. NÀiteks Prometheuse mÔÔdikute, Redis'i jÀrjekorra pikkuse, vÔi Kafka teema tarbija viivituse pÔhjal.

KEDA integreerib vÀlist allikat ja pakub selle mÔÔdikud kaudu Metrics Server'i Horisontaalse Pod'i Automaatika (Horizontal Pod Autoscaler) jaoks.

Edu!

Mida veel lugeda:

  1. Parimad tavad ja soovitused konteinerite ja Kubernetes'i kÀitamiseks tootmiskeskkondades.
  2. 90+ kasulikku tööriista Kubernetes'ile: juurutamine, haldamine, jÀlgimine, turvalisus ja mitte ainult.
  3. Meie Tee Kuberneetes kanal Telegrmis.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster