Prometey va KEDA bilan Kubernetes ilovalarini avtomatik o'lchash

Prometey va KEDA bilan Kubernetes ilovalarini avtomatik o'lchashCimuanos tomonidan "Balon odam"

Scalability bulutli ilovalar uchun asosiy talabdir. Kubernetes yordamida dasturni masshtablash mos joylashtirish uchun replikalar sonini ko'paytirish yoki ReplicaSet - lekin bu qo'lda bajariladigan jarayon.

Kubernetes ilovalarni avtomatik ravishda o'lchash imkonini beradi (masalan, joylashtirishdagi podlar yoki ReplicaSet) Gorizontal Pod Autoscaler spetsifikatsiyasidan foydalangan holda deklarativ tarzda. Avtomatik masshtablashning standart mezoni protsessordan foydalanish ko'rsatkichlari (resurs ko'rsatkichlari), lekin siz maxsus va tashqaridan taqdim etilgan ko'rsatkichlarni birlashtirishingiz mumkin.

komanda Mail.ru dan Kubernetes aaS Kubernetes ilovasini avtomatik ravishda o'lchash uchun tashqi ko'rsatkichlardan qanday foydalanish haqida maqolani tarjima qildi. Hamma narsa qanday ishlashini ko'rsatish uchun muallif Prometey yordamida to'plangan HTTP kirish so'rovi ko'rsatkichlaridan foydalanadi.

Qopqoqlarni gorizontal avtoshkalalash o'rniga ochiq manbali Kubernetes operatori bo'lgan Kubernetes Event Driven Autoscaling (KEDA) ishlatiladi. Hodisaga asoslangan ish yuklari uchun uzluksiz avtomatik oʻlchovni (jumladan, nolga/noldan) taʼminlash uchun u Horizontal Pod Autoscaler bilan tabiiy ravishda integratsiyalashgan. Kod mavjud GitHub.

Tizim haqida qisqacha ma'lumot

Prometey va KEDA bilan Kubernetes ilovalarini avtomatik o'lchash

Diagrammada hamma narsa qanday ishlashining qisqacha tavsifi ko'rsatilgan:

  1. Ilova Prometey formatida HTTP urishlar soni ko'rsatkichlarini taqdim etadi.
  2. Prometey ushbu ko'rsatkichlarni yig'ish uchun tuzilgan.
  3. KEDA-dagi Prometey o'lchagichi HTTP xitlar soniga qarab dasturni avtomatik ravishda o'lchash uchun tuzilgan.

Endi men sizga har bir element haqida batafsil aytib beraman.

KEDA va Prometey

Prometey - bu ochiq manbali tizim monitoringi va ogohlantirish asboblar to'plami, qismi Bulutli mahalliy hisoblash jamg'armasi. Turli manbalardan ko'rsatkichlarni to'playdi va ularni vaqt seriyasi ma'lumotlari sifatida saqlaydi. Ma'lumotlarni vizualizatsiya qilish uchun siz foydalanishingiz mumkin grafana yoki Kubernetes API bilan ishlaydigan boshqa vizualizatsiya vositalari.

KEDA skaler kontseptsiyasini qo'llab-quvvatlaydi - u KEDA va tashqi tizim o'rtasida ko'prik vazifasini bajaradi. Skalerni amalga oshirish har bir maqsadli tizimga xos bo'lib, undan ma'lumotlarni chiqaradi. Keyin KEDA ularni avtomatik masshtablashni boshqarish uchun ishlatadi.

Skalerlar bir nechta ma'lumotlar manbalarini qo'llab-quvvatlaydi, masalan, Kafka, Redis, Prometey. Ya'ni, KEDA mezonlar sifatida Prometey ko'rsatkichlaridan foydalangan holda Kubernetes o'rnatishni avtomatik ravishda o'lchash uchun ishlatilishi mumkin.

Test dasturi

Golang test ilovasi HTTP orqali kirishni ta'minlaydi va ikkita muhim funktsiyani bajaradi:

  1. Prometheus Go mijozlar kutubxonasidan ilovani asbob-uskunalar bilan ta'minlash va urishlar sonini o'z ichiga olgan http_requests ko'rsatkichini taqdim etish uchun foydalanadi. Prometey ko'rsatkichlari mavjud bo'lgan so'nggi nuqta URIda joylashgan /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. So'rovga javoban GET ilova kalit qiymatini oshiradi (access_count) Redisda. Bu HTTP ishlov beruvchisining bir qismi sifatida ishni bajarish va Prometey ko'rsatkichlarini tekshirishning oson yo'lidir. Metrik qiymat qiymat bilan bir xil bo'lishi kerak access_count Redisda.
    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)
       }
    

Ilova Kubernetes-ga orqali joylashtirilgan Deployment. Xizmat ham yaratilgan ClusterIP, u Prometey serveriga dastur ko'rsatkichlarini olish imkonini beradi.

shu yerda ilova uchun joylashtirish manifestidir.

