Prometheus және KEDA көмегімен Kubernetes қолданбаларын автоматты масштабтау

Prometheus және KEDA көмегімен Kubernetes қолданбаларын автоматты масштабтауСимуаностың әуе шары адамы

Масштабтау бұлтты қолданбалар үшін негізгі талап болып табылады. 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 және KEDA көмегімен Kubernetes қолданбаларын автоматты масштабтау

Диаграмма барлығы қалай жұмыс істейтінінің қысқаша сипаттамасын көрсетеді:

  1. Қолданба Prometheus пішіміндегі HTTP соққылар саны көрсеткіштерін береді.
  2. Прометей осы көрсеткіштерді жинау үшін конфигурацияланған.
  3. KEDA жүйесіндегі Prometheus масштабтау құралы HTTP соққыларының санына негізделген қолданбаны автоматты түрде масштабтау үшін конфигурацияланған.

Енді мен сізге әрбір элемент туралы егжей-тегжейлі айтып беремін.

KEDA және Прометей

Prometheus - бұл ашық бастапқы жүйені бақылау және ескерту құралдары жинағы, бөлігі Cloud Native Computing Foundation. Әртүрлі көздерден көрсеткіштерді жинайды және оларды уақыт қатарларының деректері ретінде сақтайды. Деректерді визуализациялау үшін пайдалануға болады Графана немесе Kubernetes API-мен жұмыс істейтін басқа визуализация құралдары.

KEDA масштабтау концепциясын қолдайды – ол KEDA мен сыртқы жүйе арасындағы көпір қызметін атқарады. Масштабтауды іске асыру әрбір мақсатты жүйеге тән және одан деректерді шығарады. Содан кейін KEDA оларды автоматты масштабтауды басқару үшін пайдаланады.

Масштабтауыштар бірнеше деректер көздерін қолдайды, мысалы, Кафка, Редис, Прометей. Яғни, KEDA шарт ретінде Prometheus метрикасын пайдаланып Kubernetes орналастыруларын автоматты түрде масштабтау үшін пайдаланылуы мүмкін.

Сынақ қолданбасы

Golang сынақ қолданбасы HTTP арқылы қол жеткізуді қамтамасыз етеді және екі маңызды функцияны орындайды:

  1. Прометей Go клиенттік кітапханасын қолданбаны аспаптау және хит санын қамтитын http_requests метрикасын қамтамасыз ету үшін пайдаланады. Prometheus көрсеткіштері қолжетімді соңғы нүкте URI мекенжайында орналасқан /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Өтінімге жауап ретінде GET қолданба кілттің мәнін арттырады (access_count) Redis ішінде. Бұл HTTP өңдегішінің бөлігі ретінде жұмысты орындаудың және Prometheus көрсеткіштерін тексерудің оңай жолы. Көрсеткіш мәні мәнмен бірдей болуы керек 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)
       }
    

Қолданба Kubernetes арқылы орналастырылған Deployment. Сондай-ақ қызмет жасалады ClusterIP, ол Prometheus серверіне қолданба көрсеткіштерін алуға мүмкіндік береді.

осында қолданба үшін орналастыру манифесті.

Prometheus сервері

Прометейді орналастыру манифесті мыналардан тұрады:

  • ConfigMap — Prometheus конфигурациясын тасымалдау үшін;
  • Deployment — Prometheus жүйесін Kubernetes кластерінде орналастыру үшін;
  • ClusterIP — UI Prometheus қол жеткізу қызметі;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — Kubernetes-тегі қызметтерді автоматты түрде анықтау үшін (Авто-ашу).

осында Прометейді басқаруға арналған манифест.

KEDA Prometheus ScaledObject

Масштабтауыш KEDA мен көрсеткіштерді алу қажет сыртқы жүйе арасындағы көпір ретінде әрекет етеді. ScaledObject бұл жағдайда Prometheus оқиға көзімен орналастыруды синхрондау үшін қолдану қажет теңшелетін ресурс болып табылады.

ScaledObject орналастыру масштабтау ақпаратын, оқиға көзі метадеректерін (қосылу құпиялары, кезек атауы сияқты), сұрау аралығын, қалпына келтіру кезеңін және басқа деректерді қамтиды. Ол орналастыруды масштабтау үшін сәйкес автомасштабтау ресурсына (HPA анықтамасы) әкеледі.

