Autoscaling Kubernetes fampiharana mampiasa Prometheus sy KEDA

Autoscaling Kubernetes fampiharana mampiasa Prometheus sy KEDABalloon Man nataon'i Cimuanos

Fitakiana lehibe amin'ny fampiharana rahona ny scalability. Miaraka amin'ny Kubernetes, ny fampitomboana ny rindranasa iray dia tsotra toy ny fampitomboana ny isan'ny kopia ho an'ny fametrahana sahaza na ReplicaSet — fa dingana an-tanana izany.

Ny Kubernetes dia mamela ny rindranasa ho tonga ho azy (izany hoe Pods amin'ny fametrahana na ReplicaSet) amin'ny fomba fanambarana amin'ny fampiasana ny fanondroana Horizontal Pod Autoscaler. Ny mari-pandrefesana mahazatra ho an'ny fanamafisam-peo mandeha ho azy dia ny metrika fampiasana CPU (metrika loharano), saingy azonao atao ny mampiditra metrika mahazatra sy omena avy any ivelany.

ekipa Kubernetes aaS avy amin'ny Mail.ru nandika lahatsoratra iray momba ny fomba fampiasana metrika ivelany hanamafisana ho azy ny fampiharana Kubernetes. Mba hampisehoana ny fomba fiasan'ny zava-drehetra dia mampiasa metrika fangatahana fidirana HTTP ny mpanoratra, izay angonina amin'ny fampiasana Prometheus.

Raha tokony ho fanamafisam-peo marindrano ny pods, Kubernetes Event Driven Autoscaling (KEDA) no ampiasaina, mpandraharaha Kubernetes loharano misokatra. Izy io dia mitambatra amin'ny horizontal Pod Autoscaler ho an'ny autoscaling tsy misy fotony (ao anatin'izany ny / manomboka amin'ny aotra) ho an'ny enta-mavesatry ny hetsika. Code azo alaina amin'ny GitHub.

Fijery fohy momba ny rafitra

Autoscaling Kubernetes fampiharana mampiasa Prometheus sy KEDA

Ny diagram dia mampiseho famaritana fohy ny fomba fiasan'ny zava-drehetra:

  1. Ny fampiharana dia manome metrika HTTP hit count amin'ny endrika Prometheus.
  2. Prometheus dia namboarina hanangona ireo metrika ireo.
  3. Ny scaler Prometheus ao amin'ny KEDA dia namboarina mba hanesorana ho azy ny fampiharana mifototra amin'ny isan'ny HTTP hits.

Ankehitriny dia hilaza aminareo amin'ny antsipiriany momba ny singa tsirairay aho.

KEDA sy Prometheus

Prometheus dia rafitra fanaraha-maso sy fitaovana fampitandremana misokatra, ampahany Cloud Computing Foundation. Manangona metrika avy amin'ny loharano isan-karazany ary mitahiry azy ireo ho angona andiam-potoana. Mba hijerena ny angona azonao ampiasaina grafana na fitaovana fijerena sary hafa izay miasa miaraka amin'ny Kubernetes API.

KEDA dia manohana ny foto-kevitry ny scaler - miasa toy ny tetezana eo amin'ny KEDA sy ny rafitra ivelany. Ny fampiharana scaler dia manokana ho an'ny rafitra kendrena tsirairay ary maka angona avy aminy. KEDA avy eo dia mampiasa azy ireo hifehy ny scaling mandeha ho azy.

Ny scalers dia manohana loharanom-baovao marobe, ohatra, Kafka, Redis, Prometheus. Izany hoe, ny KEDA dia azo ampiasaina hanesorana ho azy ny fanaparitahana Kubernetes amin'ny fampiasana metrika Prometheus ho fepetra.

Fampiharana fitsapana

Ny fampiharana fitsapana Golang dia manome fidirana amin'ny alàlan'ny HTTP ary manao asa roa lehibe:

  1. Mampiasa ny famakiam-bokin'ny mpanjifa Prometheus Go mba hitehirizana ny rindranasa sy hanomezana ny mari-pamantarana http_requests, izay misy isa isa. Ny teboka farany misy ny metrika Prometheus dia hita ao amin'ny URI /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Ho valin'ny fangatahana GET ny fampiharana dia mampitombo ny sandan'ny fanalahidy (access_count) any Redis. Ity dia fomba mora hanaovana ny asa amin'ny maha-tompon'andraikitra HTTP ary jereo ihany koa ny metrika Prometheus. Ny sanda metrika dia tsy maintsy mitovy amin'ny sandany access_count any 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)
       }
    

Ny fampiharana dia alefa amin'ny Kubernetes amin'ny alàlan'ny Deployment. Misy serivisy koa noforonina ClusterIP, mamela ny mpizara Prometheus hahazo ny mari-pamantarana fampiharana.

eto deployment manifestation ho an'ny fampiharana.

Prometheus Server

