Prometheus və KEDA-dan istifadə edərək Kubernetes tətbiqlərinin avtomatik miqyaslanması

Prometheus və KEDA-dan istifadə edərək Kubernetes tətbiqlərinin avtomatik miqyaslanmasıCimuanos tərəfindən Balon Adam

Ölçeklenebilirlik bulud proqramları üçün əsas tələbdir. Kubernetes ilə tətbiqin miqyası müvafiq yerləşdirmə və ya tətbiq üçün replikaların sayını artırmaq qədər sadədir. ReplicaSet - lakin bu, əl ilə edilən bir prosesdir.

Kubernetes tətbiqləri avtomatik miqyaslamağa imkan verir (məsələn, yerləşdirmədəki podlar və ya ReplicaSet) Horizontal Pod Autoscaler spesifikasiyasından istifadə edərək deklarativ şəkildə. Avtomatik miqyaslama üçün standart meyar CPU istifadə ölçüləridir (resurs ölçüləri), lakin siz xüsusi və xaricdən təmin edilmiş ölçüləri birləşdirə bilərsiniz.

Komanda Mail.ru-dan Kubernetes aaS Kubernetes tətbiqini avtomatik ölçmək üçün xarici ölçülərdən necə istifadə etmək barədə məqaləni tərcümə etdi. Hər şeyin necə işlədiyini göstərmək üçün müəllif Prometheus istifadə edərək toplanan HTTP giriş sorğusu ölçülərindən istifadə edir.

Qovşaqların üfüqi avtomatik miqyaslanması əvəzinə, açıq mənbəli Kubernetes operatoru olan Kubernetes Event Driven Autoscaling (KEDA) istifadə olunur. O, hadisəyə əsaslanan iş yükləri üçün qüsursuz avtomatik miqyaslaşdırmanı (sıfıra/sıfırdan) təmin etmək üçün yerli olaraq Horizontal Pod Autoscaler ilə inteqrasiya edir. Kod mövcuddur Github.

Sistemin qısa icmalı

Prometheus və KEDA-dan istifadə edərək Kubernetes tətbiqlərinin avtomatik miqyaslanması

Diaqram hər şeyin necə işlədiyinin qısa təsvirini göstərir:

  1. Tətbiq Prometheus formatında HTTP hit count metriklərini təqdim edir.
  2. Prometey bu göstəriciləri toplamaq üçün konfiqurasiya edilmişdir.
  3. KEDA-dakı Prometheus miqyaslayıcısı HTTP hitlərinin sayına əsasən tətbiqi avtomatik ölçmək üçün konfiqurasiya edilmişdir.

İndi hər bir element haqqında sizə ətraflı məlumat verəcəyəm.

KEDA və Prometey

Prometheus açıq mənbəli sistem monitorinqi və xəbərdarlıq alət dəstidir Bulud Yerli Hesablama Vəqfi. Müxtəlif mənbələrdən ölçüləri toplayır və onları zaman seriyası məlumatları kimi saxlayır. Məlumatları vizuallaşdırmaq üçün istifadə edə bilərsiniz Qrafana və ya Kubernetes API ilə işləyən digər vizuallaşdırma vasitələri.

KEDA miqyaslayıcı konsepsiyasını dəstəkləyir - o, KEDA ilə xarici sistem arasında körpü rolunu oynayır. Skaler tətbiqi hər bir hədəf sistemə xasdır və ondan məlumatları çıxarır. KEDA daha sonra avtomatik miqyaslamağa nəzarət etmək üçün onlardan istifadə edir.

Skalerlər bir çox məlumat mənbələrini dəstəkləyir, məsələn, Kafka, Redis, Prometheus. Yəni, KEDA meyar kimi Prometheus metriklərindən istifadə edərək Kubernetes yerləşdirmələrini avtomatik miqyaslaşdırmaq üçün istifadə edilə bilər.

Test tətbiqi

Golang test tətbiqi HTTP vasitəsilə girişi təmin edir və iki mühüm funksiyanı yerinə yetirir:

  1. Tətbiqi alət etmək və hit sayını ehtiva edən http_requests metrikasını təmin etmək üçün Prometheus Go müştəri kitabxanasından istifadə edir. Prometey ölçülərinin mövcud olduğu son nöqtə URI-də yerləşir /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Müraciətə cavab olaraq GET proqram açarın dəyərini artırır (access_count) Redisdə. Bu, HTTP işləyicisinin bir hissəsi kimi işi görmək və həmçinin Prometheus göstəricilərini yoxlamaq üçün asan bir yoldur. Metrik dəyər dəyərlə eyni olmalıdır access_count Redisdə.
    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)
       }
    

Tətbiq vasitəsilə Kubernetes-ə yerləşdirilir Deployment. Xidmət də yaradılır ClusterIP, o, Prometheus serverinə proqram ölçülərini əldə etməyə imkan verir.