Объект болғанда ScaledObject жойылса, сәйкес HPA анықтамасы жойылады.

Міне анықтамасы 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. Prometheus серверінің мекенжайы метрикалық атаумен, шекті мәнмен және көрсетілген PromQL сұрауы, ол қолданылатын болады. PromQL сұрауы - sum(rate(http_requests[2m])).
  3. бойынша 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, бірақ сіз кез келген басқасын ала аласыз. Кластерді орнату үшін бар көшбасшылық.

Mac жүйесінде соңғы нұсқаны орнатыңыз:

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/

Орнату кубектлKubernetes кластеріне қол жеткізу үшін.

Mac жүйесінде соңғы нұсқаны орнатыңыз:

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

KEDA орнату

KEDA-ны бірнеше жолмен орналастыруға болады, олар тізімде берілген құжаттама. Мен монолитті YAML пайдаланамын:

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

KEDA және оның құрамдастары аттар кеңістігіне орнатылған keda. Тексеру пәрмені:

kubectl get pods -n keda

KEDA операторының іске қосылуын күтіңіз және оған өтіңіз Running State. Содан кейін жалғастырыңыз.

Helm көмегімен Redis орнату

Егер сізде Helm орнатылмаған болса, оны пайдаланыңыз көшбасшылық. Mac жүйесінде орнату пәрмені:

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

helm init жергілікті пәрмен жолы интерфейсін инициализациялайды және де орнатады Tiller Кубернетес кластеріне.

kubectl get pods -n kube-system | grep tiller

Tiller pod Running күйіне өтуін күтіңіз.

Аудармашының жазбасы: Автор Tiller сервер компонентін орнатуды талап ететін Helm@2 пайдаланады. Енді Helm@3 өзекті, ол сервер бөлігін қажет етпейді.

Helm орнатқаннан кейін Redis іске қосу үшін бір пәрмен жеткілікті:

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

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.

Prometheus серверін қолдану

Прометей манифестінің қолданылуы Prometheus үшін Kubernetes қызметінің ашылуы. Ол қызмет көрсету белгісіне негізделген қолданба бөлімдерін динамикалық табуға мүмкіндік береді.

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 Prometheus пайдаланушы интерфейсіне (немесе API серверіне) қол жеткізу үшін http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

KEDA автоматты масштабтау конфигурациясын қолдану

Жасау пәрмені ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

KEDA операторының журналдарын тексеріңіз:

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 соңғы нүктесіне қол жеткізу үшін келесіні іске қосыңыз:

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

Енді мекенжайды пайдаланып 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

Жүктеу жасау

Қолданамыз Эй — жүктемені өндіруге арналған утилита:

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

үшін қызметтік бағдарламаны жүктеп алуға да болады Linux немесе Windows.

Оны іске қосыңыз:

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

Әдепкі бойынша қызметтік бағдарлама 200 сұрау жібереді. Мұны Prometheus метрикасын, сондай-ақ Redis көмегімен тексеруге болады.

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

Нақты метриканың мәнін растау (PromQL сұрауы арқылы қайтарылады):

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

Біраз уақыттан кейін сіз 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 сұрауы арқылы қайтарылған) тексергіңіз келсе, пәрменді пайдаланыңыз:

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

қорытынды

KEDA сыртқы көрсеткіштер деректеріне негізделген Kubernetes орналастыруларын (нөлге/нөлден) автоматты түрде масштабтауға мүмкіндік береді. Мысалы, Prometheus метрикасына негізделген, Redis ішіндегі кезек ұзындығы, Кафка тақырыбындағы тұтынушы кідірісі.

KEDA сыртқы көзмен біріктіріледі және сонымен қатар оның метрикасын Metrics сервері арқылы Horizontal Pod Autoscaler бағдарламасына береді.

Сәттілік тілейміз!

Тағы не оқу керек:

  1. Өндірістік орталарда контейнерлер мен кубернеттерді іске қосудың үздік тәжірибелері мен үздік тәжірибелері.
  2. Kubernetes үшін 90+ пайдалы құралдар: орналастыру, басқару, бақылау, қауіпсіздік және т.б.
  3. Telegram-дағы Kubernetes айналасындағы арнамыз.

Ақпарат көзі: www.habr.com

пікір қалдыру