Évolutivité se yon kondisyon kle pou aplikasyon nwaj yo. Avèk Kubernetes, echèl yon aplikasyon se senp tankou ogmante kantite kopi pou deplwaman apwopriye a oswa ReplicaSet - men li se yon pwosesis manyèl.
Kubernetes pèmèt aplikasyon yo otomatikman echèl (sa vle di gous nan yon deplwaman oswa ReplicaSet) nan yon fason deklaratif lè l sèvi avèk spesifikasyon Horizontal Pod Autoscaler. Kritè defo pou dekale otomatik se paramèt itilizasyon CPU (mestik resous), men ou ka entegre mezi koutim ak ekstèn bay.
Ekip Kubernetes aaS soti nan Mail.ru tradui yon atik sou fason pou itilize mezi ekstèn pou otomatikman echèl yon aplikasyon Kubernetes. Pou montre kouman tout bagay ap travay, otè a sèvi ak mezi HTTP demann aksè, ki kolekte lè l sèvi avèk Prometheus.
Olye de autoscaling orizontal nan gous, yo itilize Kubernetes Event Driven Autoscaling (KEDA), yon operatè sous louvri Kubernetes. Li entegre natif natal ak orizontal Pod Autoscaler pou bay otoscaling san pwoblèm (ki gen ladan pou / soti nan zewo) pou chaj travay ki baze sou evènman yo. Kòd ki disponib nan GitHub.
Brèf apèsi sou sistèm nan
Dyagram nan montre yon deskripsyon tou kout sou fason tout bagay ap fonksyone:
Aplikasyon an bay mèt HTTP konte frape nan fòma Prometheus.
Prometheus configuré pou kolekte mezi sa yo.
Scaler la Prometheus nan KEDA se configuré pou otomatikman echèl aplikasyon an ki baze sou kantite HTTP frape.
Koulye a, mwen pral di w an detay sou chak eleman.
KEDA ak Prometheus
Prometheus se yon sistèm sous louvri siveyans ak alèt zouti, pati Cloud natif natal Computing Fondasyon. Kolekte mezi ki soti nan divès sous epi estoke yo kòm done seri tan. Pou visualize done ou ka itilize grafana oswa lòt zouti vizyalizasyon ki travay ak API Kubernetes.
KEDA sipòte konsèp yon scaler - li aji kòm yon pon ant KEDA ak sistèm ekstèn lan. Aplikasyon scaler la espesifik pou chak sistèm sib epi li ekstrè done ki soti nan li. Lè sa a, KEDA sèvi ak yo pou kontwole dekale otomatik.
Scalers sipòte plizyè sous done, pou egzanp, Kafka, Redis, Prometheus. Sa vle di, KEDA ka itilize otomatikman echèl deplwaman Kubernetes lè l sèvi avèk mezi Prometheus kòm kritè.
Aplikasyon tès la
Aplikasyon tès Golang la bay aksè atravè HTTP epi li fè de fonksyon enpòtan:
Sèvi ak bibliyotèk kliyan Prometheus Go pou enstriman aplikasyon an epi bay metrik http_requests, ki gen yon kantite frape. Pwen final kote mezi Prometheus yo disponib sitiye nan URI a /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
An repons a yon demann GET aplikasyon an ogmante valè kle a (access_count) nan Redis. Sa a se yon fason fasil pou fè travay la kòm yon pati nan yon moun kap okipe HTTP epi tcheke tou mezi Prometheus. Valè metrik la dwe menm ak valè a access_count nan Redis.
Scaler la aji kòm yon pon ant KEDA ak sistèm ekstèn nan ki mezi yo bezwen jwenn. ScaledObject se yon resous koutim ki bezwen deplwaye pou senkronize deplwaman an ak sous evènman an, nan ka sa a Prometheus.
ScaledObject gen enfòmasyon sou deplwaman, metadata sous evènman (tankou sekrè koneksyon, non keu), entèval biwo vòt, peryòd rekiperasyon, ak lòt done. Li rezilta nan resous autoscaling korespondan (definisyon HPA) pou echèl deplwaman an.
Lè yon objè ScaledObject efase, definisyon HPA korespondan an efase.
Men definisyon an ScaledObject pou egzanp nou an, li itilize yon scaler Prometheus:
Li lonje dwèt sou Deployment Avèk non go-prom-app.
Kalite deklanche - Prometheus. Adrès sèvè Prometheus mansyone ansanm ak non metrik, papòt ak Rekèt PromQL, ki pral itilize. Rekèt PromQL - sum(rate(http_requests[2m])).
Dapre pollingInterval,KEDA mande yon sib nan men Prometheus chak kenz segonn. Omwen youn anba (minReplicaCount), ak kantite maksimòm gous pa depase maxReplicaCount (nan egzanp sa a - dis).
Èske yo ka enstale minReplicaCount egal a zewo. Nan ka sa a, KEDA aktive deplwaman zewo-a-one epi answit ekspoze HPA pou plis dekale otomatik. Lòd ranvèse a posib tou, se sa ki dekale soti nan youn a zewo. Nan egzanp lan, nou pa t chwazi zewo paske sa a se yon sèvis HTTP epi li pa yon sistèm sou demann.
Majik la andedan autoscaling
Se papòt la itilize kòm yon deklanche pou echèl deplwaman an. Nan egzanp nou an, rechèch la PromQL sum(rate (http_requests [2m])) retounen pousantaj demann HTTP total (demann pou chak segonn), mezire sou de dènye minit yo.
Depi valè papòt la se twa, sa vle di pral gen youn anba pandan valè a sum(rate (http_requests [2m])) mwens pase twa. Si valè a ogmante, yo ajoute yon sub anplis chak fwa sum(rate (http_requests [2m])) ogmante pa twa. Pou egzanp, si valè a soti nan 12 a 14, Lè sa a, kantite gous se kat.
Koulye a, ann eseye mete kanpe li!
Pre-anviwònman
Tout sa ou bezwen se yon gwoup Kubernetes ak yon sèvis piblik configuré kubectl. Egzanp sa a sèvi ak yon grap minikube, men ou ka pran nenpòt lòt. Pou enstale yon grap gen lidèchip.
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
Tcheke ke tout bagay te kòmanse:
kubectl get pods -l=app=prometheus-server
Tann Prometheus ale nan eta Running.
Itilize kubectl port-forward pou jwenn aksè nan koòdone itilizatè Prometheus (oswa sèvè API) nan http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Rezilta a sanble yon bagay tankou sa a:
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"
Ou kapab kounye a jwenn aksè nan aplikasyon Go ou a lè l sèvi avèk adrès la http://localhost:8080. Pou fè sa, kouri lòd la:
curl http://localhost:8080/test
Rezilta a sanble yon bagay tankou sa a:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Nan pwen sa a tou tcheke Redis. Ou pral wè ke kle a access_count ogmante a 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Asire w ke valè metrik la se http_requests menm bagay la tou:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Chaj Kreyasyon
Nou pral itilize hey - sèvis piblik pou jenere chaj:
Nan ka sa a rezilta aktyèl la se 1,686057971014493 epi li parèt nan jaden an value. Sa a pa ase pou eskalade, paske papòt nou fikse a se 3.
Plis chaj!
Nan nouvo tèminal la, kontwole kantite gous aplikasyon yo:
kubectl get pods -l=app=go-prom-app -w
Ann ogmante chaj la lè l sèvi avèk kòmandman an:
./hey -n 2000 http://localhost:8080/test
Apre yon ti tan, ou pral wè HPA monte deplwaman an ak lanse nouvo gous. Tcheke HPA ou pou asire w:
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 chaj la enkonsistan, deplwaman an ap redwi nan pwen kote sèlman yon sèl gous ap kouri. Si ou vle tcheke metrik aktyèl la (rekèt PromQL la retounen), Lè sa a, sèvi ak lòd la:
//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
Konklizyon
KEDA pèmèt ou otomatikman echèl deplwaman Kubernetes ou yo (nan / soti nan zewo) ki baze sou done ki soti nan mezi ekstèn. Pou egzanp, ki baze sou mezi Prometheus, longè keu nan Redis, latansi konsomatè nan sijè Kafka.
KEDA entegre ak yon sous ekstèn epi tou li bay mezi li yo atravè Metrics Server rive orizontal Pod Autoscaler.