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

Skeemil on lĂŒhike kirjeldus sellest, kuidas kĂ”ik töötab:
- Rakendus pakub HTTP-pÀringute arvust mÔÔdikud Prometheus formaadis.
- Prometheus on seadistatud nende nÀitajate kogumiseks.
- 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 . See kogub mÔÔdikud erinevatest allikatest ja salvestab need ajareadana. Andmete visualiseerimiseks saab kasutada 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:
- 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", }) - PÀringule vastates
GETrakendus 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ÀÀrtusaccess_countRedis'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 .
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,ClusterRoleBindingjaServiceAccountâ teenuste autoavastamise toimimiseks Kubernetes'is (Auto-discovery).
Siin .
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:
- See osutab
Deploymentnimegago-prom-app. - Triggere tĂŒĂŒbi â
Prometheus. Prometheuse serveri aadress mainitakse koos mÔÔdiku nime, lÀvivÀÀrtuse ja , mida kasutatakse. PromQL pÀring onsum(rate(http_requests[2m])). - Vastavalt
pollingInterval, KEDA kĂŒsib sihtpunkti Prometheux 'ilt igal viiel sekundil. Minimaalne koormuse arv on vĂ€hemalt ĂŒks (minReplicaCount), maksimaalne koormus ei ĂŒletamaxReplicaCountnĂ€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 .
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 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 . 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 . 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 . 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 .
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 . 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 â koormuse genereerimise utiliiti:
curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64
&& chmod a+x hey
Samuti vÔite allalaadida utiliidi vÔi .
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:
- .
- .
- .
Allikas: habr.com
