Scalability clavis postulatur ad applicationes nubeculas. Cum Kubernetes, applicatio scalarum tam simplex est quam numerum replicationum augens ad aptam instruere vel ReplicaSet β sed processus manualis est.
Kubernetes applicationes admittit ut sponte scalis (i.e. leguminis in instruere vel ReplicaSet) modo declarativo utens specificatione Pod Horizontalis Autoscaler. Criterium defalta latae scalae CPU usus metrics (resource metrics), sed consuetudinem integrare potes et metris extrinsecus instructis.
bigas Kubernetes aaS ex Mail.ru articulus interpretatus est quomodo metris externis utendi ad applicationem Kubernetes automatice conscenderet. Ut ostenderet quomodo omnia opera, auctor accessum HTTP postulationis metricae adhibet, quae Prometheo utens collecta sunt.
Loco horizontalis autoscaling siliquarum, Eventus Kubernetes Autoscaling (KEDA) adhibitus, fons aperta Kubernetes operator. Integrum nativo cum Pod Autoscaler Horizontali integrationem autoscaling (inclusa / ex nihilo) in laboribus eventis agitatae praebet. Code available at GitHub.
Brevis contemplationis ratio operandi
Tabula breviter ostendit quomodo omnia opera sint;
Applicatio HTTP hit narrationem metricam in forma Promethei praebet.
Horum metrorum colligere Prometheus configuratur.
Prometheus scaber in KEDA configuratur ut statim applicationes ascendat secundum numerum HTTP hittorum.
Nunc de singulis elementis singillatim dicam.
KEDA et Prometheus
Prometheus fons aperta est ratio vigilantia et toolkit vigilantia, pars Arx nubes Computing Foundation. Collectae metricae ex variis auctoribus et pro temporis serie notatae easque recondit. Ad visualize notitia vos can utor grafana vel alia instrumenta visualizationis quae apud Kubernetes API laborant.
KEDA notionem scalaris sustinet - ut pons inter KEDA et systema externum agit. Exsecutio scalaris est specifica unicuique systematis scopo et ex eo notitia extracta. KEDA illis utitur ad scalas latis moderandas.
Scalers multiplex notitia fontes sustinent, exempli gratia, Kafka, Redis, Prometheus. Hoc est, KEDA ad automatice conscendere posse Kubernetes Prometheus metrice utendi criteriis utens instruere.
Test application
Golang experimentum applicationis aditum per HTTP praebet et duo munera magni momenti facit:
Prometheus Ite clientelam bibliothecam utitur ad applicationem instrumentorum et praebendas http_requestas metricas, quae hit narrationem continet. Finis ubi Prometheus metrice in promptu est, sita est in URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
In responsio ad petitionem GET per applicationem incrementa valorem clavis (access_count) in Redis. Haec facilis via est ad faciendum opus ut partem HTTP tracto et etiam Promethei metricam reprehendo. Valor metricus idem esse debet ac valor access_count in Redis.
Ad Kubernetes via . applicatio explicatur Deployment. Ministerium etiam creatus est ClusterIPtur, permittit Prometheum servo applicationis metricos impetrare.
Scala fungitur pontis inter KEDA et systema externum unde metri opus obtinendum est. ScaledObject est consuetudo subsidii quae explicanda est ut instruere possit cum eventu fonte, in hoc casu Prometheus.
ScaledObject continet instruere scalas informationes, eventus fontem metadatam (ut connexionem secretorum, queue nomen), saeptum intervallum, tempus recuperationis et alia notitia. Provenit in respondente resource autoscaling (HPA definitione) ut instruere instruere.
Cum aliquid ScaledObject deleta est, debita HPA definitio explicatur.
Hic est definitio ScaledObject pro exemplo nostro utitur scaber Prometheus:
Genus felis - Prometheus. Inscriptio Promethei commemoratur una cum metrico nomine limen and PromQL quaesitumqui utendum erit. PromQL Query - sum(rate(http_requests[2m])).
secundum pollingIntervalKEDA signum a Prometheo singulis secundis quindecim petit. Saltem unus sub (minReplicaCount) et siliquarum numerus maximus non excedit maxReplicaCount (in this example - decem).
Potest installed minReplicaCount nulla eft. Hoc in casu, KEDA nulla ad unam instruere operatur ac deinde HPA patefacit ad scalas ulteriores latae. Potest etiam ordo contrarius, hoc est, scalis ab uno in nihilum. In exemplo, non nulla nulla delectus, quia HTTP est opera et ratio non postulatio.
Magia intus autoscaling
Limen dictum ut felis eu nibh. In nostro exemplo PromQL quaesitum est sum(rate (http_requests [2m])) redit aggregatum HTTP postulationis rate (per secunda petitiones), in duobus ultimis minutis mensus.
Cum limen valorem tres sit, significat unum esse sub valore sum(rate (http_requests [2m])) minus tribus. Si valor augetur, adiectis sub singulis additur temporibus sum(rate (http_requests [2m])) addit per tres. Exempli gratia, si valor est ab 12 ad 14, tum siliquarum numerus est quatuor.
Nunc conemur statuere!
Pre-occasum
Omnes opus est botrus Kubernetes et utilitas configurata kubectl. Hoc exemplum botri utitur minikubesed aliquam aliam potes accipere. Ut install botri est ducis.
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
Reprehendo omnia quae incepit:
kubectl get pods -l=app=prometheus-server
Exspecta Prometheum ut iret in statum Running.
usus kubectl port-forward to access the Prometheus user interface (sive API server) at http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Eventus aliquid simile hoc spectat:
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"
Sisto sub applicationibus. Una instantia debet esse currens, quia minReplicaCount pares I;
kubectl get pods -l=app=go-prom-app
Cognoscere quod resource HPA creatum est feliciter:
kubectl get hpa
Videres aliquid simile;
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Salutem reprehendo: application access
Ut accedere ad applicationem nostrae quietis terminus, currite:
Nunc potes accedere tuum Ite app utens inscriptione http://localhost:8080. Ad hoc currite imperium;
curl http://localhost:8080/test
Eventus aliquid simile hoc spectat:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Hie quoque Redis reprehendo. Videbis clavem access_count auctus ad I;
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Fac valorem metricum est http_requests ipse:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
In hoc casu ipse effectus est 1,686057971014493 et ostenditur in agro value. Hoc non satis est ad scalas, cum in limine 3 posuimus.
Plus oneris!
In novo termino, monitor siliquae applicationis numerum;
kubectl get pods -l=app=go-prom-app -w
Augeamus onus utendo imperio;
./hey -n 2000 http://localhost:8080/test
Post aliquantum, videbis HPA instruere scalas et novas siliquas immittere. HPA reprehendo tuum fac:
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
Si onus repugnet, institutio reducetur ad punctum ubi unum tantum vasculum currit. Si ipsam metricam inspicere vis (per interrogationem PromQL redditam), tunc utere imperio;
//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
conclusio,
KEDA permittit te ut sponte tua Kubernetes instruere (ad/a nulla) fundata in notitia metri externae permittat. Exempli gratia, ex metrica Promethei, queue longitudo in Redis, dolor latency in Kafka topic.
KEDA cum externo fonte integrat et etiam metrica sua praebet per Metrics Servo ad Pod Horizontalem Autoscaler.