Skalabilnost je ključni zahtjev za aplikacije u oblaku. Uz Kubernetes, skaliranje aplikacije je jednostavno kao povećanje broja replika za odgovarajuću implementaciju ili ReplicaSet — ali to je ručni proces.
Kubernetes omogućava da se aplikacije automatski skaliraju (tj. Podovi u implementaciji ili ReplicaSet) na deklarativni način koristeći specifikaciju Horizontal Pod Autoscaler. Zadani kriterij za automatsko skaliranje je metrika korištenja CPU-a (metrika resursa), ali možete integrirati prilagođene i eksterno dostavljene metrike.
tim Kubernetes aaS sa Mail.ru preveo je članak o tome kako koristiti eksterne metrike za automatsko skaliranje Kubernetes aplikacije. Kako 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 operater otvorenog koda. Nativno se integrira sa Horizontal Pod Autoscaler kako bi omogućio besprijekorno automatsko skaliranje (uključujući od/od nule) za radna opterećenja vođena događajima. Kod dostupan na GitHub.
Kratak pregled sistema
Dijagram prikazuje kratak opis kako sve funkcionira:
Aplikacija pruža HTTP metriku broja pogodaka u Prometheus formatu.
Prometheus je konfiguriran da prikuplja ove metrike.
Prometheus skaler u KEDA-i je konfigurisan da automatski skalira aplikaciju na osnovu broja HTTP pogodaka.
Sada ću vam reći detaljno o svakom elementu.
KEDA i Prometej
Prometheus je komplet alata za praćenje i upozorenje otvorenog koda, dio Cloud Native Computing Foundation. Prikuplja metriku 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 sa Kubernetes API-jem.
KEDA podržava koncept skalera – on djeluje kao most između KEDA-e i vanjskog sistema. Implementacija skalera je specifična za svaki ciljni sistem 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 implementacije koristeći Prometheus metriku kao kriterijum.
Test aplikacija
Golang test aplikacija omogućava pristup putem HTTP-a i obavlja dvije važne funkcije:
Koristi klijentsku biblioteku Prometheus Go da instrumentira aplikaciju i pruži metriku http_requests, koja sadrži broj pogodaka. Krajnja tačka na kojoj su dostupne Prometheus metrike nalazi se na URI /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 provjerite Prometheus metriku. Vrijednost metrike mora biti ista kao i vrijednost access_count Redis.
Skaler djeluje kao most između KEDA-e i vanjskog sistema iz kojeg se moraju dobiti metrika. ScaledObject je prilagođeni resurs koji treba da se rasporedi da bi se implementacija sinhronizovala sa izvorom događaja, u ovom slučaju Prometheus.
ScaledObject sadrži informacije o skaliranju implementacije, metapodatke izvora događaja (kao što su tajne veze, ime reda), interval prozivanja, period oporavka i druge podatke. Rezultat je odgovarajući resurs za automatsko skaliranje (HPA definicija) za skaliranje implementacije.
Kada objekat 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 servera se spominje zajedno sa imenom metrike, pragom i PromQL upit, koji će se koristiti. PromQL upit - sum(rate(http_requests[2m])).
Prema pollingIntervalKEDA traži metu od Prometeja svakih petnaest sekundi. Najmanje jedan ispod (minReplicaCount), a maksimalni broj mahuna ne prelazi maxReplicaCount (u ovom primjeru - deset).
Može se instalirati minReplicaCount jednaka nuli. U ovom slučaju, KEDA aktivira primenu nula prema jedan, a zatim izlaže HPA za dalje 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 sistem na zahtjev.
Magija 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 u sekundi), mjerenu u posljednje dvije minute.
Pošto je vrijednost praga tri, to znači da će biti jedan ispod dok je vrijednost 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.
Pokušajmo sada to podesiti!
unapred podešavanje
Sve što vam treba je Kubernetes klaster i konfigurisani uslužni program kubectl. Ovaj primjer koristi klaster minikube, ali možete uzeti bilo koji drugi. Za instaliranje klastera postoji vodič.
helm init inicijalizira sučelje lokalne komandne linije i također instalira Tiller u Kubernetes klaster.
kubectl get pods -n kube-system | grep tiller
Pričekajte da Tiller pod uđe u stanje Running.
Napomena prevodioca: Autor koristi Helm@2, koji zahtijeva instaliranje Tiller serverske komponente. Sada je Helm@3 relevantan, ne zahtijeva serverski dio.
Nakon instaliranja Helm-a, jedna naredba je dovoljna za pokretanje Redis-a:
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
Sačekajte da Prometej pređe u stanje Running.
Koristite kubectl port-forward za pristup Prometheus korisničkom interfejsu (ili API serveru) 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 zdravlja: pristup aplikaciji
Da pristupite REST krajnjoj tački naše aplikacije, pokrenite:
Sada možete pristupiti svojoj Go aplikaciji koristeći adresu 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ćano 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
Kreiranje učitavanja
Koristić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, jer 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, implementacija će se smanjiti do točke u kojoj radi samo jedna pod. Ako želite provjeriti stvarnu metriku (koju je vratio PromQL upit), tada koristite 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ćava da automatski skalirate svoje Kubernetes implementacije (na/od nule) na osnovu podataka iz eksternih metrika. Na primjer, na osnovu Prometheus metrike, dužine reda u Redis-u, kašnjenja potrošača u Kafka temi.
KEDA se integriše sa eksternim izvorom i takođe obezbeđuje svoje metrike preko Metrics Servera do Horizontal Pod Autoscaler.