MÄrogojamÄ«ba ir galvenÄ prasÄ«ba mÄkoÅa lietojumprogrammÄm. Izmantojot Kubernetes, lietojumprogrammas mÄrogoÅ”ana ir tikpat vienkÄrÅ”a kÄ reprodukciju skaita palielinÄÅ”ana atbilstoÅ”ai izvietoÅ”anai vai ReplicaSet ā bet tas ir manuÄls process.
Kubernetes ļauj automÄtiski mÄrogot lietojumprogrammas (t.i., Pods izvietoÅ”anas vai ReplicaSet) deklaratÄ«vÄ veidÄ, izmantojot Horizontal Pod Autoscaler specifikÄciju. AutomÄtiskÄs mÄrogoÅ”anas noklusÄjuma kritÄrijs ir CPU lietojuma metrika (resursu metrika), taÄu varat integrÄt pielÄgotu un ÄrÄji nodroÅ”inÄtu metriku.
Komanda Kubernetes aaS no Mail.ru iztulkoja rakstu par to, kÄ izmantot ÄrÄjos rÄdÄ«tÄjus, lai automÄtiski mÄrogotu lietojumprogrammu Kubernetes. Lai parÄdÄ«tu, kÄ viss darbojas, autors izmanto HTTP piekļuves pieprasÄ«jumu metriku, kas tiek apkopota, izmantojot Prometheus.
Pods horizontÄlÄs automÄtiskÄs mÄrogoÅ”anas vietÄ tiek izmantota Kubernetes Event Driven Autoscaling (KEDA) ā atvÄrtÄ koda Kubernetes operators. Tas sÄkotnÄji tiek integrÄts ar Horizontal Pod Autoscaler, lai nodroÅ”inÄtu netraucÄtu automÄtisko mÄrogoÅ”anu (tostarp uz/no nulles) notikuma izraisÄ«tÄm darba slodzÄm. Kods pieejams plkst GitHub.
ÄŖss pÄrskats par sistÄmu
DiagrammÄ parÄdÄ«ts Ä«ss apraksts par to, kÄ viss darbojas:
Lietojumprogramma nodroÅ”ina HTTP trÄpÄ«jumu skaita metriku Prometheus formÄtÄ.
Prometheus ir konfigurÄts, lai apkopotu Å”os rÄdÄ«tÄjus.
KEDA Prometheus mÄrogotÄjs ir konfigurÄts, lai automÄtiski mÄrogotu lietojumprogrammu, pamatojoties uz HTTP trÄpÄ«jumu skaitu.
Tagad es jums pastÄstÄ«Å”u sÄ«kÄk par katru elementu.
KEDA un Prometejs
Prometheus ir atvÄrtÄ koda sistÄmas uzraudzÄ«bas un brÄ«dinÄÅ”anas rÄ«ku komplekta daļa MÄkoÅu vietÄjÄs skaitļoÅ”anas fonds. Apkopo metriku no dažÄdiem avotiem un saglabÄ tos kÄ laikrindu datus. Lai vizualizÄtu datus, varat izmantot grafana vai citi vizualizÄcijas rÄ«ki, kas darbojas ar Kubernetes API.
KEDA atbalsta skalera koncepciju ā tas darbojas kÄ tilts starp KEDA un ÄrÄjo sistÄmu. MÄrogoÅ”anas ievieÅ”ana ir specifiska katrai mÄrÄ·a sistÄmai un iegÅ«st datus no tÄs. PÄc tam KEDA tos izmanto, lai kontrolÄtu automÄtisko mÄrogoÅ”anu.
MÄrogotÄji atbalsta vairÄkus datu avotus, piemÄram, Kafka, Redis, Prometheus. Tas nozÄ«mÄ, ka KEDA var izmantot, lai automÄtiski mÄrogotu Kubernetes izvietojumus, kÄ kritÄrijus izmantojot Prometheus metriku.
Testa lietojumprogramma
Golang testa lietojumprogramma nodroŔina piekļuvi, izmantojot HTTP, un veic divas svarīgas funkcijas:
Izmanto Prometheus Go klienta bibliotÄku, lai instrumentÄtu lietojumprogrammu un nodroÅ”inÄtu http_requests metriku, kurÄ ir ietverts trÄpÄ«jumu skaits. Galapunkts, kurÄ ir pieejama Prometheus metrika, atrodas URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Atbildot uz pieprasÄ«jumu GET lietojumprogramma palielina atslÄgas vÄrtÄ«bu (access_count) Redis. Tas ir vienkÄrÅ”s veids, kÄ veikt darbu kÄ HTTP apdarinÄtÄja daļu, kÄ arÄ« pÄrbaudÄ«t Prometheus metriku. Metrikas vÄrtÄ«bai ir jÄbÅ«t tÄdai paÅ”ai kÄ vÄrtÄ«bai access_count iekÅ” Redis.
Lietojumprogramma tiek izvietota Kubernetes, izmantojot Deployment. Tiek izveidots arÄ« pakalpojums ClusterIP, tas ļauj Prometheus serverim iegÅ«t lietojumprogrammu rÄdÄ«tÄjus.
MÄrogs darbojas kÄ tilts starp KEDA un ÄrÄjo sistÄmu, no kuras ir jÄiegÅ«st metrika. ScaledObject ir pielÄgots resurss, kas ir jÄizvieto, lai sinhronizÄtu izvietoÅ”anu ar notikuma avotu, Å”ajÄ gadÄ«jumÄ ar Prometheus.
ScaledObject satur izvietoÅ”anas mÄrogoÅ”anas informÄciju, notikumu avota metadatus (piemÄram, savienojuma noslÄpumus, rindas nosaukumu), aptaujas intervÄlu, atkopÅ”anas periodu un citus datus. TÄ rezultÄtÄ tiek iegÅ«ts atbilstoÅ”s automÄtiskÄs mÄrogoÅ”anas resurss (HPA definÄ«cija), lai mÄrogotu izvietoÅ”anu.
Kad objekts ScaledObject tiek dzÄsta, atbilstoÅ”Ä HPA definÄ«cija tiek dzÄsta.
LÅ«k, definÄ«cija ScaledObject mÅ«su piemÄram, tas izmanto mÄrogotÄju Prometheus:
ViÅÅ” norÄda uz Deployment Ar nosaukumu go-prom-app.
Trigera veids ā Prometheus. Prometheus servera adrese ir minÄta kopÄ ar metrikas nosaukumu, slieksni un PromQL vaicÄjums, kas tiks izmantots. PromQL vaicÄjums ā sum(rate(http_requests[2m])).
SaskaÅÄ ar pollingIntervalKEDA pieprasa mÄrÄ·i no Prometheus ik pÄc piecpadsmit sekundÄm. Vismaz viens zem (minReplicaCount), un maksimÄlais pÄksts skaits nepÄrsniedz maxReplicaCount (Å”ajÄ piemÄrÄ - desmit).
Var uzstÄdÄ«t minReplicaCount vienÄds ar nulli. Å ÄdÄ gadÄ«jumÄ KEDA aktivizÄ nulles pret vienu izvietoÅ”anu un pÄc tam pakļauj HPA turpmÄkai automÄtiskai mÄrogoÅ”ana. Ir iespÄjama arÄ« apgrieztÄ secÄ«ba, tas ir, mÄrogoÅ”ana no viena lÄ«dz nullei. PiemÄrÄ mÄs neatlasÄ«jÄm nulli, jo Å”is ir HTTP pakalpojums, nevis sistÄma pÄc pieprasÄ«juma.
MaÄ£ija iekÅ”Ä automÄtiskÄ mÄrogoÅ”ana
Slieksnis tiek izmantots kÄ aktivizÄtÄjs, lai mÄrogotu izvietoÅ”anu. MÅ«su piemÄrÄ PromQL vaicÄjums sum(rate (http_requests [2m])) atgriež apkopoto HTTP pieprasÄ«jumu Ätrumu (pieprasÄ«jumi sekundÄ), kas mÄrÄ«ts pÄdÄjo divu minÅ«Å”u laikÄ.
TÄ kÄ sliekÅ”Åa vÄrtÄ«ba ir trÄ«s, tas nozÄ«mÄ, ka vÄrtÄ«ba bÅ«s mazÄka par vienu sum(rate (http_requests [2m])) mazÄk par trim. Ja vÄrtÄ«ba palielinÄs, katru reizi tiek pievienota papildu apakÅ”daļa sum(rate (http_requests [2m])) palielinÄs par trim. PiemÄram, ja vÄrtÄ«ba ir no 12 lÄ«dz 14, tad pÄkstu skaits ir Äetri.
Tagad mÄÄ£inÄsim to iestatÄ«t!
priekŔiestatījums
Viss, kas jums nepiecieÅ”ams, ir Kubernetes klasteris un konfigurÄta utilÄ«ta kubectl. Å ajÄ piemÄrÄ tiek izmantota kopa minikube, bet jÅ«s varat Åemt jebkuru citu. Lai instalÄtu klasteru, ir vadÄ«ba.
helm init inicializÄ vietÄjo komandrindas saskarni un arÄ« instalÄ Tiller uz Kubernetes klasteru.
kubectl get pods -n kube-system | grep tiller
Pagaidiet, lÄ«dz Tiller pod pÄriet režīmÄ Darbojas.
TulkotÄja piezÄ«me: Autors izmanto Helm@2, kam nepiecieÅ”ams instalÄt Tiller servera komponentu. Tagad Helm@3 ir aktuÄls, tam nav nepiecieÅ”ama servera daļa.
PÄc Helm instalÄÅ”anas pietiek ar vienu komandu, lai palaistu 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
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
RezultÄts izskatÄs apmÄram Å”Ädi:
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"
PÄrbaudiet zem pieteikumiem. Vienai instancei ir jÄdarbojas, jo minReplicaCount vienÄds ar 1:
kubectl get pods -l=app=go-prom-app
PÄrbaudiet, vai HPA resurss ir izveidots veiksmÄ«gi:
kubectl get hpa
Jums vajadzÄtu redzÄt kaut ko lÄ«dzÄ«gu:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Tagad varat piekļūt savai lietotnei Go, izmantojot adresi http://localhost:8080. Lai to izdarītu, palaidiet komandu:
curl http://localhost:8080/test
RezultÄts izskatÄs apmÄram Å”Ädi:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Å ajÄ brÄ«dÄ« pÄrbaudiet arÄ« Redis. JÅ«s redzÄsiet, ka atslÄga access_count palielinÄts lÄ«dz 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
PÄrliecinieties, vai metrikas vÄrtÄ«ba ir http_requests tas pats:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Å ajÄ gadÄ«jumÄ faktiskais rezultÄts ir 1,686057971014493 un tiek parÄdÄ«ts laukÄ value. Ar to nepietiek, lai mÄrogotu, jo mÅ«su iestatÄ«tais slieksnis ir 3.
PÄc kÄda laika jÅ«s redzÄsiet, ka HPA mÄrogos izvietoÅ”anu un palaiž jaunas pÄkstis. PÄrbaudiet savu HPA, lai pÄrliecinÄtos, ka:
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
Ja slodze ir nekonsekventa, izvietoÅ”ana tiks samazinÄta lÄ«dz vietai, kurÄ darbojas tikai viens pods. Ja vÄlaties pÄrbaudÄ«t faktisko metriku (ko atgriež PromQL vaicÄjums), izmantojiet komandu:
//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
SecinÄjums
KEDA ļauj automÄtiski mÄrogot jÅ«su Kubernetes izvietoÅ”anu (uz/no nulles), pamatojoties uz datiem no ÄrÄjÄm metrikÄm. PiemÄram, pamatojoties uz Prometheus metriku, rindas garumu Redis, patÄrÄtÄja latentumu Kafkas tÄmÄ.
KEDA integrÄjas ar ÄrÄju avotu, kÄ arÄ« nodroÅ”ina savus rÄdÄ«tÄjus, izmantojot Metrics Server, lai Horizontal Pod Autoscaler.