Aplikasi Autoscaling Kubernetes nganggo Prometheus sareng KEDA

Aplikasi Autoscaling Kubernetes nganggo Prometheus sareng KEDABalon Man ku Cimuanos

Skalabilitas mangrupikeun syarat konci pikeun aplikasi awan. Kalayan Kubernetes, skala aplikasi saderhana sapertos nambahan jumlah réplika pikeun panyebaran anu pas atanapi ReplicaSet - tapi éta prosés manual.

Kubernetes ngamungkinkeun aplikasi sacara otomatis diskalakeun (nyaéta Pods dina panyebaran atanapi ReplicaSet) dina cara déklaratif ngagunakeun spésifikasi Horizontal Pod Autoscaler. Kriteria standar pikeun skala otomatis nyaéta métrik pamakean CPU (métrik sumberdaya), tapi anjeun tiasa ngahijikeun métrik khusus sareng anu disayogikeun ku luar.

regu Kubernetes aaS ti Mail.ru narjamahkeun artikel ngeunaan cara ngagunakeun métrik éksternal pikeun otomatis skala aplikasi Kubernetes. Pikeun nunjukkeun kumaha sadayana jalan, panulis nganggo métrik pamundut aksés HTTP, anu dikumpulkeun nganggo Prometheus.

Gantina autoscaling horizontal pods, Kubernetes Event Driven Autoscaling (KEDA) dipaké, operator Kubernetes open source. Éta ngahijikeun asli sareng Horizontal Pod Autoscaler pikeun nyayogikeun autoscaling anu lancar (kalebet ka / ti enol) pikeun beban kerja anu didorong ku acara. Kode sadia di GitHub.

Tinjauan ringkes sistem

Aplikasi Autoscaling Kubernetes nganggo Prometheus sareng KEDA

Diagram nembongkeun katerangan ringkes kumaha sagalana jalan:

  1. Aplikasina nyayogikeun métrik count hit HTTP dina format Prometheus.
  2. Prometheus dikonpigurasi pikeun ngumpulkeun métrik ieu.
  3. Prometheus scaler di KEDA dikonpigurasi pikeun otomatis skala aplikasi dumasar kana jumlah HTTP hits.

Ayeuna kuring bakal nyaritakeun sacara rinci ngeunaan unggal unsur.

KEDA jeung Prometheus

Prometheus mangrupikeun ngawaskeun sistem open source sareng toolkit alerting, bagian Yayasan Komputasi Asli Awan. Kumpulkeun métrik tina sababaraha sumber sareng simpen salaku data séri waktos. Pikeun visualize data anjeun tiasa nganggo grafana atawa alat visualisasi séjén nu bisa dipaké jeung API Kubernetes.

KEDA ngadukung konsép scaler - éta janten jembatan antara KEDA sareng sistem éksternal. Palaksanaan scaler khusus pikeun unggal sistem target sareng nimba data tina éta. KEDA teras nganggo aranjeunna pikeun ngontrol skala otomatis.

Scalers ngarojong sababaraha sumber data, contona, Kafka, Redis, Prometheus. Nyaéta, KEDA tiasa dianggo pikeun otomatis skala penyebaran Kubernetes nganggo métrik Prometheus salaku kriteria.

Aplikasi tés

Aplikasi uji Golang nyayogikeun aksés via HTTP sareng ngalaksanakeun dua fungsi penting:

  1. Ngagunakeun perpustakaan klien Prometheus Go pikeun instrumen aplikasi tur nyadiakeun métrik http_requests, nu ngandung jumlah hit. Titik akhir dimana métrik Prometheus sayogi aya di URI /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. Dina respon kana pamundut a GET aplikasi nambahan nilai konci (access_count) dina Redis. Ieu mangrupikeun cara anu gampang pikeun ngalakukeun padamelan salaku bagian tina panangan HTTP sareng ogé pariksa métrik Prometheus. Nilai métrik kudu sarua jeung nilai access_count di Redis.
    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)
       }
    

Aplikasi ieu disebarkeun ka Kubernetes via Deployment. A jasa ogé dijieun ClusterIP, Hal ieu ngamungkinkeun server Prometheus pikeun ménta metrics aplikasi.

di dieu deployment manifest pikeun aplikasi.

Server Prometheus

