Autoscaling Kubernetes nga mga aplikasyon gamit ang Prometheus ug KEDA

Autoscaling Kubernetes nga mga aplikasyon gamit ang Prometheus ug KEDABalloon Man ni Cimuanos

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

Autoscaling Kubernetes nga mga aplikasyon gamit ang Prometheus ug KEDA

Gipakita sa diagram ang usa ka mubo nga paghulagway kung giunsa ang tanan molihok:

  1. Ang aplikasyon naghatag ug HTTP hit count metrics sa Prometheus format.
  2. Ang Prometheus gi-configure aron makolekta kini nga mga sukatan.
  3. 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:

  1. 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",
       })
    
  2. 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.
    func main() {
           http.Handle("/metrics", promhttp.Handler())
           http.HandleFunc("/test", func(w http.ResponseWriter, r 
    *http.Request) {
               defer httpRequestsCounter.Inc()
               count, err := client.Incr(redisCounterName).Result()
               if err != nil {
                   fmt.Println("Unable to increment redis counter", err)
                   os.Exit(1)
               }
               resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

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.

dinhi deployment manifest para sa aplikasyon.

Prometheus Server

Ang Prometheus deployment manifest naglangkob sa:

  • ConfigMap — sa pagbalhin sa Prometheus config;
  • Deployment - alang sa pagdeploy sa Prometheus sa usa ka Kubernetes cluster;
  • ClusterIP - serbisyo alang sa pag-access sa UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — para sa auto-detection sa mga serbisyo sa Kubernetes (Auto-discovery).

dinhi manifest para sa pagpadagan sa Prometheus.

KEDA Prometheus ScaledObject

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:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
 name: prometheus-scaledobject
 namespace: default
 labels:
   deploymentName: go-prom-app
spec:
 scaleTargetRef:
   deploymentName: go-prom-app
 pollingInterval: 15
 cooldownPeriod:  30
 minReplicaCount: 1
 maxReplicaCount: 10
 triggers:
 - type: prometheus
   metadata:
     serverAddress: 
http://prometheus-service.default.svc.cluster.local:9090
     metricName: access_frequency
     threshold: '3'
     query: sum(rate(http_requests[2m]))

Tagda ang mosunod nga mga punto:

  1. Gitudlo niya ang Deployment Sa ngalan go-prom-app.
  2. 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])).
  3. 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.

I-install ang pinakabag-o nga bersyon sa Mac:

curl -Lo minikube 
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/

Pagpahimutang kubectlaron ma-access ang Kubernetes cluster.

I-install ang pinakabag-o nga bersyon sa Mac:

curl -LO 
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

Pag-instalar sa KEDA

Mahimo nimong i-deploy ang KEDA sa daghang mga paagi, gilista sila sa dokumentasyon. Gigamit nako ang monolithic YAML:

kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml

Ang KEDA ug ang mga sangkap niini gi-install sa namespace keda. Sugo sa pagsusi:

kubectl get pods -n keda

Paghulat alang sa KEDA Operator nga magsugod ug moadto sa Running State. Ug pagkahuman niana, magpadayon.

Pag-instalar sa Redis gamit ang Helm

Kung wala kay Helm nga na-install, gamita kini pagpangulo. Sugo nga i-install sa Mac:

brew install kubernetes-helm
helm init --history-max 200

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:

helm install --name redis-server --set cluster.enabled=false --set 
usePassword=false stable/redis

Tinoa nga malampuson nga nagsugod ang Redis:

kubectl get pods/redis-server-master-0

Paghulat alang sa Redis nga moadto sa estado Running.

Pag-deploy sa Aplikasyon

Deployment nga sugo:

kubectl apply -f go-app.yaml

//output
deployment.apps/go-prom-app created
service/go-prom-app-service created

Susiha nga ang tanan nagsugod na:

kubectl get pods -l=app=go-prom-app

Paghulat alang sa Redis nga mosulod sa estado Running.

Pagbutang ug Prometheus Server

Gigamit sa Prometheus manifest Pagdiskobre sa Serbisyo sa Kubernetes para sa Prometheus. Gitugotan niini ang dinamikong pagdiskobre sa mga pod sa aplikasyon base sa label sa serbisyo.

kubernetes_sd_configs:
   - role: service
   relabel_configs:
   - source_labels: [__meta_kubernetes_service_label_run]
     regex: go-prom-app-service
     action: keep

Aron i-deploy:

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.

kubectl port-forward service/prometheus-service 9090

Pag-deploy sa KEDA Autoscaling Configuration

Sugo sa paghimo ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Susiha ang KEDA operator logs:

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:

kubectl port-forward service/go-prom-app-service 8080

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:

curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64 
&& chmod a+x hey

Mahimo usab nimo i-download ang utility para sa Linux o Windows.

Padagana kini:

./hey http://localhost:8080/test

Sa kasagaran, ang utility nagpadala ug 200 ka hangyo. Mahimo nimong pamatud-an kini gamit ang Prometheus metrics ingon man ang Redis.

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201

I-validate ang bili sa aktuwal nga sukatan (gibalik sa pangutana sa PromQL):

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}

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:

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'

Очистка

//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.

Good luck!

Unsa pa ang basahon:

  1. Labing Maayo nga Mga Praktis ug Labing Maayo nga Mga Praktis para sa Pagdagan sa mga Container ug Kubernetes sa Production Environments.
  2. 90+ Mapuslanon nga mga Himan para sa Kubernetes: Deployment, Management, Monitoring, Security ug uban pa.
  3. Ang among channel Around Kubernetes sa Telegram.

Source: www.habr.com

Idugang sa usa ka comment