Automatické škálování aplikací Kubernetes pomocí Prometheus a KEDA

Automatické škálování aplikací Kubernetes pomocí Prometheus a KEDABalloon Man od Cimuanos

Škálovatelnost je klíčovým požadavkem pro cloudové aplikace. S Kubernetes je škálování aplikace stejně jednoduché, jako zvýšení počtu replik pro odpovídající nasazení nebo ReplicaSet — ale je to ruční proces.

Kubernetes umožňuje automaticky škálovat aplikace (to znamená Pod v nasazení nebo ReplicaSet) deklarativním způsobem s použitím specifikace Horizontal Pod Autoscaler. Výchozí kritérium pro automatické škálování jsou metriky využití CPU (metriky zdrojů), ale lze integrovat vlastní metriky a metriky poskytované zvenčí.

Tým Kubernetes aaS od Mail.ru přeložila článek o tom, jak používat externí metriky pro automatické škálování aplikace Kubernetes. Aby ukázal, jak to funguje, autor používá metriky HTTP přístupových požadavků, které jsou shromažďovány pomocí Prometheus.

Místo horizontálního automatického škálování podů se používá Kubernetes Event Driven Autoscaling (KEDA) — open-source operátor Kubernetes. Ten se původně integruje s Horizontal Pod Autoscaler, aby zajistil plynulé automatické škálování (včetně do / z nuly) pro pracovních zátěže řízené událostmi. Kód je dostupný na GitHub.

Krátký přehled fungování systému

Automatické škálování aplikací Kubernetes pomocí Prometheus a KEDA

Na schématu je stručný popis toho, jak vše funguje:

  1. Aplikace poskytuje metriky počtu přístupů k HTTP ve formátu Prometheus.
  2. Prometheus je nastaven na shromažďování těchto ukazatelů.
  3. Skladač Prometheus v KEDA je nastaven na automatické škálování aplikace na základě počtu přístupů k HTTP.

Nyní podrobně popíšu každý prvek.

KEDA a Prometheus

Prometheus je open-source nástroj pro monitorování a upozorňování systémů, části Cloud Native Computing Foundation. Shromažďuje metriky z různých zdrojů a ukládá je ve formě časových řad. Pro vizualizaci dat lze použít Grafana nebo jiné vizualizační nástroje pracující s API Kubernetes.

KEDA podporuje koncept skaleru — působí jako most mezi KEDA a externím systémem. Implementace skaleru je specifická pro každý cílový systém a extrahuje z něj data. Poté KEDA tato data používá k řízení automatického škálování.

Scaleři podporují několik zdrojů dat, například Kafka, Redis, Prometheus. To znamená, že KEDA lze použít pro automatické škálování nasazení Kubernetes, přičemž metriky Prometheus slouží jako kritéria.

Testovací aplikace

Testovací aplikace v Golangu poskytuje přístup přes HTTP a vykonává dvě důležité funkce:

  1. Používá klientskou knihovnu Prometheus Go pro instrumentaci aplikace a poskytování metriky http_requests, která obsahuje čítač dotazů. Konečný bod, kde jsou metriky Prometheus dostupné, se nachází na URI /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "počet http dotazů",
       })
    
  2. Na žádost GET aplikace zvyšuje hodnotu klíče (access_count) v Redis. To je jednoduchý způsob, jak vykonat práci jako součást HTTP zpracovatele a také ověřit metriky Prometheus. Hodnota metriky by měla být stejná jako hodnota access_count v 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("Nelze zvýšit Redis čítač", err)
                   os.Exit(1)
               }
               resp := "Přístup na " + time.Now().String() + "nPočet přístupů " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

Aplikace je nasazena v Kubernetes přes Nasazení. Také je vytvořena služba ClusterIP, která umožňuje serveru Prometheus získávat metriky aplikace.

Tady manifest nasazení pro aplikaci.

Server Prometheus

Manifest nasazení Prometheus se skládá z:

  • ConfigMap — pro předání konfigurace Prometheus;
  • Nasazení — pro nasazení Prometheus v Kubernetes clusteru;
  • ClusterIP — služba pro přístup k UI Prometheus;
  • ClusterRole, ClusterRoleBinding a ServiceAccount — pro práci s automatickým objevováním služeb v Kubernetes (Auto-discovery).