The Prometheus deployment manifest diwangun ku:

  • ConfigMap - pikeun mindahkeun config Prometheus;
  • Deployment - pikeun nyebarkeun Prometheus dina klaster Kubernetes;
  • ClusterIP - jasa pikeun aksés ka UI Prometheus;
  • ClusterRole, ClusterRoleBinding и ServiceAccount — pikeun deteksi otomatis jasa dina Kubernetes (Papanggihan otomatis).

di dieu manifest pikeun ngajalankeun Prometheus.

KEDA Prometheus ScaledObject

Scaler bertindak salaku sasak antara KEDA sareng sistem éksternal dimana métrik kedah dicandak. ScaledObject mangrupakeun sumberdaya custom nu kudu deployed pikeun nyingkronkeun deployment kalawan sumber acara, dina hal ieu Prometheus.

ScaledObject ngandung inpormasi skala penyebaran, metadata sumber acara (sapertos rahasia sambungan, nami antrian), interval polling, periode pamulihan, sareng data sanésna. Éta nyababkeun sumber daya autoscaling (definisi HPA) pikeun skala panyebaran.

Nalika hiji obyék ScaledObject dihapus, definisi HPA saluyu diberesihan.

Ieu definisi ScaledObject pikeun conto urang, ngagunakeun scaler a 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]))

Perhatikeun titik-titik di handap ieu:

  1. Anjeunna nunjuk ka Deployment Kalawan ngaran go-prom-app.
  2. Jenis pemicu - Prometheus. Alamat server Prometheus disebatkeun sareng nami métrik, bangbarung sareng pamundut PromQL, anu bakal dianggo. Patarosan PromQL - sum(rate(http_requests[2m])).
  3. nurutkeun pollingInterval,KEDA menta udagan ti Prometheus unggal lima belas detik. Sahenteuna hiji di handap (minReplicaCount), sarta jumlah maksimum pods teu ngaleuwihan maxReplicaCount (dina conto ieu - sapuluh).

Bisa dipasang minReplicaCount sarua jeung nol. Dina hal ieu, KEDA ngaktifkeun panyebaran nol-ka-hiji teras ngalaan HPA pikeun skala otomatis salajengna. Urutan sabalikna oge mungkin, nyaeta, skala ti hiji nepi ka enol. Dina conto, kami henteu milih nol sabab ieu mangrupikeun jasa HTTP sareng sanés sistem paménta.

The magic jero autoscaling

bangbarung dipaké salaku pemicu pikeun skala deployment. Dina conto urang, pamundut PromQL sum(rate (http_requests [2m])) mulih laju pamundut HTTP aggregated (paménta per detik), diukur dina dua menit panungtungan.

Kusabab nilai bangbarung nyaéta tilu, hartina bakal aya hiji handapeun bari nilai sum(rate (http_requests [2m])) kirang ti tilu. Lamun nilai naek, hiji sub tambahan ditambahkeun unggal waktu sum(rate (http_requests [2m])) ngaronjat ku tilu. Salaku conto, upami nilaina tina 12 dugi ka 14, maka jumlah polong nyaéta opat.

Ayeuna hayu urang coba nyetél éta!

prasetél

Sadaya anu anjeun peryogikeun nyaéta klaster Kubernetes sareng utilitas anu dikonpigurasi kubectl. Conto ieu ngagunakeun klaster minikube, tapi anjeun tiasa nyandak anu sanés. Pikeun masang klaster aya kapamimpinan.

Pasang versi panganyarna dina 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/

Masang kubectlpikeun ngakses klaster Kubernetes.

Pasang versi panganyarna dina 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

instalasi KEDA

Anjeun tiasa nyebarkeun KEDA ku sababaraha cara, aranjeunna didaptarkeun dina dokuméntasi. Abdi nganggo YAML monolithic:

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

KEDA sareng komponenana dipasang dina rohangan ngaran keda. Paréntah pikeun pariksa:

kubectl get pods -n keda

Antosan Operator KEDA ngamimitian sareng angkat ka Running State. Sarta sanggeus éta, nuluykeun.

Masang Redis nganggo Helm

Upami anjeun teu acan dipasang Helm, paké ieu kapamimpinan. Paréntah pikeun masang dina Mac:

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

helm init initializes panganteur garis paréntah lokal sarta ogé installs Tiller ka klaster Kubernetes.

kubectl get pods -n kube-system | grep tiller

Ngadagoan Tiller pod asup kana kaayaan Ngajalankeun.

Catetan panarjamah: Panulis ngagunakeun Helm @ 2, nu merlukeun komponén server Tiller dipasang. Ayeuna Helm@3 relevan, teu merlukeun bagian server.

