Skalerbarhed er et nøglekrav for cloud-applikationer. Med Kubernetes er det lige så enkelt at skalere en applikation som at øge antallet af replikaer til den relevante implementering eller ReplicaSet - men det er en manuel proces.
Kubernetes tillader, at applikationer automatisk skaleres (dvs. Pods i en implementering eller ReplicaSet) på en deklarativ måde ved hjælp af Horizontal Pod Autoscaler-specifikationen. Standardkriteriet for automatisk skalering er CPU-forbrugsmålinger (ressourcemålinger), men du kan integrere brugerdefinerede og eksternt leverede metrics.
Team Kubernetes aaS fra Mail.ru oversat en artikel om, hvordan man bruger eksterne målinger til automatisk at skalere en Kubernetes-applikation. For at vise, hvordan alt fungerer, bruger forfatteren HTTP-adgangsanmodningsmålinger, som indsamles ved hjælp af Prometheus.
I stedet for horisontal autoskalering af pods, bruges Kubernetes Event Driven Autoscaling (KEDA), en open source Kubernetes-operatør. Den integreres naturligt med Horizontal Pod Autoscaler for at give problemfri autoskalering (inklusive til/fra nul) til hændelsesdrevne arbejdsbelastninger. Kode tilgængelig på GitHub.
Kort oversigt over systemet
Diagrammet viser en kort beskrivelse af, hvordan alt fungerer:
Applikationen giver HTTP-hitantal-metrics i Prometheus-format.
Prometheus er konfigureret til at indsamle disse metrics.
Prometheus scaler i KEDA er konfigureret til automatisk at skalere applikationen baseret på antallet af HTTP-hits.
Nu vil jeg fortælle dig i detaljer om hvert element.
KEDA og Prometheus
Prometheus er et open source-system, overvågnings- og alarmeringsværktøj, del Cloud Native Computing Foundation. Indsamler metrics fra forskellige kilder og gemmer dem som tidsseriedata. For at visualisere data kan du bruge grafana eller andre visualiseringsværktøjer, der fungerer med Kubernetes API.
KEDA understøtter konceptet med en scaler - den fungerer som en bro mellem KEDA og det eksterne system. Skalerimplementeringen er specifik for hvert målsystem og udtrækker data fra det. KEDA bruger dem derefter til at styre automatisk skalering.
Skalere understøtter flere datakilder, for eksempel Kafka, Redis, Prometheus. Det vil sige, at KEDA kan bruges til automatisk at skalere Kubernetes-implementeringer ved hjælp af Prometheus-metrics som kriterier.
Test applikation
Golang-testapplikationen giver adgang via HTTP og udfører to vigtige funktioner:
Bruger Prometheus Go-klientbiblioteket til at instrumentere applikationen og levere http_requests-metrikken, som indeholder et hitantal. Slutpunktet, hvor Prometheus-metrics er tilgængelige, er placeret på URI'en /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Som svar på en anmodning GET applikationen øger værdien af nøglen (access_count) i Redis. Dette er en nem måde at udføre arbejdet som en del af en HTTP-handler og også kontrollere Prometheus-metrics. Den metriske værdi skal være den samme som værdien access_count i Redis.
Applikationen implementeres til Kubernetes via Deployment. Der oprettes også en service ClusterIP, giver det Prometheus-serveren mulighed for at hente applikationsmetrics.
Skaleren fungerer som en bro mellem KEDA og det eksterne system, hvorfra målinger skal hentes. ScaledObject er en tilpasset ressource, der skal implementeres for at synkronisere implementeringen med hændelseskilden, i dette tilfælde Prometheus.
ScaledObject indeholder installationsskaleringsoplysninger, hændelseskildemetadata (såsom forbindelseshemmeligheder, kønavn), polling-interval, gendannelsesperiode og andre data. Det resulterer i den tilsvarende autoskaleringsressource (HPA-definition) for at skalere implementeringen.
Når en genstand ScaledObject slettes, slettes den tilsvarende HPA-definition.
Her er definitionen ScaledObject for vores eksempel bruger den en scaler Prometheus:
Trigger type - Prometheus. Prometheus-serveradressen er nævnt sammen med metrisk navn, tærskel og PromQL forespørgsel, som vil blive brugt. PromQL-forespørgsel - sum(rate(http_requests[2m])).
Ifølge pollingInterval,KEDA anmoder om et mål fra Prometheus hvert femtende sekund. Mindst én under (minReplicaCount), og det maksimale antal bælg overstiger ikke maxReplicaCount (i dette eksempel - ti).
Kan installeres minReplicaCount lig med nul. I dette tilfælde aktiverer KEDA nul-til-en-implementeringen og afslører derefter HPA'en for yderligere automatisk skalering. Den omvendte rækkefølge er også mulig, det vil sige skalering fra en til nul. I eksemplet valgte vi ikke nul, fordi dette er en HTTP-tjeneste og ikke et on-demand-system.
Magien i autoskalering
Tærsklen bruges som en trigger til at skalere implementeringen. I vores eksempel er PromQL-forespørgslen sum(rate (http_requests [2m])) returnerer den aggregerede HTTP-anmodningshastighed (anmodninger pr. sekund), målt over de sidste to minutter.
Da tærskelværdien er tre, betyder det, at der vil være én under, mens værdien sum(rate (http_requests [2m])) mindre end tre. Hvis værdien stiger, tilføjes en ekstra sub hver gang sum(rate (http_requests [2m])) stiger med tre. For eksempel, hvis værdien er fra 12 til 14, så er antallet af pods fire.
Lad os nu prøve at sætte det op!
forudindstilling
Alt du behøver er en Kubernetes-klynge og et konfigureret hjælpeprogram kubectl. Dette eksempel bruger en klynge minikube, men du kan tage en hvilken som helst anden. For at installere en klynge er der lederskab.
helm init initialiserer den lokale kommandolinjegrænseflade og installerer også Tiller til Kubernetes-klyngen.
kubectl get pods -n kube-system | grep tiller
Vent på, at Tiller-pod'en går ind i køretilstand.
Oversætterens bemærkning: Forfatteren bruger Helm@2, som kræver, at Tiller-serverkomponenten er installeret. Nu er Helm@3 relevant, det kræver ikke en serverdel.
Efter installation af Helm er en kommando nok til at starte 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
Tjek at alt er startet:
kubectl get pods -l=app=prometheus-server
Vent på, at Prometheus går i tilstand Running.
brug kubectl port-forward for at få adgang til Prometheus-brugergrænsefladen (eller API-serveren) på http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Resultatet ser nogenlunde således ud:
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"
Tjek under ansøgninger. Én instans skal køre pga minReplicaCount er lig med 1:
kubectl get pods -l=app=go-prom-app
Bekræft, at HPA-ressourcen blev oprettet:
kubectl get hpa
Du bør se noget som:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Sundhedstjek: applikationsadgang
For at få adgang til vores applikations REST-slutpunkt skal du køre:
Du kan nu få adgang til din Go-app ved hjælp af adressen http://localhost:8080. For at gøre dette skal du køre kommandoen:
curl http://localhost:8080/test
Resultatet ser nogenlunde således ud:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
På dette tidspunkt skal du også tjekke Redis. Du vil se, at nøglen access_count øget til 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Sørg for, at den metriske værdi er http_requests det samme:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Oprettelse af belastning
Vi vil bruge hey — værktøj til generering af belastning:
I dette tilfælde er det faktiske resultat 1,686057971014493 og vises i feltet value. Dette er ikke nok til skalering, da den tærskel, vi sætter, er 3.
Mere belastning!
I den nye terminal skal du overvåge antallet af applikationspuder:
kubectl get pods -l=app=go-prom-app -w
Lad os øge belastningen ved hjælp af kommandoen:
./hey -n 2000 http://localhost:8080/test
Efter et stykke tid vil du se HPA skalere implementeringen og lancere nye pods. Tjek din HPA for at sikre dig:
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
Hvis belastningen er inkonsekvent, vil implementeringen blive reduceret til det punkt, hvor kun én pod kører. Hvis du vil kontrollere den faktiske metrik (returneret af PromQL-forespørgslen), skal du bruge kommandoen:
//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
Konklusion
KEDA giver dig mulighed for automatisk at skalere dine Kubernetes-implementeringer (til/fra nul) baseret på data fra eksterne metrics. For eksempel baseret på Prometheus-metrics, kølængde i Redis, forbrugerforsinkelse i Kafka-emnet.
KEDA integrerer med en ekstern kilde og leverer også sine metrics gennem Metrics Server til Horizontal Pod Autoscaler.