Ny fanehoan-kevitry ny Prometheus dia ahitana:

  • ConfigMap - hamindra ny config Prometheus;
  • Deployment - amin'ny fametrahana ny Prometheus ao anaty cluster Kubernetes;
  • ClusterIP - serivisy fidirana amin'ny UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — ho an'ny fizahana mandeha ho azy ny serivisy ao amin'ny Kubernetes (Auto-discovery).

eto fanehoana ny fampandehanana ny Prometheus.

KEDA Prometheus ScaledObject

Ny scaler dia miasa toy ny tetezana eo amin'ny KEDA sy ny rafitra ivelany izay ilana ny metrika. ScaledObject dia loharano mahazatra izay mila apetraka mba hampifanaraka ny fametrahana amin'ny loharano hetsika, amin'ity tranga ity Prometheus.

ScaledObject mirakitra fampahafantarana momba ny fanaparitahana, metadata loharanon-javatra (toy ny tsiambaratelon'ny fifandraisana, anaran'ny filaharana), elanelana fandatsaham-bato, vanim-potoana fanarenana, ary angona hafa. Izany dia miteraka loharanon'ny autoscaling mifanaraka amin'izany (famaritana HPA) hanamafisana ny fametrahana.

Rehefa zavatra iray ScaledObject voafafa, voafafa ny famaritana HPA mifanaraka amin'izany.

Ity ny famaritana ScaledObject ohatra, mampiasa 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]))

Mariho ireto hevitra manaraka ireto:

  1. Manondro izy Deployment Miaraka amin'ny anarany go-prom-app.
  2. Karazana trigger - Prometheus. Ny adiresin'ny mpizara Prometheus dia voalaza miaraka amin'ny anarana metrika, tokonam-baravarana ary PromQL fanontaniana, izay hampiasaina. Fanontaniana PromQL - sum(rate(http_requests[2m])).
  3. Araka ny pollingInterval, KEDA dia mangataka lasibatra avy amin'ny Prometheus isaky ny dimy ambin'ny folo segondra. Farafahakeliny iray ambany (minReplicaCount), ary tsy mihoatra ny isan'ny pods maxReplicaCount (amin'ity ohatra ity - folo).

Azo apetraka minReplicaCount mitovy amin'ny aotra. Amin'ity tranga ity, ny KEDA dia manetsika ny fametrahana zero-to-one ary avy eo dia mampiseho ny HPA ho an'ny scaling mandeha ho azy. Ny filaharana mivadika koa dia azo atao, izany hoe ny fisondrotana avy amin'ny iray ka hatramin'ny aotra. Amin'ny ohatra, tsy nifidy aotra izahay satria serivisy HTTP fa tsy rafitra misy fangatahana.

Ny majika ao anaty autoscaling

Ampiasaina ho toy ny trigger ny tokonam-baravarana hanamafisana ny fametrahana. Ao amin'ny ohatra ataontsika, ny fangatahana PromQL sum(rate (http_requests [2m])) mamerina ny tahan'ny fangatahana HTTP natambatra (fangatahana isan-tsegondra), refesina tao anatin'ny roa minitra farany.

Satria ny sandan'ny tokonam-baravarana dia telo, midika izany fa hisy iray eo ambanin'ny sandany sum(rate (http_requests [2m])) latsaky ny telo. Raha mitombo ny sandany dia misy zana-tohatra fanampiny ampiana isaky ny mandeha sum(rate (http_requests [2m])) mitombo telo. Ohatra, raha 12 ka hatramin'ny 14 ny sandany, dia efatra ny isan'ny pods.

Andeha isika hanandrana hametraka azy io!

presetting

Ny hany ilainao dia kluster Kubernetes sy fitaovana namboarina kubectl. Ity ohatra ity dia mampiasa cluster minikube, fa afaka maka iray hafa ianao. Ny fametrahana cluster dia misy mpitarika.

Hametraka ny kinova farany amin'ny 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/

hametraka kubectlmba hidirana amin'ny cluster Kubernetes.

Hametraka ny kinova farany amin'ny 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

Fametrahana KEDA

Azonao atao ny mametraka KEDA amin'ny fomba maro, voatanisa ao tahirin-kevitra. Mampiasa YAML monolithic aho:

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

Ny KEDA sy ny singa ao aminy dia apetraka ao amin'ny namespace keda. baiko hanamarina:

kubectl get pods -n keda

Andraso ny KEDA Operator hanomboka ary handeha Running State. Ary rehefa afaka izany, tohizo.

Fametrahana Redis mampiasa Helm

Raha tsy nametraka Helm ianao dia ampiasao ity mpitarika. Didy hametraka amin'ny Mac:

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

helm init dia manomboka ny interface baiko eo an-toerana ary mametraka ihany koa Tiller mankany amin'ny cluster Kubernetes.

kubectl get pods -n kube-system | grep tiller

Andraso ny pod Tiller hiditra amin'ny fanjakana Running.

Fanamarihan'ny mpandika teny: Ny mpanoratra dia mampiasa Helm@2, izay mitaky ny fametrahana ny singa mpizara Tiller. Ny Helm@3 izao dia manan-danja, tsy mitaky ampahany amin'ny server.

