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
Diagrammada hamma narsa qanday ishlashining qisqacha tavsifi ko'rsatilgan:
Ilova Prometey formatida HTTP urishlar soni ko'rsatkichlarini taqdim etadi.
Prometey ushbu ko'rsatkichlarni yig'ish uchun tuzilgan.
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:
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",
})
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.
Ilova Kubernetes-ga orqali joylashtirilgan Deployment. Xizmat ham yaratilgan ClusterIP, u Prometey serveriga dastur ko'rsatkichlarini olish imkonini beradi.
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:
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])).
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.
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:
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.
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:
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:
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:
//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.