Saatos masang Helm, hiji paréntah cekap pikeun ngamimitian Redis:

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

Pastikeun yén Redis parantos suksés:

kubectl get pods/redis-server-master-0

Ngadagoan Redis lebet kana kaayaan Running.

Panyebaran Aplikasi

Paréntah panyebaran:

kubectl apply -f go-app.yaml

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

Pariksa yén sagalana geus dimimitian:

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

Ngadagoan Redis asup ka kaayaan Running.

Deploying a Prometheus Server

The Prometheus manifest migunakeun Papanggihan Layanan Kubernetes pikeun Prometheus. Hal ieu ngamungkinkeun kapanggihna dinamis pods aplikasi dumasar kana labél jasa.

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

Pikeun nyebarkeun:

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

Pariksa yén sagalana geus dimimitian:

kubectl get pods -l=app=prometheus-server

Ngadagoan Prometheus lebet kana kaayaan Running.

pamakean kubectl port-forward pikeun ngakses panganteur pamaké Prometheus (atawa server API) di http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

Deploying KEDA Autoscaling Konfigurasi

Paréntah nyieun ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Pariksa log operator KEDA:

KEDA_POD_NAME=$(kubectl get pods -n keda 
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda

Hasilna sigana sapertos kieu:

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"

Pariksa dina aplikasi. Hiji conto kudu ngajalankeun sabab minReplicaCount sarua 1:

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

Pastikeun yén sumber daya HPA suksés dijieun:

kubectl get hpa

Anjeun kedah ningali sapertos kieu:

NAME                   REFERENCE                TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (avg)   1         10        1          45s

Cék kaséhatan: aksés aplikasi

Pikeun ngaksés titik tungtung REST aplikasi kami, jalankeun:

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

Anjeun ayeuna tiasa ngaksés aplikasi Go anjeun nganggo alamatna http://localhost:8080. Jang ngalampahkeun ieu, ngajalankeun paréntah:

curl http://localhost:8080/test

Hasilna sigana sapertos kieu:

Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Access count 1

Dina titik ieu ogé pariksa Redis. Anjeun bakal ningali éta konci access_count ngaronjat jadi 1:

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"

Pastikeun nilai métrik téh http_requests sami:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1

Nyiptakeun beban

Urang bakal anggo hey - utiliti pikeun ngahasilkeun beban:

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

Anjeun oge bisa ngundeur utiliti pikeun Linux atawa Windows.

Jalankeun éta:

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

Sacara standar, utilitas ngirim 200 pamundut. Anjeun tiasa pariksa ieu nganggo métrik Prometheus ogé 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

Validasi nilai métrik sabenerna (dipulangkeun ku pamundut 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"]}]}}

Dina hal ieu, hasilna sabenerna 1,686057971014493 sarta dipintonkeun dina widang value. Ieu henteu cekap pikeun skala, sabab ambang anu kami setel nyaéta 3.

Langkung beban!

Dina terminal anyar, monitor jumlah pods aplikasi:

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

Hayu urang ningkatkeun beban nganggo paréntah:

./hey -n 2000 http://localhost:8080/test

Sanggeus sababaraha waktu, anjeun bakal nempo HPA skala deployment jeung launching pods anyar. Pariksa HPA anjeun pikeun mastikeun:

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

Upami bebanna henteu konsisten, panyebaranna bakal dikirangan dugi ka ngan ukur hiji pod anu ngajalankeun. Upami anjeun hoyong pariksa métrik anu saleresna (dipulangkeun ku pamundut PromQL), teras nganggo paréntah:

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

Beberesih

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

kacindekan

KEDA ngidinan Anjeun pikeun otomatis skala deployments Kubernetes Anjeun (ka/ti enol) dumasar kana data ti metrics éksternal. Contona, dumasar kana métrik Prometheus, panjang antrian di Redis, latency konsumen dina topik Kafka.

KEDA ngahijikeun sareng sumber éksternal sareng ogé nyayogikeun métrikna ngalangkungan Metrics Server ka Horizontal Pod Autoscaler.

Ayaan!

Naon deui anu dibaca:

  1. Praktek Pangsaéna sareng Praktek Pangsaéna pikeun Ngajalankeun Wadah sareng Kubernetes di Lingkungan Produksi.
  2. 90+ Pakakas Mangpaat pikeun Kubernetes: Deployment, Management, Monitoring, Security and More.
  3. Saluran kami Kira-kira Kubernetes di Telegram.

sumber: www.habr.com

Tambahkeun komentar