Скалабилност је кључни захтев за апликације у облаку. Уз Кубернетес, скалирање апликације је једноставно као повећање броја реплика за одговарајућу примену или ReplicaSet - али то је ручни процес.
Кубернетес омогућава да се апликације аутоматски скалирају (тј. Подови у примени или ReplicaSet) на декларативни начин користећи спецификацију Хоризонтал Под Аутосцалер. Подразумевани критеријум за аутоматско скалирање је метрика коришћења ЦПУ-а (метрика ресурса), али можете интегрисати прилагођене и екстерно обезбеђене метрике.
Тим Кубернетес ааС са Маил.ру превео је чланак о томе како да користите екстерне метрике за аутоматско скалирање Кубернетес апликације. Да би показао како све функционише, аутор користи метрике ХТТП захтева за приступ, које се прикупљају помоћу Прометеја.
Уместо хоризонталног аутоматског скалирања подова, користи се Кубернетес Евент Дривен Аутосцалинг (КЕДА), Кубернетес оператер отвореног кода. Он се природно интегрише са Хоризонтал Под Аутосцалер како би обезбедио беспрекорно аутоматско скалирање (укључујући до/од нуле) за радна оптерећења заснована на догађајима. Код доступан на ГитХуб.
Кратак преглед система
Дијаграм приказује кратак опис како све функционише:
Апликација пружа ХТТП метрику броја погодака у Прометхеус формату.
Прометхеус је конфигурисан да прикупља ове метрике.
Прометхеус скалер у КЕДА-и је конфигурисан да аутоматски скалира апликацију на основу броја ХТТП погодака.
Сада ћу вам детаљно рећи о сваком елементу.
КЕДА и Прометеј
Прометхеус је комплет алата за праћење и упозорење отвореног кода, део Цлоуд Нативе Цомпутинг Фоундатион. Прикупља метрике из различитих извора и складишти их као податке временске серије. За визуелизацију података можете користити Графана или друге алатке за визуелизацију које раде са Кубернетес АПИ-јем.
КЕДА подржава концепт скалера – он делује као мост између КЕДА-е и спољашњег система. Имплементација скалера је специфична за сваки циљни систем и извлачи податке из њега. КЕДА их затим користи за контролу аутоматског скалирања.
Скалери подржавају више извора података, на пример, Кафка, Редис, Прометеј. То јест, КЕДА се може користити за аутоматско скалирање Кубернетес имплементације користећи Прометхеус метрику као критеријум.
Тест апликација
Апликација за тестирање Голанг обезбеђује приступ преко ХТТП-а и обавља две важне функције:
Користи клијентску библиотеку Прометхеус Го да инструментира апликацију и обезбеди метрику хттп_рекуестс, која садржи број погодака. Крајња тачка на којој су доступне Прометхеус метрике налази се на УРИ-ју /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Као одговор на захтев GET апликација повећава вредност кључа (access_count) у Редису. Ово је једноставан начин да обавите посао као део ХТТП руковаоца и да проверите Прометхеус метрику. Вредност метрике мора бити иста као и вредност access_count у Редису.
Скалер делује као мост између КЕДА-е и екстерног система из којег треба добити метрику. ScaledObject је прилагођени ресурс који треба да се примени да би се имплементација синхронизовала са извором догађаја, у овом случају Прометеј.
ScaledObject садржи информације о скалирању примене, метаподатке извора догађаја (као што су тајне везе, име реда), интервал анкетирања, период опоравка и друге податке. Резултат је одговарајући ресурс за аутоматско скалирање (ХПА дефиниција) за скалирање примене.
Када објекат ScaledObject се брише, одговарајућа ХПА дефиниција се брише.
Ево дефиниције ScaledObject за наш пример, користи скалер Prometheus:
Тип окидача - Prometheus. Адреса Прометхеус сервера се помиње заједно са именом метрике, прагом и ПромКЛ упит, који ће се користити. ПромКЛ упит - sum(rate(http_requests[2m])).
Према pollingInterval,КЕДА тражи мету од Прометеја сваких петнаест секунди. Најмање један испод (minReplicaCount), а максимални број махуна не прелази maxReplicaCount (у овом примеру - десет).
Може се инсталирати minReplicaCount једнака нули. У овом случају, КЕДА активира примену нула према један, а затим излаже ХПА за даље аутоматско скалирање. Могућ је и обрнути редослед, односно скалирање од један до нуле. У примеру, нисмо изабрали нулу јер је ово ХТТП услуга, а не систем на захтев.
Магија унутар аутоматског скалирања
Праг се користи као покретач за скалирање примене. У нашем примеру, ПромКЛ упит sum(rate (http_requests [2m])) враћа збирну стопу ХТТП захтева (захтева у секунди), мерену у последња два минута.
Пошто је вредност прага три, то значи да ће бити један испод док је вредност sum(rate (http_requests [2m])) мање од три. Ако се вредност повећа, сваки пут се додаје додатни суб sum(rate (http_requests [2m])) повећава за три. На пример, ако је вредност од 12 до 14, онда је број махуна четири.
Хајде сада да покушамо да га поставимо!
Пре-сеттинг
Све што вам треба је Кубернетес кластер и конфигурисани услужни програм 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 за приступ Прометхеус корисничком интерфејсу (или АПИ серверу) на 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
Проверите да ли је ХПА ресурс успешно креиран:
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
Провера здравља: приступ апликацији
Да бисте приступили РЕСТ крајњој тачки наше апликације, покрените:
Сада можете да приступите својој Го апликацији користећи адресу 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
У овом тренутку такође проверите Редис. Видећете да је кључ 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
Након неког времена, видећете како ХПА скалира примену и покреће нове подове. Проверите свој ХПА да бисте били сигурни:
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
Ако је оптерећење недоследно, примена ће бити смањена до тачке у којој ради само један модул. Ако желите да проверите стварну метрику (коју је вратио ПромКЛ упит), онда користите команду:
//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
Закључак
КЕДА вам омогућава да аутоматски скалирате своје Кубернетес имплементације (на/од нуле) на основу података из спољних метрика. На пример, на основу Прометхеус метрике, дужине реда у Редис-у, кашњења потрошача у Кафка теми.
КЕДА се интегрише са екстерним извором и такође обезбеђује своје метрике преко Метрицс Сервер-а до Хоризонтал Под Аутосцалер.