Prometheus болон KEDA ашиглан Kubernetes програмуудыг автоматаар масштаблах

Prometheus болон KEDA ашиглан Kubernetes програмуудыг автоматаар масштаблахCimuanos-ын бүтээсэн бөмбөлөг хүн

Өргөтгөх чадвар нь үүлэн хэрэглээний гол шаардлага юм. Kubernetes-ийн тусламжтайгаар програмыг масштаблах нь тохиромжтой байршуулалт эсвэл хуулбарын тоог нэмэгдүүлэхтэй адил хялбар юм. ReplicaSet - гэхдээ энэ нь гараар хийдэг процесс юм.

Kubernetes нь програмуудыг автоматаар масштаблах боломжийг олгодог (жишээ нь, суулгац дахь Pods эсвэл ReplicaSet) Horizontal Pod Autoscaler тодорхойлолтыг ашиглан тунхаглалын хэлбэрээр. Автомат масштабын өгөгдмөл шалгуур нь CPU ашиглалтын хэмжүүр (нөөцийн хэмжүүр) боловч та захиалгат болон гаднаас өгсөн хэмжигдэхүүнүүдийг нэгтгэж болно.

баг Mail.ru сайтаас Kubernetes aaS Kubernetes програмыг автоматаар масштаблахын тулд гадаад хэмжигдэхүүнийг хэрхэн ашиглах тухай нийтлэлийг орчуулав. Бүх зүйл хэрхэн ажилладагийг харуулахын тулд зохиогч Prometheus ашиглан цуглуулсан HTTP хандалтын хүсэлтийн хэмжигдэхүүнийг ашигладаг.

Pod-ийн хэвтээ автомат масштабын оронд Kubernetes Event Driven Autoscaling (KEDA) нь нээлттэй эхийн Kubernetes операторыг ашигладаг. Энэ нь Horizontal Pod Autoscaler-тай үндсэндээ нэгтгэгдэж, үйл явдалд тулгуурласан ажлын ачааллыг автоматаар масштаблах (тэг хүртэл/тэгээс) хангах боломжтой. Кодыг хаягаар авах боломжтой GitHub.

Системийн товч тойм

Prometheus болон KEDA ашиглан Kubernetes програмуудыг автоматаар масштаблах

Диаграм нь бүх зүйл хэрхэн ажилладаг талаар товч тайлбарыг харуулж байна:

  1. Энэхүү програм нь Prometheus форматаар HTTP цохилтын тоон үзүүлэлтүүдийг өгдөг.
  2. Prometheus нь эдгээр хэмжигдэхүүнүүдийг цуглуулахаар тохируулагдсан.
  3. KEDA дахь Prometheus scaler нь HTTP хандалтын тоонд үндэслэн програмыг автоматаар масштаблахаар тохируулагдсан.

Одоо би элемент бүрийн талаар дэлгэрэнгүй ярих болно.

KEDA ба Прометей

Prometheus бол нээлттэй эхийн системийн хяналт, сэрэмжлүүлгийн хэрэгсэл, хэсэг юм Cloud Native Computing сан. Төрөл бүрийн эх сурвалжаас хэмжигдэхүүнүүдийг цуглуулж, цаг хугацааны цувааны өгөгдөл болгон хадгалдаг. Өгөгдлийг дүрслэхийн тулд та ашиглаж болно Графана эсвэл Kubernetes API-тай ажилладаг бусад дүрслэх хэрэгслүүд.

KEDA нь масштаб хэмжигч гэсэн ойлголтыг дэмждэг - энэ нь KEDA болон гадаад системийн хооронд гүүр болж ажилладаг. Скалерын хэрэгжилт нь зорилтот систем тус бүрт зориулагдсан бөгөөд үүнээс өгөгдлийг гаргаж авдаг. Дараа нь KEDA нь автомат масштабыг хянахын тулд тэдгээрийг ашигладаг.

Scalers нь Кафка, Редис, Прометей гэх мэт олон мэдээллийн эх сурвалжийг дэмждэг. Өөрөөр хэлбэл, KEDA нь Prometheus хэмжигдэхүүнийг шалгуур болгон ашиглан Kubernetes байршуулалтыг автоматаар масштаблахад ашиглаж болно.

Туршилтын програм

Golang тестийн програм нь HTTP-ээр дамжуулан нэвтрэх боломжийг олгодог бөгөөд хоёр чухал үүргийг гүйцэтгэдэг:

  1. Prometheus 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 серверт програмын хэмжүүрийг авах боломжийг олгодог.

энд програмын байршуулалтын манифест.

Прометей сервер

Прометейг байршуулах манифест нь дараахь зүйлээс бүрдэнэ.

  • ConfigMap - Prometheus тохиргоог шилжүүлэх;
  • Deployment — Prometheus-ийг Кубернетес кластерт байрлуулахад;
  • ClusterIP - UI Prometheus руу нэвтрэх үйлчилгээ;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — Кубернетес дэх үйлчилгээг автоматаар илрүүлэхэд зориулагдсан (Авто-ололт).

энд Прометейг ажиллуулах манифест.

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 Query - 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 Kubernetes кластер руу.

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 Service Discovery. Энэ нь үйлчилгээний шошгон дээр тулгуурлан програмын хонхорцог динамик илрүүлэх боломжийг олгодог.

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 нь байршуулалтыг өргөжүүлж, шинэ pods эхлүүлэхийг харах болно. 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 нь гадны хэмжигдэхүүнүүдийн өгөгдөл дээр үндэслэн Кубернетес байршуулалтыг автоматаар (тэг хүртэл/тэгээс) масштаблах боломжийг танд олгоно. Жишээлбэл, Prometheus хэмжигдэхүүн дээр үндэслэсэн, Redis дахь дарааллын урт, Кафка сэдэв дэх хэрэглэгчийн хоцролт.

KEDA нь гадаад эх сурвалжтай нэгдэж, хэмжигдэхүүнээ Metrics Server-ээр дамжуулан Horizontal Pod Autoscaler-д өгдөг.

Амжилт хүсье!

Өөр юу унших вэ:

  1. Үйлдвэрлэлийн орчинд контейнер болон Кубернетес ажиллуулах шилдэг туршлага, шилдэг туршлагууд.
  2. Kubernetes-д зориулсан 90+ хэрэгтэй хэрэгсэл: байршуулалт, удирдлага, хяналт, аюулгүй байдал болон бусад.
  3. Telegram дахь Kubernetes-ийн эргэн тойронд манай суваг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх