Shkallueshmëria është një kërkesë kryesore për aplikacionet cloud. Me Kubernetes, shkallëzimi i një aplikacioni është po aq i thjeshtë sa rritja e numrit të kopjeve për vendosjen e duhur ose ReplicaSet - por është një proces manual.
Kubernetes lejon që aplikacionet të shkallëzohen automatikisht (d.m.th. Pods në një vendosje ose ReplicaSet) në mënyrë deklarative duke përdorur specifikimin Horizontal Pod Autoscaler. Kriteri i parazgjedhur për shkallëzimin automatik është metrika e përdorimit të CPU (metrika e burimeve), por ju mund të integroni metrikë të personalizuar dhe të ofruar nga jashtë.
Ekip Kubernetes aaS nga Mail.ru përktheu një artikull se si të përdorni metrikë të jashtëm për të shkallëzuar automatikisht një aplikacion Kubernetes. Për të treguar se si funksionon gjithçka, autori përdor matjet e kërkesës për qasje në HTTP, të cilat mblidhen duke përdorur Prometheus.
Në vend të shkallëzimit automatik horizontal të pods, përdoret Kubernetes Event Driven Autoscaling (KEDA), një operator Kubernetes me burim të hapur. Ai integrohet në mënyrë origjinale me Horizontal Pod Autoscaler për të ofruar shkallëzim automatik të pandërprerë (duke përfshirë në/nga zero) për ngarkesat e punës të drejtuara nga ngjarjet. Kodi i disponueshëm në GitHub.
Pasqyrë e shkurtër e sistemit
Diagrami tregon një përshkrim të shkurtër se si funksionon gjithçka:
Aplikacioni ofron metrikë të numrit të goditjeve HTTP në formatin Prometheus.
Prometheus është konfiguruar për të mbledhur këto metrikë.
Skalleri Prometheus në KEDA është konfiguruar që të shkallëzojë automatikisht aplikacionin bazuar në numrin e goditjeve HTTP.
Tani do t'ju tregoj në detaje për secilin element.
KEDA dhe Prometeu
Prometheus është një pjesë e veglave të monitorimit dhe sinjalizimit të sistemit me burim të hapur Fondacioni Cloud Native Computing. Mbledh metrika nga burime të ndryshme dhe i ruan ato si të dhëna të serive kohore. Për të vizualizuar të dhënat që mund të përdorni grafana ose mjete të tjera vizualizimi që punojnë me Kubernetes API.
KEDA mbështet konceptin e një shkallëzuesi - ai vepron si një urë lidhëse ndërmjet KEDA-s dhe sistemit të jashtëm. Zbatimi i shkallëzuesit është specifik për çdo sistem të synuar dhe nxjerr të dhëna prej tij. Më pas KEDA i përdor ato për të kontrolluar shkallëzimin automatik.
Scalers mbështesin burime të shumta të të dhënave, për shembull, Kafka, Redis, Prometheus. Kjo do të thotë, KEDA mund të përdoret për të shkallëzuar automatikisht vendosjet e Kubernetes duke përdorur metrikën Prometheus si kriter.
Aplikimi testues
Aplikacioni i testit Golang siguron akses nëpërmjet HTTP dhe kryen dy funksione të rëndësishme:
Përdor bibliotekën e klientëve Prometheus Go për të instrumentuar aplikacionin dhe për të ofruar metrikën http_kërkesat, e cila përmban një numër të goditjeve. Pika përfundimtare ku janë të disponueshme matjet e Prometheus ndodhet në URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Në përgjigje të një kërkese GET aplikacioni rrit vlerën e çelësit (access_count) në Redis. Kjo është një mënyrë e thjeshtë për të kryer punën si pjesë e një mbajtësi HTTP dhe gjithashtu për të kontrolluar matjet e Prometheus. Vlera metrike duhet të jetë e njëjtë me vlerën access_count në Redis.
Aplikacioni vendoset në Kubernetes nëpërmjet Deployment. Gjithashtu krijohet një shërbim ClusterIP, lejon serverin Prometheus të marrë metrikat e aplikacionit.
Skaleri vepron si një urë lidhëse ndërmjet KEDA-s dhe sistemit të jashtëm nga i cili duhet të merren metrikat. ScaledObject është një burim i personalizuar që duhet të vendoset për të sinkronizuar vendosjen me burimin e ngjarjes, në këtë rast Prometheus.
ScaledObject përmban informacione për shkallëzimin e vendosjes, meta të dhënat e burimit të ngjarjeve (si sekretet e lidhjes, emri i radhës), intervalin e votimit, periudhën e rikuperimit dhe të dhëna të tjera. Rezulton në burimin përkatës të shkallëzimit automatik (përkufizimi HPA) për të shkallëzuar vendosjen.
Kur një objekt ScaledObject fshihet, përkufizimi përkatës i HPA pastrohet.
Këtu është përkufizimi ScaledObject për shembullin tonë, ai përdor një shkallëzues Prometheus:
Lloji i këmbëzës - Prometheus. Adresa e serverit Prometheus përmendet së bashku me emrin metrikë, pragun dhe Pyetje PromQL, i cili do të përdoret. Pyetja PromQL - sum(rate(http_requests[2m])).
Sipas pollingIntervalKEDA kërkon një objektiv nga Prometeu çdo pesëmbëdhjetë sekonda. Të paktën një nën (minReplicaCount), dhe numri maksimal i bishtajave nuk kalon maxReplicaCount (në këtë shembull - dhjetë).
Mund të instalohet minReplicaCount e barabartë me zero. Në këtë rast, KEDA aktivizon vendosjen zero me një dhe më pas ekspozon HPA për shkallëzim të mëtejshëm automatik. Rendi i kundërt është gjithashtu i mundur, domethënë, shkallëzimi nga një në zero. Në shembull, ne nuk zgjodhëm zero sepse ky është një shërbim HTTP dhe jo një sistem sipas kërkesës.
Magjia brenda shkallëzimit automatik
Pragu përdoret si shkas për të shkallëzuar vendosjen. Në shembullin tonë, pyetja PromQL sum(rate (http_requests [2m])) kthen shkallën e përmbledhur të kërkesës HTTP (kërkesat për sekondë), të matur gjatë dy minutave të fundit.
Meqenëse vlera e pragut është tre, do të thotë se do të jetë një nën ndërsa vlera sum(rate (http_requests [2m])) më pak se tre. Nëse vlera rritet, çdo herë shtohet një nën shtesë sum(rate (http_requests [2m])) rritet me tre. Për shembull, nëse vlera është nga 12 në 14, atëherë numri i bishtajave është katër.
Tani le të përpiqemi ta konfigurojmë!
paravendosje
Gjithçka që ju nevojitet është një grup Kubernetes dhe një mjet i konfiguruar kubectl. Ky shembull përdor një grup minikube, por ju mund të merrni ndonjë tjetër. Për të instaluar një grup ekziston udhëheqja.
helm init inicializon ndërfaqen e linjës komanduese lokale dhe gjithashtu instalon Tiller te grupi Kubernetes.
kubectl get pods -n kube-system | grep tiller
Prisni që pod Tiller të hyjë në gjendjen e funksionimit.
Shënim i përkthyesit: Autori përdor Helm@2, i cili kërkon që komponenti i serverit Tiller të instalohet. Tani Helm@3 është i rëndësishëm, nuk kërkon një pjesë të serverit.
Pas instalimit të Helm, mjafton një komandë për të nisur Redis:
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
Kontrolloni që gjithçka ka filluar:
kubectl get pods -l=app=prometheus-server
Prisni që Prometeu të hyjë në shtet Running.
përdorim kubectl port-forward për të hyrë në ndërfaqen e përdoruesit të Prometheus (ose serverin API) në http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Rezultati duket diçka si ky:
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"
Kontrolloni nën aplikacionet. Një shembull duhet të funksionojë sepse minReplicaCount është e barabartë me 1:
kubectl get pods -l=app=go-prom-app
Verifikoni që burimi HPA është krijuar me sukses:
kubectl get hpa
Ju duhet të shihni diçka të tillë:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Kontrolli shëndetësor: qasja në aplikacion
Për të hyrë në pikën përfundimtare REST të aplikacionit tonë, ekzekutoni:
Tani mund të hyni në aplikacionin tuaj Go duke përdorur adresën http://localhost:8080. Për ta bërë këtë, ekzekutoni komandën:
curl http://localhost:8080/test
Rezultati duket diçka si ky:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Në këtë pikë kontrolloni edhe Redis. Do të shihni se çelësi access_count u rrit në 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Sigurohuni që vlera metrike është http_requests e njëjta:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Krijimi i ngarkimit
ne do të përdorim hej — mjet për gjenerimin e ngarkesës:
Në këtë rast, rezultati aktual është 1,686057971014493 dhe shfaqet në fushë value. Kjo nuk mjafton për shkallëzim, pasi pragu që vendosëm është 3.
Më shumë ngarkesë!
Në terminalin e ri, monitoroni numrin e podave të aplikacionit:
kubectl get pods -l=app=go-prom-app -w
Le të rrisim ngarkesën duke përdorur komandën:
./hey -n 2000 http://localhost:8080/test
Pas një kohe, do të shihni HPA që shkallëzon vendosjen dhe lëshon pods të rinj. Kontrolloni HPA-në tuaj për t'u siguruar:
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
Nëse ngarkesa është e paqëndrueshme, vendosja do të reduktohet deri në pikën ku funksionon vetëm një pod. Nëse dëshironi të kontrolloni metrikën aktuale (të kthyer nga pyetja PromQL), atëherë përdorni komandën:
//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
Përfundim
KEDA ju lejon të shkallëzoni automatikisht vendosjet tuaja të Kubernetes (në/nga zero) bazuar në të dhënat nga matjet e jashtme. Për shembull, bazuar në matjet e Prometheus, gjatësia e radhës në Redis, vonesa e konsumatorit në temën Kafka.
KEDA integrohet me një burim të jashtëm dhe gjithashtu ofron matjet e tij përmes Metrics Server në Horizontal Pod Autoscaler.