Burada tətbiq üçün yerləşdirmə manifestidir.

Prometheus Server

Prometey yerləşdirmə manifestinə aşağıdakılar daxildir:

  • ConfigMap — Prometheus konfiqurasiyasını köçürmək;
  • Deployment — Prometeyi Kubernetes klasterində yerləşdirmək üçün;
  • ClusterIP — UI Prometheus-a giriş xidməti;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — Kubernetes-də xidmətlərin avtomatik aşkarlanması üçün (Avtomatik kəşf).

Burada Prometeyi idarə etmək üçün manifest.

KEDA Prometheus ScaledObject

Skaler KEDA ilə ölçülərin alınması lazım olan xarici sistem arasında körpü rolunu oynayır. ScaledObject yerləşdirməni hadisə mənbəyi, bu halda Prometey ilə sinxronlaşdırmaq üçün yerləşdirilməli olan xüsusi resursdur.

ScaledObject yerləşdirmə miqyası məlumatını, hadisə mənbəyi metadatasını (məsələn, əlaqə sirri, növbə adı), sorğu intervalı, bərpa müddəti və digər məlumatları ehtiva edir. Bu, yerləşdirməni miqyaslaşdırmaq üçün müvafiq avtomatik miqyaslama resursu (HPA tərifi) ilə nəticələnir.

Bir obyekt olduqda ScaledObject silinir, müvafiq HPA tərifi silinir.

Budur tərif ScaledObject bizim nümunəmiz üçün miqyaslayıcıdan istifadə edir 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]))

Aşağıdakı məqamları nəzərdən keçirin:

  1. işarə edir Deployment Adla go-prom-app.
  2. Tətik növü - Prometheus. Prometheus server ünvanı metrik adı, eşik həddi və ilə birlikdə qeyd olunur PromQL sorğusu, istifadə olunacaq. PromQL Sorğusu - sum(rate(http_requests[2m])).
  3. Uyğun olaraq pollingInterval,KEDA hər on beş saniyədən bir Prometeydən hədəf tələb edir. Ən azı bir (minReplicaCount) və podların maksimum sayı keçmir maxReplicaCount (bu nümunədə - on).

Quraşdırmaq olar minReplicaCount sıfıra bərabərdir. Bu halda, KEDA sıfırdan birə yerləşdirməni aktivləşdirir və daha sonra avtomatik miqyaslama üçün HPA-nı ifşa edir. Əks sıra da mümkündür, yəni birdən sıfıra qədər miqyası. Nümunədə biz sıfırı seçmədik, çünki bu, tələb olunan sistem deyil, HTTP xidmətidir.

Avtomatik ölçmə daxilində sehr

Həddi yerləşdirmənin miqyasını artırmaq üçün tetikleyici kimi istifadə olunur. Bizim nümunəmizdə PromQL sorğusu sum(rate (http_requests [2m])) son iki dəqiqə ərzində ölçülən məcmu HTTP sorğu sürətini (saniyədə sorğu) qaytarır.

Eşik dəyəri üç olduğundan, dəyəri isə bir altında olacaq deməkdir sum(rate (http_requests [2m])) üçdən azdır. Dəyər artırsa, hər dəfə əlavə bir alt əlavə olunur sum(rate (http_requests [2m])) üç artır. Məsələn, dəyər 12-dən 14-ə qədərdirsə, podların sayı dörddür.

İndi onu qurmağa cəhd edək!

əvvəlcədən təyin edilməsi

Sizə lazım olan tək şey Kubernetes klasteri və konfiqurasiya edilmiş yardım proqramıdır kubectl. Bu nümunə klasterdən istifadə edir minikube, amma başqa birini götürə bilərsiniz. Bir klaster quraşdırmaq üçün var bələdçi.

Mac-da ən son versiyanı quraşdırın:

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/

Təyin etmək kubectlKubernetes klasterinə daxil olmaq üçün.

Mac-da ən son versiyanı quraşdırın:

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 quraşdırılması

KEDA-nı bir neçə yolla yerləşdirə bilərsiniz, bunlar siyahıda verilmişdir sənədləşdirmə. Mən monolit YAML istifadə edirəm:

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

KEDA və onun komponentləri ad sahəsinə quraşdırılmışdır keda. Yoxlamaq əmri:

kubectl get pods -n keda

KEDA Operatorunun başlamasını gözləyin və ona keçin Running State. Və bundan sonra davam edin.

Helm istifadə edərək Redis quraşdırılması

Əgər Helm quraşdırılmayıbsa, bundan istifadə edin rəhbərlik. Mac-da quraşdırma əmri:

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

helm init yerli komanda xətti interfeysini işə salır və həmçinin quraşdırır Tiller Kubernetes klasterinə.

kubectl get pods -n kube-system | grep tiller

Tiller podunun Running vəziyyətinə daxil olmasını gözləyin.

