Autoscaling Kubernetes aikace-aikace ta amfani da Prometheus da KEDA

Autoscaling Kubernetes aikace-aikace ta amfani da Prometheus da KEDABalloon Man ta Cimuanos

Scalability shine mabuɗin mahimmanci don aikace-aikacen girgije. Tare da Kubernetes, ƙaddamar da aikace-aikacen yana da sauƙi kamar ƙara adadin kwafi don ƙaddamar da ya dace ko ReplicaSet - amma tsari ne na hannu.

Kubernetes yana ba da damar haɓaka aikace-aikacen ta atomatik (watau Pods a cikin turawa ko ReplicaSet) a cikin hanyar sanarwa ta amfani da ƙayyadaddun ƙayyadaddun Pod Autoscaler na Horizontal. Ma'auni na tsoho don sikelin atomatik shine ma'aunin amfani da CPU (ma'auni na albarkatu), amma kuna iya haɗa ma'auni na al'ada da na waje.

tawagar Kubernetes aaS daga Mail.ru Fassara labarin kan yadda ake amfani da awo na waje don auna aikace-aikacen Kubernetes ta atomatik. Don nuna yadda komai ke aiki, marubucin yana amfani da ma'aunin neman damar HTTP, waɗanda aka tattara ta amfani da Prometheus.

Maimakon a kwance autoscaling na pods, Kubernetes Event Driven Autoscaling (KEDA) ana amfani da shi, ma'aikacin Kubernetes mai buɗewa. Yana haɗawa ta asali tare da Horizontal Pod Autoscaler don samar da autoscaling mara nauyi (ciki har da zuwa/daga sifili) don abubuwan da ke haifar da aukuwa. Akwai code a GitHub.

Takaitaccen bayanin tsarin

Autoscaling Kubernetes aikace-aikace ta amfani da Prometheus da KEDA

Jadawalin yana nuna taƙaitaccen bayanin yadda komai ke aiki:

  1. Aikace-aikacen yana ba da ma'aunin ƙidayar hit HTTP a cikin tsarin Prometheus.
  2. An saita Prometheus don tattara waɗannan ma'auni.
  3. An saita ma'aunin Prometheus a cikin KEDA don yin girman aikace-aikacen ta atomatik bisa adadin hits HTTP.

Yanzu zan gaya muku dalla-dalla game da kowane kashi.

KEDA da Prometheus

Prometheus shine buɗaɗɗen tsarin sa ido da kayan aikin faɗakarwa, sashi Gidauniyar putididdigar ativeasar Cloud. Yana tattara awo daga tushe daban-daban kuma yana adana su azaman bayanan jerin lokaci. Don ganin bayanan za ku iya amfani da su Grafana ko wasu kayan aikin gani waɗanda ke aiki tare da Kubernetes API.

KEDA tana goyan bayan manufar ma'auni - yana aiki azaman gada tsakanin KEDA da tsarin waje. Aiwatar da ma'aunin ƙayyadaddun ƙayyadaddun tsarin kowane tsarin manufa kuma yana fitar da bayanai daga gare ta. Daga nan KEDA yana amfani da su don sarrafa sikelin atomatik.

Scalers suna tallafawa tushen bayanai da yawa, misali, Kafka, Redis, Prometheus. Wato, ana iya amfani da KEDA don daidaita ayyukan Kubernetes ta atomatik ta amfani da ma'aunin Prometheus azaman ma'auni.

Gwaji aikace-aikace

Aikace-aikacen gwajin Golang yana ba da dama ta hanyar HTTP kuma yana yin ayyuka masu mahimmanci guda biyu:

  1. Yana amfani da ɗakin karatu na abokin ciniki na Prometheus Go don kayan aikin aikace-aikacen kuma ya samar da ma'aunin http_requests, wanda ya ƙunshi ƙidayar bugawa. Ƙarshen inda ake samun ma'aunin Prometheus yana a URI /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Dangane da wata bukata GET aikace-aikacen yana ƙara darajar maɓalli (access_count) in Redis. Wannan hanya ce mai sauƙi don yin aikin a matsayin ɓangare na mai sarrafa HTTP da kuma duba ma'aunin Prometheus. Dole ne ma'auni ya zama daidai da ƙimar access_count in 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)
       }
    

Ana tura aikace-aikacen zuwa Kubernetes ta hanyar Deployment. Hakanan an ƙirƙiri sabis ClusterIP, yana ba da damar uwar garken Prometheus don samun ma'aunin aikace-aikacen.

a nan bayyani na turawa don aikace-aikacen.