Tady manifest pro spuštění Prometheus.

KEDA Prometheus ScaledObject

Scaleř působí jako most mezi KEDA a externím systémem, ze kterého je třeba získat metriky. ScaledObject — konfigurovatelný zdroj, který je třeba nasadit pro synchronizaci nasazení se zdrojem událostí, v tomto případě s Prometheus.

ScaledObject obsahuje informace o škálování nasazení, metadata o zdroji události (například tajemství pro připojení, název fronty), interval dotazování, dobu zotavení a další údaje. Vede k odpovídajícímu zdroji automatického škálování (definice HPA) pro škálování nasazení.

Když objekt ScaledObject odstranění odpovídajícího určení HPA se vymaže.

Tady je definice ScaledObject pro náš příklad, kde se používá škálovač 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]))

Mějte na paměti následující body:

  1. Ukazuje na Nasazení s názvem go-prom-app.
  2. Typ spouštěče — Prometheus. Adresa serveru Prometheus je uvedena spolu s názvem metriky, prahovou hodnotou a dotazem PromQL, který bude použit. Dotaz PromQL — sum(rate(http_requests[2m])).
  3. Podle pollingInterval, KEDA dotazuje cílový stav u Prometheus každých patnáct sekund. Podporován je minimálně jeden pod (minReplicaCount), zatímco maximální počet podů nesmí přesáhnout maxReplicaCount v tomto příkladu — deset.

Může být nastaveno minReplicaCount na nulu. V takovém případě KEDA aktivuje nasazení z nuly na jeden a pak poskytne HPA pro další automatické škálování. Může být také zmenšeno, tedy škálováno z jednoho na nulu. V případě, že jsme nezvolili nulu, protože se jedná o HTTP službu, nikoli systém na žádost.

Kouzelné uvnitř automatického škálování

Prahová hodnota se používá jako spouštěč pro škálování nasazení. V našem příkladu dotaz PromQL sum(rate (http_requests [2m])) vrací agregovanou hodnotu rychlosti HTTP požadavků (počet požadavků za sekundu), měřenou za poslední dvě minuty.

Jelikož je prahová hodnota tři, bude existovat jeden pod, dokud je hodnota sum(rate (http_requests [2m])) méně než tři. Pokud hodnota vzroste, přidá se další pod vždy, když sum(rate (http_requests [2m])) vzroste o tři. Například, pokud se hodnota pohybuje od 12 do 14, pak bude počet podů čtyři.

Teď si to pojďme zkusit nastavit!

Předběžné nastavení

Všechno, co potřebujete, je cluster Kubernetes a nakonfigurovaný nástroj kubectl. V tomto příkladu se používá cluster minikube, ale můžete použít jakýkoli jiný. Pro nastavení clustru si můžete prohlédnout průvodce.

Nainstalujte poslední verzi na 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/

Nainstalujte kubectl, abyste získali přístup k clustru Kubernetes.

Nainstalujte poslední verzi na 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

Instalace KEDA

KEDA můžete nasadit několika způsoby, které jsou uvedeny v dokumentaci. Používám monolitní YAML:

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

KEDA a její komponenty se instalují do jmenného prostoru keda. Příkaz pro kontrolu:

kubectl get pods -n keda

Počkejte, až se pod KEDA Operator spustí — přejde do Běžného stavu. A poté pokračujte.

Instalace Redis pomocí Helm

Pokud nemáte nainstalovaný Helm, využijte toto vedení. Příkaz pro instalaci na Mac:

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

helm init inicializuje místní rozhraní příkazového řádku a také instaluje Tiller do klastru Kubernetes.

kubectl get pods -n kube-system | grep tiller

Počkejte, až převede pod Tiller do stavu Běžný.

Poznámka překladatele: Autor používá Helm@2, který vyžaduje instalaci serverové komponenty Tiller. Nyní je aktuální Helm@3, pro něj serverová část není potřeba.

Po instalaci Helmu pro spuštění Redis stačí jeden příkaz:

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

Ujistěte se, že Redis byl úspěšně spuštěn:

kubectl get pods/redis-server-master-0

Počkejte, až pod Redis přejde do stavu Dokončeno.