Tərcüməçinin qeydi: Müəllif Tiller server komponentinin quraşdırılmasını tələb edən Helm@2-dən istifadə edir. İndi Helm@3 aktualdır, server hissəsi tələb olunmur.

Helm quraşdırdıqdan sonra Redis-i işə salmaq üçün bir əmr kifayətdir:

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

Redisin uğurla başladığını yoxlayın:

kubectl get pods/redis-server-master-0

Redisin dövlətə keçməsini gözləyin Running.

Tətbiqin Yerləşdirilməsi

Yerləşdirmə əmri:

kubectl apply -f go-app.yaml

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

Hər şeyin başladığını yoxlayın:

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

Redisin dövlətə girməsini gözləyin Running.

Prometheus Serverinin yerləşdirilməsi

Prometey manifestindən istifadə edir Prometey üçün Kubernetes Xidmət Kəşfi. O, xidmət etiketinə əsaslanan proqram podlarının dinamik kəşfinə imkan verir.

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

Yerləşdirmək üçün:

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

Hər şeyin başladığını yoxlayın:

kubectl get pods -l=app=prometheus-server

Prometeyin dövlətə girməsini gözləyin Running.

İstifadə edin kubectl port-forward Prometheus istifadəçi interfeysinə (və ya API serverinə) daxil olmaq üçün http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA Avtomatik Ölçmə Konfiqurasiyasının tətbiqi

Yaratmaq əmri ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

KEDA operator qeydlərini yoxlayın:

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

Nəticə belə görünür:

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"

Tətbiqlər altında yoxlayın. Bir nümunə işləməlidir, çünki minReplicaCount 1-ə bərabərdir:

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

HPA resursunun uğurla yaradıldığını yoxlayın:

kubectl get hpa

Belə bir şey görməlisiniz:

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

Sağlamlıq yoxlanışı: tətbiqə giriş

Tətbiqimizin REST son nöqtəsinə daxil olmaq üçün çalıştırın:

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

İndi ünvandan istifadə edərək Go tətbiqinizə daxil ola bilərsiniz http://localhost:8080. Bunu etmək üçün əmri işlədin:

curl http://localhost:8080/test

Nəticə belə görünür:

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

Bu nöqtədə Redis-i də yoxlayın. Açar olduğunu görəcəksiniz access_count 1-ə yüksəldi:

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

Metrik dəyərin olduğundan əmin olun http_requests eyni:

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

Yük Yaratma

İstifadə edəcəyik hey — yük yaratmaq üçün kommunal:

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

üçün yardım proqramı da yükləyə bilərsiniz Linux və ya Windows.

Çalıştırın:

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

Varsayılan olaraq, yardım proqramı 200 sorğu göndərir. Bunu Prometheus ölçüləri və Redis istifadə edərək yoxlaya bilərsiniz.

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

Həqiqi metrikanın dəyərini təsdiq edin (PromQL sorğusu ilə qaytarılır):

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

Bu halda faktiki nəticədir 1,686057971014493 və sahədə göstərilir value. Bu, ölçmə üçün kifayət deyil, çünki təyin etdiyimiz hədd 3-dür.

Daha çox yük!

Yeni terminalda proqram podlarının sayına nəzarət edin:

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

Komandadan istifadə edərək yükü artıraq:

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

Bir müddət sonra siz HPA-nın yerləşdirməni genişləndirdiyini və yeni podları işə saldığını görəcəksiniz. Əmin olmaq üçün HPA-nı yoxlayın:

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

Yük uyğunsuzdursa, yerləşdirmə yalnız bir podun işlədiyi nöqtəyə qədər azalacaq. Həqiqi metrikanı yoxlamaq istəyirsinizsə (PromQL sorğusu ilə qaytarılır), onda əmrdən istifadə edin:

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

Təmizləmə

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

Nəticə

KEDA sizə Kubernetes yerləşdirmələrinizi xarici ölçülərdən alınan məlumatlar əsasında avtomatik miqyaslandırmağa (sıfıra/sıfırdan) imkan verir. Məsələn, Prometey ölçülərinə əsaslanaraq, Redis-də növbə uzunluğu, Kafka mövzusunda istehlakçı gecikməsi.

KEDA xarici mənbə ilə inteqrasiya edir və həmçinin ölçülərini Metrics Server vasitəsilə Horizontal Pod Autoscaler-ə təqdim edir.

Good Luck!

Başqa nə oxumaq lazımdır:

  1. İstehsal Mühitlərində Konteynerlərin və Kubernetlərin işlədilməsi üçün ən yaxşı təcrübələr və ən yaxşı təcrübələr.
  2. Kubernetes üçün 90+ Faydalı Alətlər: Yerləşdirmə, İdarəetmə, Monitorinq, Təhlükəsizlik və s.
  3. Telegram-da Kubernetes ətrafında kanalımız.

Mənbə: www.habr.com

Добавить комментарий