Аутоматско скалирање Кубернетес апликација користећи Прометхеус и КЕДА

Аутоматско скалирање Кубернетес апликација користећи Прометхеус и КЕДАБалон Ман од Цимуанос

Скалабилност је кључни захтев за апликације у облаку. Уз Кубернетес, скалирање апликације је једноставно као повећање броја реплика за одговарајућу примену или ReplicaSet - али то је ручни процес.

Кубернетес омогућава да се апликације аутоматски скалирају (тј. Подови у примени или ReplicaSet) на декларативни начин користећи спецификацију Хоризонтал Под Аутосцалер. Подразумевани критеријум за аутоматско скалирање је метрика коришћења ЦПУ-а (метрика ресурса), али можете интегрисати прилагођене и екстерно обезбеђене метрике.

Тим Кубернетес ааС са Маил.ру превео је чланак о томе како да користите екстерне метрике за аутоматско скалирање Кубернетес апликације. Да би показао како све функционише, аутор користи метрике ХТТП захтева за приступ, које се прикупљају помоћу Прометеја.

Уместо хоризонталног аутоматског скалирања подова, користи се Кубернетес Евент Дривен Аутосцалинг (КЕДА), Кубернетес оператер отвореног кода. Он се природно интегрише са Хоризонтал Под Аутосцалер како би обезбедио беспрекорно аутоматско скалирање (укључујући до/од нуле) за радна оптерећења заснована на догађајима. Код доступан на ГитХуб.

Кратак преглед система

Аутоматско скалирање Кубернетес апликација користећи Прометхеус и КЕДА

Дијаграм приказује кратак опис како све функционише:

  1. Апликација пружа ХТТП метрику броја погодака у Прометхеус формату.
  2. Прометхеус је конфигурисан да прикупља ове метрике.
  3. Прометхеус скалер у КЕДА-и је конфигурисан да аутоматски скалира апликацију на основу броја ХТТП погодака.

Сада ћу вам детаљно рећи о сваком елементу.

КЕДА и Прометеј

Прометхеус је комплет алата за праћење и упозорење отвореног кода, део Цлоуд Нативе Цомпутинг Фоундатион. Прикупља метрике из различитих извора и складишти их као податке временске серије. За визуелизацију података можете користити Графана или друге алатке за визуелизацију које раде са Кубернетес АПИ-јем.

КЕДА подржава концепт скалера – он делује као мост између КЕДА-е и спољашњег система. Имплементација скалера је специфична за сваки циљни систем и извлачи податке из њега. КЕДА их затим користи за контролу аутоматског скалирања.

Скалери подржавају више извора података, на пример, Кафка, Редис, Прометеј. То јест, КЕДА се може користити за аутоматско скалирање Кубернетес имплементације користећи Прометхеус метрику као критеријум.

Тест апликација

Апликација за тестирање Голанг обезбеђује приступ преко ХТТП-а и обавља две важне функције:

  1. Користи клијентску библиотеку Прометхеус Го да инструментира апликацију и обезбеди метрику хттп_рекуестс, која садржи број погодака. Крајња тачка на којој су доступне Прометхеус метрике налази се на УРИ-ју /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Као одговор на захтев GET апликација повећава вредност кључа (access_count) у Редису. Ово је једноставан начин да обавите посао као део ХТТП руковаоца и да проверите Прометхеус метрику. Вредност метрике мора бити иста као и вредност access_count у Редису.
    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)
       }
    

Апликација се поставља на Кубернетес преко Deployment. Такође је креиран сервис ClusterIP, омогућава Прометхеус серверу да добије метрику апликације.

ovde је манифест имплементације за апликацију.

Прометхеус Сервер

Манифест распоређивања Прометеја састоји се од:

  • ConfigMap — да пренесете Прометхеус конфигурацију;
  • Deployment — за постављање Прометхеуса у Кубернетес кластер;
  • ClusterIP — сервис за приступ УИ Прометеј;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — за аутоматско откривање услуга у Кубернетесу (Ауто-откривање).

ovde је манифест за покретање Прометеја.

КЕДА Прометеј СцаледОбјецт

Скалер делује као мост између КЕДА-е и екстерног система из којег треба добити метрику. ScaledObject је прилагођени ресурс који треба да се примени да би се имплементација синхронизовала са извором догађаја, у овом случају Прометеј.

ScaledObject садржи информације о скалирању примене, метаподатке извора догађаја (као што су тајне везе, име реда), интервал анкетирања, период опоравка и друге податке. Резултат је одговарајући ресурс за аутоматско скалирање (ХПА дефиниција) за скалирање примене.

Када објекат ScaledObject се брише, одговарајућа ХПА дефиниција се брише.

Ево дефиниције ScaledObject за наш пример, користи скалер 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]))