Nasazení aplikace

Příkaz pro nasazení:

kubectl apply -f go-app.yaml

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

Zkontrolujte, že vše bylo spuštěno:

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

Počkejte, až Redis přejde do stavu Dokončeno.

Nasazení serveru Prometheus

Manifest Prometheus používá Kubernetes Service Discovery pro Prometheus. Umožňuje dynamicky objevovat pod aplikace na základě štítku služby.

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

Pro nasazení:

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

Zkontrolujte, že vše bylo spuštěno:

kubectl get pods -l=app=prometheus-server

Počkejte, až pod Prometheus přejde do stavu Dokončeno.

Použijte kubectl port-forward pro přístup k uživatelskému rozhraní Prometheus (nebo serveru API) na adrese http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

Nasazení konfigurace automatického škálování KEDA

Příkaz pro vytvoření ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

Zkontrolujte logy operátora KEDA:

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

Výsledek vypadá přibližně takto:

time="2019-10-15T09:38:28Z" level=info msg="Sleduji ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Vytvořil HPA s 
namespace default a jménem keda-hpa-go-prom-app"

Zkontrolujte pod aplikace. Měla by běžet jedna instance, protože minReplicaCount je rovno 1:

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

Zkontrolujte, že prostředek HPA byl úspěšně vytvořen:

kubectl get hpa

Měli byste vidět něco jako:

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

Kontrola dostupnosti: přístup k aplikaci

Pro přístup k REST endpointu naší aplikace spusťte:

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

Nyní můžete přistupovat k aplikaci Go pomocí adresy http://localhost:8080. K tomu proveďte následující příkaz:

curl http://localhost:8080/test

Výsledek vypadá přibližně takto:

Přístupno dne 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Počet přístupů 1

V této fázi také zkontrolujte Redis. Uvidíte, že klíč access_count se zvýšil na 1:

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

Ujistěte se, že hodnota metriky http_requests je stejné:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests počet http požadavků
# TYPE http_requests counter
http_requests 1

Generování zátěže

Budeme používat hey — nástroj pro generování zátěže:

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

Můžete si také stáhnout nástroj pro Linux nebo Windows.

Spusťte jej:

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

Nástroj ve výchozím nastavení odesílá 200 požadavků. To lze ověřit pomocí metrik Prometheus i Redis.

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests počet http požadavků
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201

Potvrďte hodnotu skutečné metriky (vrácené dotazem 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"]}]}}

V tomto případě je skutečný výsledek roven 1,686057971014493 a zobrazuje se v poli value. To není dost pro škálování, protože stanovený práh je rovný 3.

Více zátěže!

V novém terminálu sledujte počet podů aplikace:

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

Zvyšte zátěž pomocí příkazu:

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

Za chvíli uvidíte, že HPA škáluje nasazení a spouští nové pody. Zkontrolujte HPA, abyste se o tom ujistili:

kubectl get hpa
NÁZEV                   ODKAZ                CÍLE         MINPODS   MAXPODS   REPLIKY   VĚK
keda-hpa-go-prom-app   Nasazení/go-prom-app   1830m/3 (prům.)   1         10        6          4m22s

Pokud je zatížení nepravidelné, nasazení se sníží na bod, kdy běží pouze jeden pod. Pokud chcete zkontrolovat skutečnou metriku (vrácenou dotazem PromQL), použijte příkaz:

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

Vymazat

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

Závěr

KEDA umožňuje automaticky škálovat vaše nasazení Kubernetes (do/od nuly) na základě údajů z externích metrik. Například na základě metrik Prometheus, délky fronty v Redis, zpoždění spotřebitele ve vlákně Kafka.

KEDA provádí integraci s externím zdrojem a také poskytuje jeho metriky prostřednictvím Metrics Server pro Horizontal Pod Autoscaler.

Hodně štěstí!

Co dalšího si přečíst:

  1. Nejlepší postupy a doporučení pro spuštění kontejnerů a Kubernetes v produkčních prostředích.
  2. 90+ užitečných nástrojů pro Kubernetes: nasazení, správa, monitoring, bezpečnost a další.
  3. Náš kanál Kolem Kubernetes na Telegramu.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster