Ö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ı
Diaqram hər şeyin necə işlədiyinin qısa təsvirini göstərir:
Tətbiq Prometheus formatında HTTP hit count metriklərini təqdim edir.
Prometey bu göstəriciləri toplamaq üçün konfiqurasiya edilmişdir.
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:
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",
})
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ə.
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.
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:
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])).
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.
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:
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.
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.
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:
İ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:
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:
//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.