Ang scalability usa ka hinungdanon nga kinahanglanon alang sa mga aplikasyon sa panganod. Sa Kubernetes, ang pag-scale sa usa ka aplikasyon kay yano ra sa pagdugang sa gidaghanon sa mga replika para sa angay nga pag-deploy o ReplicaSet - apan kini usa ka manual nga proseso.
Gitugotan sa Kubernetes ang mga aplikasyon nga awtomatikong ma-scale (ie Pods sa usa ka deployment o ReplicaSet) sa deklaratibo nga paagi gamit ang Horizontal Pod Autoscaler specification. Ang default nga sukdanan alang sa awtomatikong pag-scaling mao ang mga sukatan sa paggamit sa CPU (sukaranan sa kapanguhaan), apan mahimo nimong i-integrate ang naandan ug gihatag nga mga sukatan sa gawas.
team Kubernetes aaS gikan sa Mail.ru gihubad ang usa ka artikulo kung giunsa paggamit ang mga eksternal nga sukatan aron awtomatiko nga sukdon ang aplikasyon sa Kubernetes. Aron ipakita kung giunsa paglihok ang tanan, gigamit sa tagsulat ang mga sukatan sa paghangyo sa pag-access sa HTTP, nga gikolekta gamit ang Prometheus.
Imbis nga pinahigda nga autoscaling sa mga pod, gigamit ang Kubernetes Event Driven Autoscaling (KEDA), usa ka open source Kubernetes operator. Nahiusa kini nga lumad sa Horizontal Pod Autoscaler aron mahatagan ang seamless nga autoscaling (lakip ang sa / gikan sa zero) alang sa mga buluhaton nga gipadagan sa panghitabo. Kodigo anaa sa GitHub.
Mubo nga overview sa sistema
Gipakita sa diagram ang usa ka mubo nga paghulagway kung giunsa ang tanan molihok:
Ang aplikasyon naghatag ug HTTP hit count metrics sa Prometheus format.
Ang Prometheus gi-configure aron makolekta kini nga mga sukatan.
Ang Prometheus scaler sa KEDA gi-configure aron awtomatiko nga sukdon ang aplikasyon base sa gidaghanon sa mga hit sa HTTP.
Karon sultihan ko ikaw sa detalye bahin sa matag elemento.
KEDA ug Prometheus
Ang Prometheus usa ka open source system monitoring ug alerting toolkit, bahin Cloud Native Computing Foundation. Gikolekta ang mga sukatan gikan sa lainlaing mga gigikanan ug gitipigan kini ingon data sa serye sa oras. Aron mahanduraw ang datos nga imong magamit grafana o uban pang mga himan sa pagtan-aw nga magamit sa Kubernetes API.
Ang KEDA nagsuporta sa konsepto sa usa ka scaler - kini naglihok isip tulay tali sa KEDA ug sa eksternal nga sistema. Ang pagpatuman sa scaler espesipiko sa matag target nga sistema ug gikuha ang datos gikan niini. Gigamit dayon kini sa KEDA aron makontrol ang awtomatikong pag-scale.
Gisuportahan sa mga scaler ang daghang mga gigikanan sa datos, pananglitan, Kafka, Redis, Prometheus. Sa ato pa, ang KEDA mahimong magamit sa awtomatikong pag-scale sa mga pag-deploy sa Kubernetes gamit ang Prometheus metrics isip criteria.
Pagsulay nga aplikasyon
Ang aplikasyon sa pagsulay sa Golang naghatag og access pinaagi sa HTTP ug naghimo sa duha ka importante nga mga gimbuhaton:
Gigamit ang librarya sa kliyente nga Prometheus Go aron magamit ang aplikasyon ug mahatagan ang sukatan sa http_requests, nga adunay sulud nga hit count. Ang endpoint diin ang Prometheus metrics anaa nahimutang sa URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Agig tubag sa usa ka hangyo GET ang aplikasyon nagdugang sa kantidad sa yawe (access_count) sa Redis. Kini usa ka sayon nga paagi sa pagbuhat sa trabaho isip kabahin sa usa ka HTTP handler ug susihon usab ang Prometheus metrics. Ang metric value kinahanglan nga pareho sa value access_count sa Redis.
Ang aplikasyon gi-deploy sa Kubernetes pinaagi sa Deployment. Usa ka serbisyo ang gihimo usab ClusterIP, kini nagtugot sa Prometheus server nga makakuha og mga sukatan sa aplikasyon.
Ang scaler naglihok isip tulay tali sa KEDA ug sa eksternal nga sistema diin kinahanglan makuha ang mga sukatan. ScaledObject usa ka naandan nga kapanguhaan nga kinahanglan i-deploy aron ma-synchronize ang pag-deploy sa gigikanan sa panghitabo, sa kini nga kaso nga Prometheus.
ScaledObject adunay deployment scaling nga impormasyon, event source metadata (sama sa mga sekreto sa koneksyon, queue name), polling interval, recovery period, ug uban pang data. Kini moresulta sa katugbang nga autoscaling resource (HPA definition) aron ma-scale ang deployment.
Sa diha nga ang usa ka butang ScaledObject gitangtang, ang katugbang nga kahulugan sa HPA gitangtang.
Ania ang kahulugan ScaledObject alang sa atong panig-ingnan, kini naggamit sa usa ka scaler Prometheus:
Gitudlo niya ang Deployment Sa ngalan go-prom-app.
Uri sa trigger - Prometheus. Ang address sa server sa Prometheus gihisgutan uban sa metric nga ngalan, threshold ug Pangutana sa PromQL, nga gamiton. Pangutana sa PromQL - sum(rate(http_requests[2m])).
Sumala sa pollingInterval,Ang KEDA nangayo ug target gikan sa Prometheus matag kinse ka segundos. Labing menos usa sa ubos (minReplicaCount), ug ang maximum nga gidaghanon sa mga pod dili molapas maxReplicaCount (sa niini nga pananglitan - napulo).
Mahimong i-install minReplicaCount katumbas sa sero. Sa kini nga kaso, gi-aktibo sa KEDA ang zero-to-one nga pag-deploy ug dayon gibutyag ang HPA alang sa dugang nga awtomatikong pag-scale. Posible usab ang reverse order, nga mao, ang pag-scale gikan sa usa hangtod sa zero. Sa pananglitan, wala kami nagpili sa zero tungod kay kini usa ka serbisyo sa HTTP ug dili usa ka on-demand nga sistema.
Ang salamangka sa sulod sa autoscaling
Ang threshold gigamit isip usa ka trigger sa pag-scale sa deployment. Sa among pananglitan, ang pangutana sa PromQL sum(rate (http_requests [2m])) ibalik ang gitibuok nga rate sa hangyo sa HTTP (mga hangyo matag segundo), gisukod sa miaging duha ka minuto.
Tungod kay ang threshold nga kantidad tulo, kini nagpasabut nga adunay usa nga ubos samtang ang kantidad sum(rate (http_requests [2m])) ubos sa tulo. Kung ang kantidad motaas, usa ka dugang nga sub ang idugang matag higayon sum(rate (http_requests [2m])) nagdugang ug tulo. Pananglitan, kung ang kantidad gikan sa 12 hangtod 14, nan ang gidaghanon sa mga pod upat.
Karon atong sulayan ang pagpahimutang niini!
presetting
Ang imong gikinahanglan mao ang Kubernetes cluster ug usa ka configured utility kubectl. Kini nga pananglitan naggamit og cluster minikube, apan mahimo nimong kuhaon ang bisan unsang lain. Aron ma-install ang usa ka cluster adunay giya.
helm init nag-initialize sa lokal nga command line interface ug nag-instalar usab Tiller ngadto sa Kubernetes cluster.
kubectl get pods -n kube-system | grep tiller
Paghulat sa Tiller pod nga mosulod sa Running state.
Mubo nga sulat sa maghuhubad: Ang tagsulat naggamit sa Helm@2, nga nagkinahanglan sa Tiller server component nga i-install. Karon ang Helm@3 adunay kalabotan, wala kini magkinahanglan usa ka bahin sa server.
Human ma-install ang Helm, igo na ang usa ka sugo aron masugdan ang 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
Susiha nga ang tanan nagsugod na:
kubectl get pods -l=app=prometheus-server
Paghulat alang sa Prometheus nga moadto sa estado Running.
Paggamit kubectl port-forward aron ma-access ang Prometheus user interface (o API server) sa http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Ang resulta ingon niini:
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"
Susiha ubos sa mga aplikasyon. Usa ka pananglitan kinahanglan nga nagdagan tungod kay minReplicaCount katumbas sa 1:
kubectl get pods -l=app=go-prom-app
Tinoa nga ang kapanguhaan sa HPA malampuson nga nahimo:
kubectl get hpa
Kinahanglan nimong makita ang usa ka butang sama sa:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Pagsusi sa kahimsog: pag-access sa aplikasyon
Aron ma-access ang REST endpoint sa among aplikasyon, pagdagan:
Mahimo nimong ma-access ang imong Go app gamit ang adres http://localhost:8080. Aron mahimo kini, pagdagan ang mando:
curl http://localhost:8080/test
Ang resulta ingon niini:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Niini nga punto susihon usab ang Redis. Makita nimo kana ang yawe access_count misaka sa 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Siguroha nga ang metric value mao http_requests parehas:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Pagbuhat sa load
Gamiton namon Hey - utility alang sa pagmugna og load:
Sa kini nga kaso, ang tinuud nga sangputanan 1,686057971014493 ug gipakita sa uma value. Dili kini igo alang sa pag-scale, tungod kay ang threshold nga among gitakda mao ang 3.
Dugang load!
Sa bag-ong terminal, bantayan ang gidaghanon sa mga pod sa aplikasyon:
kubectl get pods -l=app=go-prom-app -w
Atong dugangan ang load gamit ang command:
./hey -n 2000 http://localhost:8080/test
Pagkataudtaod, imong makita ang HPA nga nag-scale sa pag-deploy ug naglansad og bag-ong mga pod. Susiha ang imong HPA aron masiguro:
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
Kung ang load dili managsama, ang deployment maminusan sa punto diin usa ra pod ang nagdagan. Kung gusto nimong susihon ang aktuwal nga sukatan (gibalik sa pangutana sa PromQL), unya gamita ang mando:
//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
konklusyon
Gitugotan ka sa KEDA nga awtomatiko nga i-scale ang imong mga pag-deploy sa Kubernetes (sa/gikan sa zero) base sa datos gikan sa mga eksternal nga sukatan. Pananglitan, base sa Prometheus metrics, queue length sa Redis, consumer latency sa Kafka topic.
Ang KEDA naghiusa sa usa ka eksternal nga tinubdan ug naghatag usab sa mga sukatan niini pinaagi sa Metrics Server ngadto sa Horizontal Pod Autoscaler.