Масштабдуулук булут колдонмолору үчүн негизги талап болуп саналат. Kubernetes менен, тиркемени масштабдоо ылайыктуу жайгаштыруу же репликалардын санын көбөйтүү сыяктуу жөнөкөй. ReplicaSet — бирок бул кол менен жасалган процесс.
Kubernetes колдонмолорду автоматтык түрдө масштабдоого мүмкүндүк берет (мисалы, жайгаштыруудагы Pods же ReplicaSet) Horizontal Pod Autoscaler спецификациясын колдонуу менен декларациялык түрдө. Автоматтык масштабдоо үчүн демейки критерий CPU колдонуу көрсөткүчтөрү (ресурстун көрсөткүчтөрү), бирок сиз ыңгайлаштырылган жана сырттан берилген көрсөткүчтөрдү бириктире аласыз.
команда Mail.ru сайтынан Kubernetes aaS Kubernetes тиркемесин автоматтык түрдө масштабдоо үчүн тышкы көрсөткүчтөрдү кантип колдонуу керектиги жөнүндө макаланы которгон. Баары кантип иштээрин көрсөтүү үчүн, автор Prometheus аркылуу чогултулган HTTP кирүү сурамынын көрсөткүчтөрүн колдонот.
Подшокторду горизонталдуу автоскалдаштыруунун ордуна, Kubernetes Event Driven Autoscaling (KEDA) ачык булактуу Kubernetes оператору колдонулат. Окуяга негизделген иш жүктөмдөрү үчүн үзгүлтүксүз автоскалоону (анын ичинде нөлгө чейин/нөлгө чейин) камсыз кылуу үчүн ал Horizontal Pod Autoscaler менен түп-тамыры менен интеграцияланат. Код жеткиликтүү GitHub.
Системанын кыскача баяндамасы
Диаграмма баары кантип иштээрин кыскача сүрөттөйт:
Колдонмо Prometheus форматында HTTP хит санынын көрсөткүчтөрүн берет.
Prometheus бул көрсөткүчтөрдү чогултуу үчүн конфигурацияланган.
KEDAдагы Prometheus масштабдоочу HTTP хиттеринин санына жараша тиркемени автоматтык түрдө масштабдоо үчүн конфигурацияланган.
Эми мен ар бир элемент жөнүндө майда-чүйдөсүнө чейин айтып берем.
KEDA жана Прометей
Prometheus ачык булак системасы мониторинг жана эскертүү куралдары, бөлүгү болуп саналат Cloud Native Computing Foundation. Ар кандай булактардан метрикаларды чогултат жана аларды убакыт серияларынын маалыматтары катары сактайт. Сиз колдоно аласыз маалыматтарды визуалдаштыруу үчүн Графана же Kubernetes API менен иштеген башка визуалдаштыруу куралдары.
KEDA масштабдуу концепцияны колдойт - ал KEDA менен тышкы системанын ортосунда көпүрө болуп иштейт. Масштабды ишке ашыруу ар бир максаттуу системага мүнөздүү жана андан маалыматтарды чыгарат. Андан кийин KEDA аларды автоматтык масштабдоону башкаруу үчүн колдонот.
Scalers бир нече маалымат булактарын колдойт, мисалы, Kafka, Redis, Prometheus. Башкача айтканда, KEDA Prometheus метрикасын критерий катары колдонуп, Kubernetes жайылтууларын автоматтык түрдө масштабдоо үчүн колдонулушу мүмкүн.
Сыноо колдонмо
Golang тест колдонмо HTTP аркылуу мүмкүндүк берет жана эки маанилүү милдеттерди аткарат:
Prometheus Go кардар китепканасын колдонмону инструменттөө жана хит санын камтыган http_requests метрикасын камсыз кылуу үчүн колдонот. Prometheus көрсөткүчтөрү жеткиликтүү болгон акыркы чекит URIде жайгашкан /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
суроосуна жооп катары GET колдонмо ачкычтын маанисин жогорулатат (access_count) Редисте. Бул HTTP иштеткичинин бир бөлүгү катары ишти аткаруунун жана ошондой эле Prometheus көрсөткүчтөрүн текшерүүнүн оңой жолу. Метрикалык маани маани менен бирдей болушу керек access_count Редисте.
Колдонмо Kubernetes аркылуу жайгаштырылат Deployment. Кызмат да түзүлөт ClusterIP, ал Prometheus серверине колдонмо көрсөткүчтөрүн алууга мүмкүндүк берет.
Масштаблоочу KEDA менен тышкы системанын ортосунда көпүрө болуп иштейт, андан метрика алынышы керек. ScaledObject окуя булагы менен жайылтууну синхрондоштуруу үчүн жайгаштырылышы керек болгон жеке ресурс, бул учурда Prometheus.
ScaledObject жайгаштыруу масштабы боюнча маалыматты, окуя булагынын метадайындарын (байланыш сырлары, кезектин аталышы сыяктуу), сурамжылоонун аралыгы, калыбына келтирүү мезгили жана башка маалыматтарды камтыйт. Бул жайылтууну масштабдоо үчүн тиешелүү автоскалдаштыруу ресурсуна (HPA аныктамасына) алып келет.
объект болгондо ScaledObject жок кылынса, тиешелүү HPA аныктамасы тазаланат.
Бул жерде аныктамасы ScaledObject биздин мисал үчүн, ал масштабдуу колдонот Prometheus:
Триггер түрү - Prometheus. Prometheus серверинин дареги метрикалык аталышы, босогосу жана менен бирге айтылат PromQL суроо, колдонула турган. PromQL Query - sum(rate(http_requests[2m])).
ылайык pollingInterval,KEDA ар бир он беш секундада Прометейден бутаны сурайт. жок дегенде бир (minReplicaCount), ал эми кабыктардын максималдуу саны ашпайт maxReplicaCount (бул мисалда - он).
Орнотууга болот minReplicaCount нөлгө барабар. Бул учурда, KEDA нөлгө бир жайгаштырууну активдештирет, андан кийин HPAны андан ары автоматтык масштабдоо үчүн көрсөтөт. Тескери тартипте да мүмкүн, башкача айтканда, бирден нөлгө чейин масштабдоо. Мисалда биз нөлдү тандаган жокпуз, анткени бул HTTP кызматы жана талап боюнча система эмес.
Autoscaling ичиндеги сыйкыр
Босого жайгаштырууну масштабдоо үчүн триггер катары колдонулат. Биздин мисалда, PromQL суроо sum(rate (http_requests [2m])) акыркы эки мүнөт ичинде ченелген HTTP сурамынын топтолгон ылдамдыгын (секундасына суроо) кайтарат.
Босого маани үч болгондуктан, бул маанинин астында бирөө болот дегенди билдирет sum(rate (http_requests [2m])) үчтөн аз. Эгер маани көбөйсө, ар бир жолу кошумча кошумча кошулат sum(rate (http_requests [2m])) үчкө көбөйөт. Мисалы, эгерде маани 12ден 14кө чейин болсо, анда чакмактардын саны төрт.
Эми аны жөндөп көрөлү!
алдын ала орнотуу
Сизге керек болгон нерсе - Kubernetes кластери жана конфигурацияланган утилита kubectl. Бул мисалда кластер колдонулат minikube, бирок башкасын ала аласыз. Кластерди орнотуу үчүн бар жетекчилик.
helm init жергиликтүү буйрук сабынын интерфейсин инициализациялайт жана ошондой эле орнотот Tiller Kubernetes кластерине.
kubectl get pods -n kube-system | grep tiller
Tiller pod Running абалына кирүү үчүн күтө тургула.
Котормочунун эскертүүсү: Автор Helm@2 колдонот, ал үчүн Tiller серверинин компоненти орнотулушу керек. Азыр Helm@3 актуалдуу, ал сервер бөлүгүн талап кылбайт.
Helm орнотулгандан кийин, Redisди баштоо үчүн бир буйрук жетиштүү:
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
Баары башталганын текшериңиз:
kubectl get pods -l=app=prometheus-server
Прометейдин мамлекетке киришин күт Running.
колдонуу kubectl port-forward Prometheus колдонуучу интерфейсине (же API серверине) кирүү үчүн http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Натыйжа мындай көрүнөт:
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"
Колдонмолордун астынан текшериңиз. Бир инстанция иштеп жатат, анткени minReplicaCount 1ге барабар:
kubectl get pods -l=app=go-prom-app
HPA ресурсу ийгиликтүү түзүлгөнүн текшериңиз:
kubectl get hpa
Сиз төмөнкүдөй нерсени көрүшүңүз керек:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Ден соолукту текшерүү: колдонмого кирүү
Биздин колдонмонун REST акыркы чекитине жетүү үчүн, иштетиңиз:
Эми сиз Go колдонмоңузга даректи колдонуп кире аласыз http://localhost:8080. Бул үчүн, буйрукту аткарыңыз:
curl http://localhost:8080/test
Натыйжа мындай көрүнөт:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Бул учурда Redisди дагы текшериңиз. Сиз ачкыч экенин көрөсүз access_count 1ге көбөйдү:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Метрикалык маани экенин текшериңиз http_requests ошондой:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Түзүүнү жүктөө
Биз колдонобуз эй - жүктү түзүү үчүн пайдалуу программа:
Бул учурда чыныгы натыйжа болот 1,686057971014493 жана талаада көрсөтүлөт value. Бул масштабдоо үчүн жетишсиз, анткени биз койгон босого 3.
Көбүрөөк жүк!
Жаңы терминалда тиркеменин подкасттарынын санын көзөмөлдөңүз:
kubectl get pods -l=app=go-prom-app -w
Келгиле, буйрукту колдонуп жүктү көбөйтөлү:
./hey -n 2000 http://localhost:8080/test
Бир аз убакыт өткөндөн кийин, сиз HPA жайылтуу масштабын жана жаңы подкасттарды ишке киргизгенин көрөсүз. Төмөнкүлөрдү текшерүү үчүн HPAңызды текшериңиз:
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
Эгерде жүк ыраатсыз болсо, жайгаштыруу бир гана поддон иштегенге чейин кыскарат. Эгер сиз чыныгы метриканы текшергиңиз келсе (PromQL сурамы менен кайтарылган), анда буйрукту колдонуңуз:
//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
жыйынтыктоо
KEDA сизге тышкы метрикалардын маалыматтарынын негизинде Kubernetes жайылтууларыңызды автоматтык түрдө масштабдоого (нөлгө/нөлгө) мүмкүндүк берет. Мисалы, Prometheus метрикасынын негизинде, Редистеги кезектин узундугу, Кафка темасындагы керектөөчү күтүү.
KEDA тышкы булак менен интеграцияланат жана ошондой эле анын метрикасын Metrics Server аркылуу Horizontal Pod Autoscalerге берет.