Rehefa avy nametraka Helm, baiko iray dia ampy hanombohana Redis:

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

Hamarino fa nanomboka nahomby ny Redis:

kubectl get pods/redis-server-master-0

Miandrasa an'i Redis ho any amin'ny fanjakana Running.

Fametrahana fampiharana

baiko fandefasana:

kubectl apply -f go-app.yaml

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

Hamarino fa nanomboka ny zava-drehetra:

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

Andraso i Redis hiditra amin'ny fanjakana Running.

Mametraka mpizara Prometheus

Mampiasa ny Prometheus manifest Fahitana serivisy Kubernetes ho an'ny Prometheus. Izy io dia mamela ny fitadiavana mavitrika ny pods fampiharana mifototra amin'ny mari-pamantarana serivisy.

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

Hametraka:

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

Hamarino fa nanomboka ny zava-drehetra:

kubectl get pods -l=app=prometheus-server

Miandrasa an'i Prometheus ho any amin'ny fanjakana Running.

fampiasana kubectl port-forward hidirana amin'ny mpampiasa interface Prometheus (na mpizara API) amin'ny http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

Mampiasa KEDA Autoscaling Configuration

Didy hamorona ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Jereo ny diarin'ny operator KEDA:

KEDA_POD_NAME=$(kubectl get pods -n keda 
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda

Toy izao ny vokatra:

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"

Jereo eo ambanin'ny applications. Ohatra iray dia tsy maintsy mihazakazaka satria minReplicaCount mitovy 1:

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

Hamarino fa nahomby ny famoronana HPA:

kubectl get hpa

Tokony hahita zavatra toy izao ianao:

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

Fanamarinana ara-pahasalamana: fidirana amin'ny fampiharana

Raha te hidirana amin'ny tondro-faran'ny REST an'ny fampiharana anay dia mandehana:

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

Afaka miditra amin'ny fampiharana Go ianao izao amin'ny alàlan'ny adiresy http://localhost:8080. Mba hanaovana izany, araho ny baiko:

curl http://localhost:8080/test

Toy izao ny vokatra:

Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Access count 1

Amin'ity tranga ity, jereo koa ny Redis. Ho hitanao fa ny fanalahidy access_count nitombo ho 1:

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"

Ataovy azo antoka fa ny sanda metrika dia http_requests mitovy:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1

Load Creation

Hampiasa izahay Hey - fitaovana enti-mamokatra entana:

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

Azonao atao koa ny misintona ny utility for Linux na Windows.

mihazakazaka izany:

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

Amin'ny alàlan'ny default, mandefa fangatahana 200 ny utility. Azonao atao ny manamarina izany amin'ny alàlan'ny metric Prometheus ary koa ny 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

Hamarino ny sandan'ny metrika tena izy (naverina tamin'ny fangatahana 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"]}]}}

Amin'ity tranga ity, ny tena vokatra dia 1,686057971014493 ary aseho amin'ny saha value. Tsy ampy ho an'ny scaling izany, satria ny tokonam-baravarana napetrakay dia 3.

More entana!

Ao amin'ny terminal vaovao, araho ny isan'ny pods fampiharana:

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

Andao hampitombo ny entana mampiasa ny baiko:

./hey -n 2000 http://localhost:8080/test

Rehefa afaka kelikely, dia ho hitanao ny HPA manamafy ny fametrahana sy mamoaka pods vaovao. Jereo ny HPA-nao mba hahazoana antoka fa:

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

Raha toa ka tsy mifanaraka ny enta-mavesatra, dia hihena ho amin'ny toerana iray izay pod iray ihany no mandeha. Raha te hanamarina ny metrika tena izy ianao (naverina tamin'ny fangatahana PromQL), dia ampiasao ny baiko:

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

fanadiovana

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

famaranana

KEDA dia ahafahanao manitsy ho azy ny fametrahanao Kubernetes (hatramin'ny aotra) mifototra amin'ny angona avy amin'ny metrika ivelany. Ohatra, mifototra amin'ny metrika Prometheus, ny halavan'ny filaharana ao amin'ny Redis, ny faharetan'ny mpanjifa amin'ny lohahevitra Kafka.

KEDA dia mitambatra amin'ny loharano ivelany ary manome ny metrikany amin'ny alàlan'ny Metrics Server amin'ny Horizontal Pod Autoscaler.

Mirary soa!

Inona koa no vakiana:

  1. Fomba fanao tsara indrindra sy fomba fanao tsara indrindra ho an'ny kaontenera mihazakazaka sy Kubernetes amin'ny tontolo famokarana.
  2. 90+ Fitaovana mahasoa ho an'ny Kubernetes: Fametrahana, Fitantanana, Fanaraha-maso, Fiarovana ary maro hafa.
  3. Ny fantsonay Manodidina ny Kubernetes ao amin'ny Telegram.

Source: www.habr.com

Add a comment