Узмите у обзир следеће тачке:

  1. Он указује на Deployment Са именом go-prom-app.
  2. Тип окидача - Prometheus. Адреса Прометхеус сервера се помиње заједно са именом метрике, прагом и ПромКЛ упит, који ће се користити. ПромКЛ упит - sum(rate(http_requests[2m])).
  3. Према pollingInterval,КЕДА тражи мету од Прометеја сваких петнаест секунди. Најмање један испод (minReplicaCount), а максимални број махуна не прелази maxReplicaCount (у овом примеру - десет).

Може се инсталирати minReplicaCount једнака нули. У овом случају, КЕДА активира примену нула према један, а затим излаже ХПА за даље аутоматско скалирање. Могућ је и обрнути редослед, односно скалирање од један до нуле. У примеру, нисмо изабрали нулу јер је ово ХТТП услуга, а не систем на захтев.

Магија унутар аутоматског скалирања

Праг се користи као покретач за скалирање примене. У нашем примеру, ПромКЛ упит sum(rate (http_requests [2m])) враћа збирну стопу ХТТП захтева (захтева у секунди), мерену у последња два минута.

Пошто је вредност прага три, то значи да ће бити један испод док је вредност sum(rate (http_requests [2m])) мање од три. Ако се вредност повећа, сваки пут се додаје додатни суб sum(rate (http_requests [2m])) повећава за три. На пример, ако је вредност од 12 до 14, онда је број махуна четири.

Хајде сада да покушамо да га поставимо!

Пре-сеттинг

Све што вам треба је Кубернетес кластер и конфигурисани услужни програм kubectl. Овај пример користи кластер minikube, али можете узети било који други. Да бисте инсталирали кластер постоји вођство.

Инсталирајте најновију верзију на Мац:

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/

Сет кубецтлда бисте приступили Кубернетес кластеру.

Инсталирајте најновију верзију на Мац:

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

КЕДА инсталација

КЕДА можете да примените на неколико начина, они су наведени у документација. Користим монолитни ИАМЛ:

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

КЕДА и његове компоненте су инсталиране у именском простору keda. Команда за проверу:

kubectl get pods -n keda

Сачекајте да се КЕДА оператер покрене и идите на Running State. И након тога наставите.

Инсталирање Редис-а помоћу Хелм-а

Ако немате инсталиран Хелм, користите ово вођство. Команда за инсталирање на Мац:

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

helm init иницијализује интерфејс локалне командне линије и такође се инсталира Tiller у Кубернетес кластер.

kubectl get pods -n kube-system | grep tiller

Сачекајте да Тиллер под уђе у стање Руннинг.

Напомена преводиоца: Аутор користи Хелм@2, који захтева инсталирање компоненте Тиллер сервера. Сада је Хелм@3 релевантан, не захтева серверски део.

Након инсталирања Хелм-а, једна команда је довољна да покренете Редис:

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

Проверите да ли је Редис успешно покренут:

kubectl get pods/redis-server-master-0

Сачекајте да Редис пређе у стање Running.

Примена апликације

Команда за примену:

kubectl apply -f go-app.yaml

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

Проверите да ли је све почело:

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

Сачекајте да Редис уђе у стање Running.

Примена Прометхеус сервера

Манифест Прометеја користи Кубернетес Сервице Дисцовери за Прометхеус. Омогућава динамичко откривање модула апликације на основу ознаке услуге.

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

Распоредити:

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.

kubectl port-forward service/prometheus-service 9090

Примена КЕДА конфигурације за аутоматско скалирање

Наредба за креирање ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Проверите евиденцију оператера КЕДА:

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

Провера здравља: ​​приступ апликацији

Да бисте приступили РЕСТ крајњој тачки наше апликације, покрените:

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

Сада можете да приступите својој Го апликацији користећи адресу 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

Лоад Цреатион

Користићемо хеј — услужни програм за генерисање оптерећења:

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

Такође можете преузети услужни програм за линук или виндовс.

Покрени:

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

Подразумевано, услужни програм шаље 200 захтева. Ово можете да проверите користећи Прометхеус метрику као и Редис.

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

Потврдите вредност стварне метрике (коју је вратио ПромКЛ упит):

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

У овом случају стварни резултат је 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

Ако је оптерећење недоследно, примена ће бити смањена до тачке у којој ради само један модул. Ако желите да проверите стварну метрику (коју је вратио ПромКЛ упит), онда користите команду:

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

Чишћење

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

Закључак

КЕДА вам омогућава да аутоматски скалирате своје Кубернетес имплементације (на/од нуле) на основу података из спољних метрика. На пример, на основу Прометхеус метрике, дужине реда у Редис-у, кашњења потрошача у Кафка теми.

КЕДА се интегрише са екстерним извором и такође обезбеђује своје метрике преко Метрицс Сервер-а до Хоризонтал Под Аутосцалер.

Срећно!

Шта још читати:

  1. Најбоље праксе и најбоље праксе за покретање контејнера и Кубернетеса у производним окружењима.
  2. 90+ корисних алата за Кубернетес: постављање, управљање, надгледање, безбедност и још много тога.
  3. Наш канал Око Кубернетеса у Телеграму.

Извор: ввв.хабр.цом

Додај коментар