Prometey serveri

Prometeyni joylashtirish manifestiga quyidagilar kiradi:

  • ConfigMap — Prometey konfiguratsiyasini uzatish uchun;
  • Deployment — Prometeyni Kubernetes klasterida joylashtirish uchun;
  • ClusterIP — Prometey interfeysiga kirish xizmati;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — Kubernetesda xizmatlarni avtomatik aniqlash uchun (Avto-kashfiyot).

shu yerda Prometeyni boshqarish uchun manifest.

KEDA Prometheus ScaledObject

Skaler KEDA va ko'rsatkichlarni olish kerak bo'lgan tashqi tizim o'rtasida ko'prik vazifasini bajaradi. ScaledObject hodisa manbai, bu holda Prometey bilan tarqatishni sinxronlashtirish uchun joylashtirilishi kerak bo'lgan maxsus resurs.

ScaledObject joylashtirish miqyosi maʼlumotlari, voqea manbasi metamaʼlumotlari (masalan, ulanish sirlari, navbat nomi), soʻrovlar oraligʻi, tiklash davri va boshqa maʼlumotlarni oʻz ichiga oladi. Bu joylashtirishni miqyoslash uchun mos keladigan avtomatik o'lchov resursiga (HPA ta'rifi) olib keladi.

Ob'ekt qachon ScaledObject o'chirilsa, tegishli HPA ta'rifi o'chiriladi.

Mana ta'rif ScaledObject bizning misolimiz uchun u shkaladan foydalanadi 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]))

Quyidagi fikrlarni ko'rib chiqing:

  1. U ishora qiladi Deployment Ism bilan go-prom-app.
  2. Trigger turi - Prometheus. Prometey server manzili metrik nomi, chegarasi va bilan birga eslatib o'tiladi PromQL so'rovi, qaysi ishlatiladi. PromQL so'rovi - sum(rate(http_requests[2m])).
  3. Shunga ko'ra pollingInterval,KEDA har o'n besh soniyada Prometeydan nishon so'raydi. Kamida bittasi (minReplicaCount), va ko'zalarning maksimal soni oshmaydi maxReplicaCount (ushbu misolda - o'nta).

O'rnatish mumkin minReplicaCount nolga teng. Bunday holda, KEDA noldan birga joylashtirishni faollashtiradi va keyin keyingi avtomatik masshtablash uchun HPA ni ochib beradi. Teskari tartib ham mumkin, ya'ni birdan nolga o'tish. Misolda biz nolni tanlamadik, chunki bu HTTP xizmati va talab bo'yicha tizim emas.

Avtomatik o'lchamdagi sehr

Eshik o'rnatishni kengaytirish uchun tetik sifatida ishlatiladi. Bizning misolimizda PromQL so'rovi sum(rate (http_requests [2m])) so'nggi ikki daqiqada o'lchangan HTTP so'rovining jamlangan tezligini (soniyadagi so'rovlar) qaytaradi.

Chegara qiymati uchta bo'lganligi sababli, bu qiymatdan pastda bitta bo'lishini anglatadi sum(rate (http_requests [2m])) uchdan kam. Agar qiymat oshsa, har safar qo'shimcha pastki qo'shiladi sum(rate (http_requests [2m])) uchga ortadi. Misol uchun, agar qiymat 12 dan 14 gacha bo'lsa, u holda podalar soni to'rtta bo'ladi.

Endi uni sozlashga harakat qilaylik!

oldindan sozlash

Sizga kerak bo'lgan narsa - Kubernetes klasteri va sozlangan yordamchi dastur kubectl. Ushbu misolda klaster ishlatiladi minikube, lekin siz boshqasini olishingiz mumkin. Klaster o'rnatish uchun mavjud etakchilik.

Mac-ga so'nggi versiyani o'rnating:

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/

O'rnatish kubectlKubernetes klasteriga kirish uchun.

Mac-ga so'nggi versiyani o'rnating:

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 o'rnatish

Siz KEDA-ni bir necha usulda joylashtirishingiz mumkin, ular ro'yxatda keltirilgan hujjatlar. Men monolit YAML dan foydalanmoqdaman:

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

KEDA va uning komponentlari nomlar maydoniga o'rnatiladi keda. Tekshirish uchun buyruq:

kubectl get pods -n keda

KEDA operatori ishga tushishini kuting va unga o'ting Running State. Va keyin davom eting.

Helm yordamida Redis-ni o'rnatish

Agar sizda Helm o'rnatilmagan bo'lsa, undan foydalaning yo'l-yo'riq. Mac-ga o'rnatish buyrug'i:

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

helm init mahalliy buyruq qatori interfeysini ishga tushiradi va o'rnatadi Tiller Kubernetes klasteriga.

kubectl get pods -n kube-system | grep tiller

Tiller podining Running holatiga kirishini kuting.

