Масштабтау бұлтты қолданбалар үшін негізгі талап болып табылады. Kubernetes көмегімен қолданбаны масштабтау сәйкес орналастыру немесе репликалар санын көбейту сияқты қарапайым. ReplicaSet — бірақ бұл қолмен орындалатын процесс.
Kubernetes қолданбаларды автоматты түрде масштабтауға мүмкіндік береді (мысалы, орналастырудағы Pods немесе ReplicaSet) Horizontal Pod Autoscaler спецификациясын пайдалана отырып, декларативті түрде. Автоматты масштабтаудың әдепкі шарты процессорды пайдалану көрсеткіштері (ресурс көрсеткіштері), бірақ теңшелетін және сырттан берілген көрсеткіштерді біріктіре аласыз.
команда Mail.ru сайтынан Kubernetes aaS Kubernetes қолданбасын автоматты түрде масштабтау үшін сыртқы көрсеткіштерді пайдалану жолы туралы мақаланы аударды. Барлығы қалай жұмыс істейтінін көрсету үшін автор Prometheus көмегімен жиналған HTTP қатынасу сұрауының көрсеткіштерін пайдаланады.
Бөлшектердің көлденең автомасштабтауының орнына Kubernetes Event Driven Autoscaling (KEDA) пайдаланылады, ашық бастапқы Kubernetes операторы. Ол оқиғаға негізделген жұмыс жүктемелері үшін үздіксіз авто масштабтауды (оның ішінде нөлге дейін/нөлден бастап) қамтамасыз ету үшін Horizontal Pod Autoscaler бағдарламасымен табиғи түрде біріктірілген. Код қол жетімді GitHub.
Жүйеге қысқаша шолу
Диаграмма барлығы қалай жұмыс істейтінінің қысқаша сипаттамасын көрсетеді:
Қолданба Prometheus пішіміндегі HTTP соққылар саны көрсеткіштерін береді.
Прометей осы көрсеткіштерді жинау үшін конфигурацияланған.
KEDA жүйесіндегі Prometheus масштабтау құралы HTTP соққыларының санына негізделген қолданбаны автоматты түрде масштабтау үшін конфигурацияланған.
Енді мен сізге әрбір элемент туралы егжей-тегжейлі айтып беремін.
KEDA және Прометей
Prometheus - бұл ашық бастапқы жүйені бақылау және ескерту құралдары жинағы, бөлігі Cloud Native Computing Foundation. Әртүрлі көздерден көрсеткіштерді жинайды және оларды уақыт қатарларының деректері ретінде сақтайды. Деректерді визуализациялау үшін пайдалануға болады Графана немесе Kubernetes API-мен жұмыс істейтін басқа визуализация құралдары.
KEDA масштабтау концепциясын қолдайды – ол KEDA мен сыртқы жүйе арасындағы көпір қызметін атқарады. Масштабтауды іске асыру әрбір мақсатты жүйеге тән және одан деректерді шығарады. Содан кейін KEDA оларды автоматты масштабтауды басқару үшін пайдаланады.
Масштабтауыштар бірнеше деректер көздерін қолдайды, мысалы, Кафка, Редис, Прометей. Яғни, KEDA шарт ретінде Prometheus метрикасын пайдаланып Kubernetes орналастыруларын автоматты түрде масштабтау үшін пайдаланылуы мүмкін.
Сынақ қолданбасы
Golang сынақ қолданбасы HTTP арқылы қол жеткізуді қамтамасыз етеді және екі маңызды функцияны орындайды:
Прометей Go клиенттік кітапханасын қолданбаны аспаптау және хит санын қамтитын http_requests метрикасын қамтамасыз ету үшін пайдаланады. Prometheus көрсеткіштері қолжетімді соңғы нүкте URI мекенжайында орналасқан /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Өтінімге жауап ретінде GET қолданба кілттің мәнін арттырады (access_count) Redis ішінде. Бұл HTTP өңдегішінің бөлігі ретінде жұмысты орындаудың және Prometheus көрсеткіштерін тексерудің оңай жолы. Көрсеткіш мәні мәнмен бірдей болуы керек access_count Редисте.
Қолданба Kubernetes арқылы орналастырылған Deployment. Сондай-ақ қызмет жасалады ClusterIP, ол Prometheus серверіне қолданба көрсеткіштерін алуға мүмкіндік береді.
Масштабтауыш KEDA мен көрсеткіштерді алу қажет сыртқы жүйе арасындағы көпір ретінде әрекет етеді. ScaledObject бұл жағдайда Prometheus оқиға көзімен орналастыруды синхрондау үшін қолдану қажет теңшелетін ресурс болып табылады.
ScaledObject орналастыру масштабтау ақпаратын, оқиға көзі метадеректерін (қосылу құпиялары, кезек атауы сияқты), сұрау аралығын, қалпына келтіру кезеңін және басқа деректерді қамтиды. Ол орналастыруды масштабтау үшін сәйкес автомасштабтау ресурсына (HPA анықтамасы) әкеледі.
Объект болғанда ScaledObject жойылса, сәйкес HPA анықтамасы жойылады.
Міне анықтамасы ScaledObject біздің мысал үшін ол масштабтау құралын пайдаланады Prometheus:
Триггер түрі - Prometheus. Prometheus серверінің мекенжайы метрикалық атаумен, шекті мәнмен және көрсетілген PromQL сұрауы, ол қолданылатын болады. PromQL сұрауы - sum(rate(http_requests[2m])).
бойынша pollingInterval,KEDA әр он бес секунд сайын Прометейден нысананы сұрайды. Кем дегенде біреуі (minReplicaCount) және бөтелкелердің максималды саны аспайды maxReplicaCount (бұл мысалда - он).
Орнатуға болады minReplicaCount нөлге тең. Бұл жағдайда KEDA нөлден бірге орналастыруды белсендіреді және одан әрі автоматты масштабтау үшін HPA жүйесін көрсетеді. Кері тәртіп те мүмкін, яғни бірден нөлге дейін масштабтау. Мысалда біз нөлді таңдамадық, себебі бұл HTTP қызметі, сұраныс бойынша жүйе емес.
Автомасштабтау ішіндегі сиқыр
Шек орналастыруды масштабтау үшін триггер ретінде пайдаланылады. Біздің мысалда PromQL сұрауы sum(rate (http_requests [2m])) соңғы екі минут ішінде өлшенген HTTP сұрауының жиынтық жылдамдығын (секундына сұрау) қайтарады.
Шекті мән үш болғандықтан, бұл мәннің астында біреу болатынын білдіреді sum(rate (http_requests [2m])) үштен аз. Мән өссе, әр жолы қосымша қосымша қосылады sum(rate (http_requests [2m])) үш есе артады. Мысалы, егер мән 12-ден 14-ке дейін болса, онда тармақтардың саны төрт болады.
Енді оны орнатуға тырысайық!
алдын ала орнату
Сізге тек Kubernetes кластері және конфигурацияланған қызметтік бағдарлама қажет kubectl. Бұл мысалда кластер қолданылады minikube, бірақ сіз кез келген басқасын ала аласыз. Кластерді орнату үшін бар көшбасшылық.
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 метрикасына негізделген, Redis ішіндегі кезек ұзындығы, Кафка тақырыбындағы тұтынушы кідірісі.
KEDA сыртқы көзмен біріктіріледі және сонымен қатар оның метрикасын Metrics сервері арқылы Horizontal Pod Autoscaler бағдарламасына береді.