Kubernetes lietojumprogrammu automātiskā mērogoÅ”ana, izmantojot Prometheus un KEDA

Kubernetes lietojumprogrammu automātiskā mērogoÅ”ana, izmantojot Prometheus un KEDACimuanos balonu cilvēks

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

Kubernetes lietojumprogrammu automātiskā mērogoÅ”ana, izmantojot Prometheus un KEDA

Diagrammā parādīts īss apraksts par to, kā viss darbojas:

  1. Lietojumprogramma nodroŔina HTTP trāpījumu skaita metriku Prometheus formātā.
  2. Prometheus ir konfigurēts, lai apkopotu Å”os rādÄ«tājus.
  3. 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:

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

Lietojumprogramma tiek izvietota Kubernetes, izmantojot Deployment. Tiek izveidots arī pakalpojums ClusterIP, tas ļauj Prometheus serverim iegūt lietojumprogrammu rādītājus.

Ŕeit ir lietojumprogrammas izvietoŔanas manifests.

Prometheus serveris

Prometheus izvietoŔanas manifests sastāv no:

  • ConfigMap ā€” pārsÅ«tÄ«t Prometheus konfigurāciju;
  • Deployment ā€” par Prometheus izvietoÅ”anu Kubernetes klasterÄ«;
  • ClusterIP ā€” pakalpojums piekļuvei UI Prometheus;
  • ClusterRole, ClusterRoleBinding Šø ServiceAccount ā€” Kubernetes pakalpojumu automātiskai noteikÅ”anai (automātiskā atklāŔana).

Ŕeit ir manifests Prometheus palaiŔanai.

KEDA Prometheus ScaledObject

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:

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

Apsveriet Ŕādus punktus:

  1. ViņŔ norāda uz Deployment Ar nosaukumu go-prom-app.
  2. 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])).
  3. 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.

Instalējiet jaunāko versiju Mac datorā:

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/

Komplekts kubectllai piekļūtu Kubernetes klasterim.

Instalējiet jaunāko versiju Mac datorā:

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

KEDA uzstādīŔana

Jūs varat izvietot KEDA vairākos veidos, tie ir uzskaitīti dokumentācija. Es izmantoju monolītu YAML:

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

KEDA un tās komponenti ir instalēti nosaukumu telpā keda. Komanda, lai pārbaudītu:

kubectl get pods -n keda

Pagaidiet, līdz sāk darboties KEDA operators, un dodieties uz Running State. Un pēc tam turpiniet.

Redis instalēŔana, izmantojot Helm

Ja jums nav instalēta Helm, izmantojiet Å”o vadÄ«ba. Komanda, lai instalētu operētājsistēmā Mac:

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

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:

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

Pārbaudiet, vai Redis ir veiksmīgi startējis:

kubectl get pods/redis-server-master-0

Pagaidiet, līdz Redis pāries stāvoklī Running.

Lietojumprogrammu izvietoŔana

IzvietoŔanas komanda:

kubectl apply -f go-app.yaml

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

Pārbaudiet, vai viss ir sācies:

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

Pagaidiet, līdz Redis pāriet stāvoklī Running.

Prometheus servera izvietoŔana

Prometeja manifesta lietojumi Kubernetes pakalpojuma atklāŔana programmai Prometheus. Tas ļauj dinamiski atklāt lietojumprogrammas, pamatojoties uz pakalpojuma etiķeti.

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

Lai izvietotu:

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

Pārbaudiet, vai viss ir sācies:

kubectl get pods -l=app=prometheus-server

Pagaidiet, kamēr Prometejs ieies stāvoklī Running.

Izmantojiet kubectl port-forward lai piekļūtu Prometheus lietotāja interfeisam (vai API serverim) vietnē http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA automātiskās mērogoÅ”anas konfigurācijas izvietoÅ”ana

Pavēli izveidot ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Pārbaudiet KEDA operatora žurnālus:

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

Veselības pārbaude: piekļuve lietojumprogrammai

Lai piekļūtu mūsu lietojumprogrammas REST galapunktam, palaidiet:

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

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

Slodzes izveide

Mēs izmantosim hey ā€” lietderÄ«ba slodzes Ä£enerÄ“Å”anai:

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

Varat arī lejupielādēt utilītu Linux vai Windows.

Palaidiet to:

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

Pēc noklusējuma utilīta nosūta 200 pieprasījumus. To var pārbaudīt, izmantojot Prometheus metriku, kā arī 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

Apstipriniet faktiskās metrikas vērtību (ko atgriež PromQL vaicājums):

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

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

Vairāk slodzes!

Jaunajā terminālī uzraugiet lietojumprogrammu bloku skaitu:

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

Palielināsim slodzi, izmantojot komandu:

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

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:

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

tīrīŔana

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

Veiksmi!

Ko vēl lasīt:

  1. Paraugprakse un labākā prakse konteineru un Kubernetes darbināŔanai ražoÅ”anas vidēs.
  2. Vairāk nekā 90 noderÄ«gu rÄ«ku Kubernetes: izvietoÅ”ana, pārvaldÄ«ba, uzraudzÄ«ba, droŔība un citi.
  3. Mūsu kanāls Ap Kubernetes telegrammā.

Avots: www.habr.com

Pievieno komentāru