Tarjimonning eslatmasi: Muallif Helm@2 dan foydalanadi, bu esa Tiller server komponentini o'rnatishni talab qiladi. Endi Helm@3 tegishli, u server qismini talab qilmaydi.

Helm-ni o'rnatgandan so'ng, Redis-ni ishga tushirish uchun bitta buyruq kifoya qiladi:

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

Redis muvaffaqiyatli boshlanganiga ishonch hosil qiling:

kubectl get pods/redis-server-master-0

Redis shtatga o'tishini kuting Running.

Ilovani joylashtirish

O'rnatish buyrug'i:

kubectl apply -f go-app.yaml

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

Hammasi boshlanganligini tekshiring:

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

Redis holatiga kirishini kuting Running.

Prometey serverini o'rnatish

Prometey manifestidan foydalanish Prometey uchun Kubernetes xizmati kashfiyoti. Bu xizmat yorlig'i asosida dastur podslarini dinamik ravishda topish imkonini beradi.

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

Joylashtirish uchun:

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

Hammasi boshlanganligini tekshiring:

kubectl get pods -l=app=prometheus-server

Prometey davlatga kirishini kuting Running.

Foydalanish kubectl port-forward Prometey foydalanuvchi interfeysiga (yoki API serveriga) kirish uchun http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA avtomatik o'lchov konfiguratsiyasini o'rnatish

Yaratish uchun buyruq ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

KEDA operator jurnallarini tekshiring:

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

Natija shunday ko'rinadi:

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"

Ilovalar ostida tekshiring. Bitta misol ishlayotgan bo'lishi kerak, chunki minReplicaCount 1 ga teng:

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

HPA resursi muvaffaqiyatli yaratilganligini tekshiring:

kubectl get hpa

Siz shunga o'xshash narsani ko'rishingiz kerak:

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

Salomatlik tekshiruvi: ilovaga kirish

Ilovamizning REST so'nggi nuqtasiga kirish uchun quyidagilarni bajaring:

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

Endi manzil orqali Go ilovangizga kirishingiz mumkin http://localhost:8080. Buning uchun buyruqni bajaring:

curl http://localhost:8080/test

Natija shunday ko'rinadi:

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

Shu nuqtada Redisni ham tekshiring. Bu kalit ekanligini ko'rasiz access_count 1 ga ko'tarildi:

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

Metrik qiymatga ishonch hosil qiling http_requests xuddi shu:

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

Yuk yaratish

Biz foydalanamiz hey - yuk hosil qilish uchun yordamchi dastur:

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

uchun yordam dasturini ham yuklab olishingiz mumkin Linux yoki Windows.

Uni ishga tushiring:

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

Odatiy bo'lib, yordamchi dastur 200 ta so'rov yuboradi. Buni Prometey ko'rsatkichlari va Redis yordamida tekshirishingiz mumkin.

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

Haqiqiy metrikaning qiymatini tasdiqlang (PromQL so'rovi orqali qaytariladi):

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

Bunday holda, haqiqiy natija 1,686057971014493 va maydonda ko'rsatiladi value. Bu o'lchov uchun etarli emas, chunki biz o'rnatgan chegara 3 ga teng.

Ko'proq yuk!

Yangi terminalda dastur podkastlari sonini kuzatib boring:

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

Buyruq yordamida yukni oshiramiz:

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

Bir muncha vaqt o'tgach, siz HPA o'rnatishni kengaytirayotganini va yangi podlarni ishga tushirayotganini ko'rasiz. Quyidagilarga ishonch hosil qilish uchun HPA ni tekshiring:

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

Agar yuk mos kelmasa, joylashtirish faqat bitta pod ishlayotgan nuqtaga kamayadi. Haqiqiy ko'rsatkichni (PromQL so'rovi tomonidan qaytarilgan) tekshirmoqchi bo'lsangiz, quyidagi buyruqdan foydalaning:

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

tozalash

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

xulosa

KEDA sizga tashqi oʻlchovlar maʼlumotlari asosida Kubernetes oʻrnatishlaringizni avtomatik ravishda (nolgacha/noldan) oʻlchash imkonini beradi. Masalan, Prometey ko'rsatkichlariga asoslanib, Redisdagi navbat uzunligi, Kafka mavzusidagi iste'molchining kechikishi.

KEDA tashqi manba bilan integratsiyalashgan va o'z ko'rsatkichlarini Metrics Server orqali Horizontal Pod Autoscaler-ga taqdim etadi.

Omad tilaymiz!

Yana nimani o'qish kerak:

  1. Ishlab chiqarish muhitida konteynerlar va Kubernetlarni ishlatish bo'yicha eng yaxshi amaliyotlar va eng yaxshi amaliyotlar.
  2. Kubernetes uchun 90+ foydali vositalar: joylashtirish, boshqarish, monitoring, xavfsizlik va boshqalar.
  3. Telegramdagi Kubernetes atrofidagi kanalimiz.

Manba: www.habr.com

a Izoh qo'shish