Autoscaling aplikasyon Kubernetes lè l sèvi avèk Prometheus ak KEDA

Autoscaling aplikasyon Kubernetes lè l sèvi avèk Prometheus ak KEDABalon Man pa Cimuanos

É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

Autoscaling aplikasyon Kubernetes lè l sèvi avèk Prometheus ak KEDA

Dyagram nan montre yon deskripsyon tou kout sou fason tout bagay ap fonksyone:

  1. Aplikasyon an bay mèt HTTP konte frape nan fòma Prometheus.
  2. Prometheus configuré pou kolekte mezi sa yo.
  3. 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:

  1. 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",
       })
    
  2. 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.
    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)
       }
    

Aplikasyon an deplwaye nan Kubernetes atravè Deployment. Yo kreye yon sèvis tou ClusterIP, li pèmèt sèvè Prometheus la jwenn mezi aplikasyon an.

Isit la manifest deplwaman pou aplikasyon an.

Sèvè Prometheus

Manifest deplwaman Prometheus la konsiste de:

  • ConfigMap — pou transfere konfigirasyon Prometheus la;
  • Deployment — pou deplwaye Prometheus nan yon gwoup Kubernetes;
  • ClusterIP — sèvis pou aksè nan UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — pou oto-deteksyon nan sèvis nan Kubernetes (oto-dekouvèt).

Isit la manifest pou kouri Prometheus.

KEDA Prometheus ScaledObject

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:

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]))

Tanpri konsidere pwen sa yo:

  1. Li lonje dwèt sou Deployment Avèk non go-prom-app.
  2. 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])).
  3. 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.

Enstale dènye vèsyon an sou 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/

Mete kubectlpou jwenn aksè nan gwoup Kubernetes la.

Enstale dènye vèsyon an sou 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

Enstalasyon KEDA

Ou ka deplwaye KEDA nan plizyè fason, yo ki nan lis nan dokiman. Mwen itilize monolitik YAML:

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

KEDA ak konpozan li yo enstale nan espas non an keda. Kòmand pou tcheke:

kubectl get pods -n keda

Tann KEDA Operatè kòmanse epi ale nan Running State. Apre sa, kontinye.

Enstale Redis lè l sèvi avèk Helm

Si ou pa enstale Helm, sèvi ak sa a jesyon. Kòmand pou enstale sou Mac:

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

helm init inisyalize koòdone liy lòd lokal la epi tou li enstale Tiller nan gwoup Kubernetes la.

kubectl get pods -n kube-system | grep tiller

Tann gous Tiller la antre nan eta Kouri a.

Nòt tradiktè a: Otè a sèvi ak Helm@2, ki mande pou yo enstale eleman sèvè Tiller la. Koulye a, Helm@3 enpòtan, li pa mande pou yon pati sèvè.

Apre enstale Helm, yon sèl lòd se ase yo kòmanse Redis:

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

Verifye ke Redis te kòmanse avèk siksè:

kubectl get pods/redis-server-master-0

Tann Redis ale nan eta Running.

Deplwaman aplikasyon

Kòmandman deplwaman:

kubectl apply -f go-app.yaml

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

Tcheke ke tout bagay te kòmanse:

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

Tann Redis antre nan eta Running.

Deplwaye yon sèvè Prometheus

Prometheus manifest itilize Kubernetes Sèvis Dekouvèt pou Prometheus. Li pèmèt dekouvèt dinamik nan gous aplikasyon ki baze sou etikèt sèvis la.

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

Pou deplwaye:

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.

kubectl port-forward service/prometheus-service 9090

Deplwaye Konfigirasyon Autoscaling KEDA

Kòmand pou kreye ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Tcheke jounal operatè KEDA yo:

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"

Tcheke anba aplikasyon yo. Yon egzanp dwe kouri paske minReplicaCount egal 1:

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

Verifye ke resous HPA te kreye avèk siksè:

kubectl get hpa

Ou ta dwe wè yon bagay tankou:

NAME                   REFERENCE                TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (avg)   1         10        1          45s

Tèks sante: aksè aplikasyon an

Pou jwenn aksè nan pwen final REST aplikasyon nou an, kouri:

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

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:

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

Ou kapab tou telechaje sèvis piblik la pou Linux oswa Windows.

Kouri li:

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

Pa default, sèvis piblik la voye 200 demann. Ou ka verifye sa lè l sèvi avèk mezi Prometheus kòm byen ke 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

Validate valè metrik aktyèl la (rekèt PromQL la retounen):

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"]}]}}

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:

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

Netwayaj

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

Good Luck!

Ki lòt bagay pou li:

  1. Pi bon pratik ak pi bon pratik pou kouri kontenè ak Kubernetes nan anviwònman pwodiksyon.
  2. 90+ Zouti itil pou Kubernetes: Deplwaman, Jesyon, Siveyans, Sekirite ak plis ankò.
  3. Chanèl nou an alantou Kubernetes nan Telegram.

Sous: www.habr.com

Add nouvo kòmantè