Prometheus Server

Bayanin ƙaddamar da Prometheus ya ƙunshi:

  • ConfigMap - don canja wurin saitin Prometheus;
  • Deployment - don tura Prometheus a cikin gungu na Kubernetes;
  • ClusterIP - sabis don samun dama ga UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount - don gano ayyuka ta atomatik a cikin Kubernetes (Auto-discovery).

a nan bayyana don gudanar da Prometheus.

KEDA Prometheus ScaledObject

Ma'auni yana aiki azaman gada tsakanin KEDA da tsarin waje wanda ake buƙatar samun awo. ScaledObject wata hanya ce ta al'ada wacce ke buƙatar turawa don daidaita aiki tare da tushen taron, a cikin wannan yanayin Prometheus.

ScaledObject ya ƙunshi bayanan ƙaddamar da aiki, metadata tushen taron (kamar sirrin haɗi, sunan jerin gwano), tazarar zabe, lokacin dawowa, da sauran bayanai. Yana haifar da daidaitaccen albarkatun autoscaling (HPA ma'anar) don ƙaddamar da ƙaddamarwa.

Lokacin abu ScaledObject an share, an share ma'anar HPA daidai.

Ga ma'anar ScaledObject ga misalinmu, yana amfani da sikeli 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]))

Yi la'akari da abubuwa masu zuwa:

  1. Ya nuna Deployment Tare da suna go-prom-app.
  2. Nau'in tashin hankali - Prometheus. An ambaci adireshin uwar garken Prometheus tare da ma'auni suna, kofa da Tambayar PromQL, wanda za a yi amfani da shi. Tambayar PromQL - sum(rate(http_requests[2m])).
  3. A cewar pollingInterval,KEDA na buƙatar manufa daga Prometheus kowane daƙiƙa goma sha biyar. Akalla ɗaya ƙarƙashin (minReplicaCount), kuma matsakaicin adadin kwas ɗin bai wuce ba maxReplicaCount (a cikin wannan misali - goma).

Ana iya girka minReplicaCount daidai da sifili. A wannan yanayin, KEDA tana kunna jigilar sifili-zuwa ɗaya sannan ta fallasa HPA don ƙarin sikelin atomatik. Hakanan ana iya yin jujjuyawar odar, wato, yin ƙima daga ɗaya zuwa sifili. A cikin misali, ba mu zaɓi sifili ba saboda wannan sabis ɗin HTTP ne ba tsarin da ake buƙata ba.

Sihiri a cikin autoscaling

Ana amfani da madaidaicin azaman abin faɗakarwa don ƙaddamar da ƙaddamarwa. A cikin misalinmu, tambayar PromQL sum(rate (http_requests [2m])) yana dawo da adadin buƙatar HTTP da aka tara (buƙatun daƙiƙa guda), wanda aka auna a cikin mintuna biyu na ƙarshe.

Tun da ƙimar ƙima uku ne, yana nufin za a sami ɗaya ƙarƙashin yayin ƙimar sum(rate (http_requests [2m])) kasa da uku. Idan ƙimar ta ƙaru, ana ƙara ƙarin ƙara kowane lokaci sum(rate (http_requests [2m])) yana ƙaruwa da uku. Misali, idan darajar ta kasance daga 12 zuwa 14, to adadin kwasfa ya zama hudu.

Yanzu bari mu gwada saita shi!

Pre-saitin

Duk abin da kuke buƙata shine tarin Kubernetes da ingantaccen kayan aiki kubectl. Wannan misali yana amfani da gungu minikube, amma kuna iya ɗaukar kowane ɗayan. Don shigar da gungu akwai jagora.

Shigar da sabon sigar akan 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/

Saiti kubectldon samun damar gungu na Kubernetes.

Shigar da sabon sigar akan 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

Shigar KEDA

Kuna iya tura KEDA ta hanyoyi da yawa, an jera su a ciki takardun. Ina amfani da YAML monolithic:

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

An shigar da KEDA da abubuwan da ke cikin sa a cikin filin suna keda. Umurnin duba:

kubectl get pods -n keda

Jira KEDA Operator ya fara kuma je zuwa Running State. Kuma bayan haka, ci gaba.

Shigar da Redis ta amfani da Helm

Idan ba a shigar da Helm ba, yi amfani da wannan jagoranci. Umurnin shigar akan Mac:

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

helm init yana fara ƙirar layin umarni na gida kuma yana shigarwa Tiller zuwa gungu na Kubernetes.

kubectl get pods -n kube-system | grep tiller

Jira faifan Tiller don shigar da yanayin Gudu.

Bayanin mai fassaraMarubucin yana amfani da Helm@2, wanda ke buƙatar shigar da bangaren uwar garken Tiller. Yanzu Helm@3 ya dace, baya buƙatar ɓangaren uwar garken.

Bayan shigar da Helm, umarni ɗaya ya isa don fara Redis:

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

Tabbatar cewa Redis ya fara nasara:

kubectl get pods/redis-server-master-0

Jira Redis ya shiga cikin jihar Running.

Aiwatar da Aikace-aikacen

Umarnin aika aiki:

kubectl apply -f go-app.yaml

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

Duba cewa komai ya fara:

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

Jira Redis ya shiga jihar Running.

Ana tura Sabar Prometheus

Ana amfani da Prometheus bayyananne Gano Kubernetes Sabis na Prometheus. Yana ba da damar gano kwas ɗin aikace-aikace dangane da alamar sabis.

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

Don tura:

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

Duba cewa komai ya fara:

kubectl get pods -l=app=prometheus-server

Jira Prometheus ya shiga cikin jihar Running.

Amfani kubectl port-forward don samun dama ga mai amfani da Prometheus (ko uwar garken API) a http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

Ana Aiwatar da Kanfigareshan Taimako na KEDA

Umurnin ƙirƙirar ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Duba rajistan ayyukan KEDA:

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

Sakamakon yana kama da wani abu kamar haka:

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"

Duba ƙarƙashin aikace-aikace. Dole ne misali ɗaya yana gudana saboda minReplicaCount daidai 1:

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

Tabbatar cewa an ƙirƙiri albarkatun HPA cikin nasara:

kubectl get hpa

Ya kamata ku ga wani abu kamar:

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

Binciken lafiya: samun damar aikace-aikace

Don samun damar zuwa ƙarshen REST na aikace-aikacen mu, gudu:

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

Yanzu zaku iya shiga app ɗin ku ta amfani da adireshin http://localhost:8080. Don yin wannan, gudanar da umarni:

curl http://localhost:8080/test

Sakamakon yana kama da wani abu kamar haka:

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

A wannan gaba kuma duba Redis. Za ku ga cewa mabuɗin access_count ya karu zuwa 1:

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

Tabbatar cewa ƙimar awo ta kasance http_requests duk daya:

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

Load Halitta

Za mu yi amfani hey - mai amfani don samar da kaya:

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

Hakanan zaka iya sauke mai amfani don Linux ko Windows.

Guda shi:

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

Ta hanyar tsoho, mai amfani yana aika buƙatun 200. Kuna iya tabbatar da wannan ta amfani da ma'aunin Prometheus da 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

Tabbatar da ƙimar ainihin ma'auni (tambarin PromQL ya dawo):

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

A wannan yanayin ainihin sakamakon shine 1,686057971014493 kuma ana nunawa a cikin filin value. Wannan bai isa ba don sikeli, tunda matakin da muka saita shine 3.

Ƙarin kaya!

A cikin sabon tasha, saka idanu da adadin kwas ɗin aikace-aikacen:

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

Bari mu ƙara kaya ta amfani da umarni:

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

Bayan ɗan lokaci, zaku ga HPA tana ƙididdige turawa da ƙaddamar da sabbin kwasfa. Bincika HPA don tabbatar da cewa:

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

Idan nauyin bai dace ba, za a rage ƙaddamarwa zuwa inda kwafsa ɗaya kawai ke gudana. Idan kuna son bincika ainihin ma'auni (wanda aka dawo da ta hanyar PromQL), sannan yi amfani da umarnin:

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

Ana wanke

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

ƙarshe

KEDA tana ba ku damar haɓaka ayyukan Kubernetes ta atomatik (zuwa/daga sifili) dangane da bayanai daga ma'aunin waje. Misali, dangane da ma'aunin Prometheus, tsayin layi a cikin Redis, jinkirin mabukaci a cikin batun Kafka.

KEDA yana haɗawa tare da tushen waje kuma yana ba da ma'auni ta hanyar Sabar Ma'auni zuwa Horizontal Pod Autoscaler.

Nasara!

Me kuma za a karanta:

  1. Mafi kyawun ayyuka da mafi kyawun ayyuka don gudanar da kwantena da Kubernetes a cikin yanayin samarwa.
  2. 90+ kayan aiki masu amfani don Kubernetes: turawa, gudanarwa, saka idanu, tsaro da ƙari.
  3. Tashar mu ta Kubernetes a cikin Telegram.

source: www.habr.com

Add a comment