
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 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 .
SĂŒsteemi ĂŒlevaade

Joonisel on lĂŒhike seletus, kuidas kĂ”ik töötab:
- Rakendus edastab HTTP pÀringute arvu mÔÔdud Prometheus formaadis.
- Prometheus on seadistatud nende nÀitajate kogumiseks.
- 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 . Kogub mÔÔdud erinevatest allikatest ja salvestab need ajaarvamise andmetena. Andmete visualiseerimiseks vĂ”ib kasutada 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:
- 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", }) - PÀringu vastuseks
GETrakendus 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ÀÀrtusaccess_countRedis.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 .
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,ClusterRoleBindingjaServiceAccountâ teenuste automaatseks avastamiseks Kubernetesis (Auto-discovery).
Siin on .
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:
- See viitab
Deploymentnimegago-prom-app. - TĂŒĂŒbi kĂ€ivitaja â
Prometheus. Prometheuse serveri aadress mainitakse koos metrika nime, lĂ€vivÀÀrtuse ja , mida kasutatakse. PromQL pĂ€ring âsum(rate(http_requests[2m])). - 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 ĂŒletamaxReplicaCount(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 .
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 , 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 . 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 . 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 . 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 .
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 . 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 â 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 vÔi .
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:
- .
- .
- .
Allikas: habr.com
