Scalability ose mana'oga autu mo fa'aoga ao. Faatasi ai ma Kubernetes, o le faʻatupuina o se talosaga e faigofie pei o le faʻateleina o le numera o faʻataʻitaʻiga mo le faʻatulagaina talafeagai poʻo ReplicaSet - ae o se faiga tusilima.
Kubernetes fa'atagaina talosaga e otometi ona fa'afuaina (ie Pods i se fa'agaioiga po'o ReplicaSet) i se auala faʻaalia e faʻaaoga ai le faʻamatalaga Horizontal Pod Autoscaler. Ole fa'ata'ita'iga fa'aletonu mo le fa'avasegaina otometi o le fa'aogaina o fua ole CPU (mea fa'atatau), ae e mafai ona e tu'ufa'atasia ma tu'ufa'atasiga tu'ufa'atasiga mai fafo.
au Kubernetes aaS mai Mail.ru fa'aliliuina se tala ile fa'aogaina o fua fa'atatau i fafo e otometi ai ona fua le talosaga Kubernetes. Ina ia faʻaalia pe faʻafefea ona faʻaogaina mea uma, e faʻaogaina e le tusitala le HTTP access request metrics, lea e aoina e faʻaaoga ai le Prometheus.
Nai lo le fa'ata'ita'i fa'ata'amilosaga o pods, o lo'o fa'aogaina le Kubernetes Event Driven Autoscaling (KEDA), o se fa'aoga Kubernetes fa'apitoa. O lo'o tu'ufa'atasia fa'atasi ma le Horizontal Pod Autoscaler e tu'uina atu ai le fa'aogaina o le ta'avale (e aofia ai i/mai le leai) mo galuega fa'aosoina mea. Code e maua ile GitHub.
Fa'amatalaga puupuu o le faiga
O le ata o loʻo faʻaalia ai se faʻamatalaga puupuu o le auala e galue ai mea uma:
O le talosaga e tuʻuina atu fua faʻatatau HTTP hit i le Prometheus format.
Prometheus ua fa'atulagaina e aoina nei fua fa'atatau.
O le Prometheus scaler i KEDA ua faʻatulagaina e otometi le fuaina o le talosaga e faʻatatau i le numera o HTTP hits.
O lenei o le a ou taʻuina atu ia te oe auiliiliga e uiga i elemene taʻitasi.
KEDA ma Prometheus
O le Prometheus o se faʻasalalauga faʻapitoa e mataʻituina ma mataala meafaigaluega, vaega Cloud Native Computing Foundation. Aoina metric mai punaoa eseese ma teu i latou e avea ma faʻamaumauga o taimi. Ina ia va'ai fa'amatalaga e mafai ona e fa'aogaina tusifana po'o isi mea faigaluega fa'aaliga e galulue ma le Kubernetes API.
E lagolagoina e le KEDA le manatu o le sikola - e fai ma alalaupapa i le va o le KEDA ma le faiga i fafo. Ole fa'atinoga ole scaler e fa'apitoa i faiga fa'atatau ta'itasi ma maua mai fa'amaumauga mai ai. Ona fa'aogaina lea e le KEDA e fa'atonutonu ai le fa'avasegaina otometi.
E lagolagoina e tagata sikola le tele o faʻamaumauga, mo se faʻataʻitaʻiga, Kafka, Redis, Prometheus. O lona uiga, e mafai ona fa'aogaina le KEDA e fa'afua ai le fa'aogaina o Kubernetes e fa'aaoga ai le Prometheus metrics e fai ma ta'iala.
Su'ega talosaga
O le su'ega a le Golang e maua ai le avanoa e ala i le HTTP ma faia ni galuega taua se lua:
Fa'aoga le faletusi a le tagata o tausia o le Prometheus Go e fa'aoga ai le talosaga ma tu'u mai le metric http_requests, o lo'o i ai se numera lavea. O le fa'ai'uga o lo'o maua ai le Prometheus metrics o lo'o i le URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
I le tali atu i se talosaga GET o le talosaga e faʻaopoopo le tau o le ki (access_count) i Redis. O se auala faigofie lea e fai ai le galuega o se vaega o le HTTP handler ma siaki Prometheus metrics. E tatau ona tutusa le tau metric ma le tau access_count i Redis.
O loʻo tuʻuina atu le talosaga i Kubernetes e ala i Deployment. Ua faia foi se auaunaga ClusterIP, e mafai ai e le Prometheus server ona maua fua faʻatatau.
O le sikola e fai ma alalaupapa i le va o le KEDA ma le faiga i fafo e mana'omia ona maua mai ai fua. ScaledObject o se aganuʻu aganuʻu e manaʻomia ona faʻapipiʻiina e faʻafetaui le faʻapipiʻiina ma le mea na tupu, i lenei tulaga Prometheus.
ScaledObject o lo'o iai fa'amatalaga fa'ata'atiaga, fa'amatalaga fa'apogai o mea na tutupu (e pei o feso'ota'iga mealilo, igoa fa'asologa), va'aiga palota, taimi toe fa'aleleia, ma isi fa'amaumauga. E i'u ai i le fa'atatauina o le autoscaling resource (HPA definition) e fa'afua ai le fa'atinoina.
A o se mea faitino ScaledObject ua tapeina, ua kilia le faauigaga tutusa o le HPA.
O le fa'amatalaga lea ScaledObject mo la tatou faʻataʻitaʻiga, e faʻaaogaina ai se sikola Prometheus:
Ituaiga fa'aoso - Prometheus. O le tuatusi server Prometheus o loʻo taʻua faʻatasi ma le igoa metric, paepae ma ole fesili ole PromQL, lea o le a faʻaaogaina. Fesili PromQL - sum(rate(http_requests[2m])).
E tusa ai pollingInterval,E mana'omia e KEDA se fa'amoemoe mai le Prometheus i le sefululima sekone. Le itiiti ifo ma le tasi i lalo (minReplicaCount), ma le numera maualuga o pods e le sili atu maxReplicaCount (i lenei faʻataʻitaʻiga - sefulu).
E mafai ona fa'apipi'i minReplicaCount tutusa ma le leai. I le tulaga lea, e fa'agaoioi e KEDA le fa'aogaina o le zero-to-one ona fa'aalia lea o le HPA mo le fa'ateleina otometi. O le fa'asologa fa'asolosolo e mafai fo'i, o lona uiga, fa'asolo mai le tasi i le zero. I le faʻataʻitaʻiga, matou te leʻi filifilia se zero ona o se auaunaga HTTP ae le o se faiga faʻapitoa.
O le togafiti i totonu o le autoscaling
E faʻaaogaina le faʻailoga e fai ma faʻaoso e faʻateleina le faʻapipiʻiina. I la matou faʻataʻitaʻiga, o le PromQL fesili sum(rate (http_requests [2m])) toe fa'afo'i le aofa'i o talosaga HTTP fa'aopoopo (talosaga i le sekone), fua i le lua minute mulimuli.
Talu ai o le tau fa'ailoga e tolu, o lona uiga o le ai ai le tasi i lalo ae o le tau sum(rate (http_requests [2m])) itiiti ifo i le tolu. Afai e fa'atupula'ia le tau, e fa'aopoopoina i taimi ta'itasi se fa'aopoopoga fa'aopoopo sum(rate (http_requests [2m])) faateleina i le tolu. Mo se faʻataʻitaʻiga, afai o le tau mai le 12 i le 14, o le numera o pods e fa.
Se'i o tatou taumafai nei e fa'atulaga!
muai seti
Pau lava le mea e te manaʻomia o le Kubernetes cluster ma se faʻaoga faʻaoga kubectl. O lenei faʻataʻitaʻiga e faʻaaogaina se fuifui minikube, ae e mafai ona e aveina se isi. E fa'apipi'i se fuifui e iai taʻitaʻi.
helm init amataina le fa'aoga laina laina fa'apitonu'u ma fa'apipi'i fo'i Tiller i le fuifui Kubernetes.
kubectl get pods -n kube-system | grep tiller
Faatali mo le Tiller pod e ulufale i le Running state.
Fa'amatalaga a le faaliliu: E faʻaaogaina e le tusitala Helm@2, lea e manaʻomia ai le faʻapipiʻiina o le Tiller server. Ole Helm@3 e talafeagai, e le manaʻomia se vaega o le server.
A maeʻa ona faʻapipiʻi Helm, e tasi le poloaiga e lava e amata ai Redis:
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
Siaki ua amata mea uma:
kubectl get pods -l=app=go-prom-app
Faatali mo Redis e ulufale i le setete Running.
Fa'atonuina o le Prometheus Server
O loʻo faʻaaogaina e le Prometheus manifest Kubernetes Service Discovery mo Prometheus. E fa'ataga ai le su'esu'eina malosi o pusa talosaga e fa'atatau i le igoa o le tautua.
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
Siaki ua amata mea uma:
kubectl get pods -l=app=prometheus-server
Faatali mo Prometheus e alu i le setete Running.
Faaaoga kubectl port-forward e maua ai le Prometheus user interface (po'o le API server) i http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
O le taunuuga e foliga mai e pei o lenei:
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"
Siaki i lalo o talosaga. E tasi le faʻataʻitaʻiga e tatau ona tamoe aua minReplicaCount tutusa 1:
kubectl get pods -l=app=go-prom-app
Fa'amaonia na fa'atupuina ma le manuia le punaoa HPA:
kubectl get hpa
E tatau ona e vaʻai i se mea e pei o:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Siakiga ole soifua maloloina: avanoa fa'aoga
Ina ia maua le fa'ai'uga a le matou talosaga, tamo'e:
Ua mafai nei ona e mauaina lau Go app e fa'aoga ai le tuatusi http://localhost:8080. Ina ia faia lenei mea, fai le poloaiga:
curl http://localhost:8080/test
O le taunuuga e foliga mai e pei o lenei:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
I le taimi lea, siaki foi Redis. O le ae vaai i lena ki access_count faateleina i le 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Ia mautinoa o le tau metric http_requests tutusa lava:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Foafoaga uta
O le a matou faʻaaogaina Ei - aoga mo le gaosia o uta:
I lenei tulaga o le taunuuga moni o le 1,686057971014493 ma o loʻo faʻaalia i le fanua value. E le lava lea mo le fa'afuaina, talu ai o le fa'ailoga matou te setiina e 3.
Tele uta!
I totonu o le laina fou, mataʻituina le numera o pusa talosaga:
kubectl get pods -l=app=go-prom-app -w
Sei o tatou faʻateleina le uta e faʻaaoga ai le poloaiga:
./hey -n 2000 http://localhost:8080/test
A maeʻa sina taimi, o le a e vaʻai i le HPA o loʻo faʻapipiʻiina le faʻapipiʻiina ma faʻalauiloa fou pods. Siaki lau HPA ina ia mautinoa:
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
Afai e le fetaui le uta, o le a faʻaitiitia le faʻapipiʻiina i le tulaga e naʻo le tasi le pod o loʻo taʻavale. Afai e te manaʻo e siaki le metric moni (toe faʻafoʻi e le PromQL fesili), ona faʻaaoga lea o le poloaiga:
//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
iʻuga
KEDA fa'atagaina oe e otometi le fuaina o au fa'agaioiga Kubernetes (i/mai le zero) fa'atatau i fa'amaumauga mai metric mai fafo. Mo se faʻataʻitaʻiga, faʻavae i luga o le Prometheus metrics, laina umi i Redis, tagata faʻatau i le autu Kafka.
O lo'o tu'ufa'atasia le KEDA ma se puna mai fafo ma tu'uina atu fo'i ana fua fa'atatau e ala ile Metrics Server ile Horizontal Pod Autoscaler.