Skalabilnost je ključni zahtjev za aplikacije u oblaku. Uz Kubernetes, skaliranje aplikacije jednostavno je poput povećanja broja replika za odgovarajuću implementaciju ili ReplicaSet — ali to je ručni proces.
Kubernetes omogućuje automatsko skaliranje aplikacija (tj. Pods u implementaciji ili ReplicaSet) na deklarativan način koristeći specifikaciju Horizontal Pod Autoscaler. Zadani kriterij za automatsko skaliranje je metrika upotrebe CPU-a (metrika resursa), ali možete integrirati prilagođene i vanjske metrike.
Momčad Kubernetes aaS s Mail.ru preveo je članak o tome kako koristiti vanjske metrike za automatsko skaliranje Kubernetes aplikacije. Da bi pokazao kako sve funkcionira, autor koristi metriku HTTP zahtjeva za pristup, koja se prikuplja pomoću Prometheusa.
Umjesto horizontalnog automatskog skaliranja podova, koristi se Kubernetes Event Driven Autoscaling (KEDA), Kubernetes operator otvorenog koda. Izvorno se integrira s Horizontal Pod Autoscaler kako bi omogućio besprijekorno automatsko skaliranje (uključujući do/od nule) za radna opterećenja vođena događajima. Kod dostupan na GitHub.
Kratak pregled sustava
Dijagram prikazuje kratak opis kako sve funkcionira:
Aplikacija pruža metriku brojanja HTTP pogodaka u Prometheus formatu.
Prometheus je konfiguriran za prikupljanje tih metrika.
Prometheus skaler u KEDA-i je konfiguriran za automatsko skaliranje aplikacije na temelju broja HTTP pogodaka.
Sada ću vam detaljno reći o svakom elementu.
KEDA i Prometej
Prometheus je skup alata za nadzor i uzbunjivanje sustava otvorenog koda, dio Cloud Native Computing Foundation. Prikuplja metrike iz različitih izvora i pohranjuje ih kao podatke vremenske serije. Za vizualizaciju podataka možete koristiti grafana ili druge alate za vizualizaciju koji rade s Kubernetes API-jem.
KEDA podržava koncept skalera - djeluje kao most između KEDA-e i vanjskog sustava. Implementacija skalera specifična je za svaki ciljni sustav i izvlači podatke iz njega. KEDA ih zatim koristi za kontrolu automatskog skaliranja.
Skaleri podržavaju više izvora podataka, na primjer, Kafka, Redis, Prometheus. To jest, KEDA se može koristiti za automatsko skaliranje Kubernetes implementacija koristeći Prometheus metriku kao kriterij.
Testna aplikacija
Testna aplikacija Golang omogućuje pristup putem HTTP-a i obavlja dvije važne funkcije:
Koristi biblioteku klijenta Prometheus Go za instrumentiranje aplikacije i pruža metriku http_requests koja sadrži broj pogodaka. Krajnja točka gdje su Prometheusove metrike dostupne nalazi se na URI-ju /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Kao odgovor na zahtjev GET aplikacija povećava vrijednost ključa (access_count) u Redisu. Ovo je jednostavan način da obavite posao kao dio HTTP rukovatelja i također provjerite Prometheusove metrike. Vrijednost metričke vrijednosti mora biti ista kao vrijednost access_count u Redisu.
Aplikacija se postavlja na Kubernetes putem Deployment. Izrađuje se i usluga ClusterIP, omogućuje poslužitelju Prometheus dobivanje metrike aplikacije.
Skaler djeluje kao most između KEDA-e i vanjskog sustava iz kojeg je potrebno dobiti metriku. ScaledObject je prilagođeni resurs koji se treba implementirati za sinkronizaciju implementacije s izvorom događaja, u ovom slučaju Prometheus.
ScaledObject sadrži informacije o skaliranju implementacije, metapodatke o izvoru događaja (kao što su tajne veze, naziv reda čekanja), interval prozivanja, razdoblje oporavka i druge podatke. Rezultat je odgovarajući resurs za automatsko skaliranje (HPA definicija) za skaliranje implementacije.
Kada objekt ScaledObject se briše, odgovarajuća HPA definicija se briše.
Evo definicije ScaledObject za naš primjer, koristi skaler Prometheus:
Vrsta okidača - Prometheus. Adresa Prometheus poslužitelja spominje se zajedno s nazivom metrike, pragom i PromQL upit, koji će se koristiti. PromQL upit - sum(rate(http_requests[2m])).
Prema pollingInterval,KEDA traži metu od Prometeja svakih petnaest sekundi. Barem jedan ispod (minReplicaCount), a najveći broj mahuna ne prelazi maxReplicaCount (u ovom primjeru - deset).
Može se instalirati minReplicaCount jednaka nuli. U ovom slučaju, KEDA aktivira implementaciju od nula prema jedan i zatim izlaže HPA za daljnje automatsko skaliranje. Moguć je i obrnuti redoslijed, odnosno skaliranje od jedan do nule. U primjeru nismo odabrali nulu jer je ovo HTTP usluga, a ne sustav na zahtjev.
Čarolija unutar automatskog skaliranja
Prag se koristi kao okidač za skaliranje implementacije. U našem primjeru, PromQL upit sum(rate (http_requests [2m])) vraća agregiranu stopu HTTP zahtjeva (zahtjeva po sekundi), izmjerenu u posljednje dvije minute.
Budući da je vrijednost praga tri, to znači da će jedna biti ispod vrijednosti sum(rate (http_requests [2m])) manje od tri. Ako se vrijednost poveća, svaki put se dodaje dodatni sub sum(rate (http_requests [2m])) povećava za tri. Na primjer, ako je vrijednost od 12 do 14, tada je broj mahuna četiri.
Sada pokušajmo to postaviti!
predpodešavanje
Sve što trebate je Kubernetes klaster i konfigurirani uslužni program kubectl. Ovaj primjer koristi klaster minikube, ali možete uzeti bilo koji drugi. Za instaliranje klastera postoji rukovodstvo.
helm init inicijalizira lokalno sučelje naredbenog retka i također instalira Tiller u Kubernetes klaster.
kubectl get pods -n kube-system | grep tiller
Pričekajte da upravljačka jedinica uđe u stanje rada.
Napomena prevoditelja: Autor koristi Helm@2, za koji je potrebno instalirati Tiller serversku komponentu. Sada je Helm@3 relevantan, ne zahtijeva serverski dio.
Nakon instalacije Helma dovoljna je jedna naredba za pokretanje Redisa:
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
Provjerite je li sve počelo:
kubectl get pods -l=app=prometheus-server
Pričekajte da Prometheus prijeđe u stanje Running.
upotreba kubectl port-forward za pristup Prometheus korisničkom sučelju (ili API poslužitelju) na http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Rezultat izgleda otprilike ovako:
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"
Provjerite pod aplikacijama. Jedna instanca mora biti pokrenuta jer minReplicaCount jednako 1:
kubectl get pods -l=app=go-prom-app
Provjerite je li HPA resurs uspješno kreiran:
kubectl get hpa
Trebali biste vidjeti nešto poput:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Provjera stanja: pristup aplikaciji
Za pristup REST krajnjoj točki naše aplikacije, pokrenite:
Sada možete pristupiti svojoj Go aplikaciji pomoću adrese http://localhost:8080. Da biste to učinili, pokrenite naredbu:
curl http://localhost:8080/test
Rezultat izgleda otprilike ovako:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
U ovom trenutku također provjerite Redis. Vidjet ćete da je ključ access_count povećan na 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Provjerite je li metrička vrijednost http_requests isto:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Stvaranje opterećenja
Koristit ćemo ej — uslužni program za generiranje opterećenja:
U ovom slučaju stvarni rezultat je 1,686057971014493 i prikazuje se u polju value. Ovo nije dovoljno za skaliranje, budući da je prag koji smo postavili 3.
Više opterećenja!
U novom terminalu pratite broj podova aplikacija:
kubectl get pods -l=app=go-prom-app -w
Povećajmo opterećenje pomoću naredbe:
./hey -n 2000 http://localhost:8080/test
Nakon nekog vremena vidjet ćete kako HPA skalira implementaciju i pokreće nove podove. Provjerite svoj HPA kako biste bili sigurni:
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
Ako je opterećenje nedosljedno, raspoređivanje će se smanjiti do točke u kojoj radi samo jedna kapsula. Ako želite provjeriti stvarnu metriku (koju vraća PromQL upit), upotrijebite naredbu:
//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
Zaključak
KEDA vam omogućuje da automatski skalirate svoje Kubernetes implementacije (na/od nule) na temelju podataka iz vanjskih metrika. Na primjer, na temelju Prometheusove metrike, duljine čekanja u Redisu, kašnjenja korisnika u Kafkinoj temi.
KEDA se integrira s vanjskim izvorom i također pruža svoje metrike putem Metrics Servera Horizontal Pod Autoscaleru.