
Škálovateľnosť je kľúčová požiadavka pre cloudové aplikácie. S Kubernetes je škálovanie aplikácie rovnako jednoduché, ako zvýšiť počet replik pre príslušné nasadenie alebo ReplicaSet — ale to je ručný proces.
Kubernetes umožňuje automaticky škálovať aplikácie (t.j. Pod v nasadení alebo ReplicaSet) deklaratívnym spôsobom pomocou špecifikácie Horizontal Pod Autoscaler. Predpokladom pre automatické škálovanie sú štandardne metriky využitia CPU (metriky zdrojov), avšak je možné integrovať aj vlastné metriky a metriky poskytované zvonka.
Tím preložila článok o tom, ako používať externé metriky na automatické škálovanie aplikácie Kubernetes. Aby ukázala, ako to funguje, autor používa metriky HTTP dopytov, ktoré sú zhromažďované pomocou Prometheus.
Namiesto horizontálneho automatického škálovania podov sa používa Kubernetes Event Driven Autoscaling (KEDA) — open-source operátor Kubernetes. Pôvodne sa integruje s Horizontal Pod Autoscaler, aby zabezpečil plynulé automatické škálovanie (vrátane škálovania na/od nuly) pre pracovné zaťaženia riadené udalosťami. Kód je dostupný na .
Stručný prehľad fungovania systému

Na schéme je stručný popis toho, ako to celé funguje:
- Aplikácia poskytuje metriky počtu požiadaviek na HTTP vo formáte Prometheus.
- Prometheus je nastavený na zber týchto ukazovateľov.
- Sčka Prometheus v KEDA je nastavený na automatické škálovanie aplikácie na základe počtu požiadaviek na HTTP.
Teraz podrobne poviem o každom prvku.
KEDA a Prometheus
Prometheus je open-source nástroj na monitorovanie a upozorňovanie systémov, časť . Zhromažďuje metriky z rôznych zdrojov a uchováva ich vo forme časových radov. Na vizualizáciu dát je možné použiť alebo iné vizualizačné nástroje pracujúce s API Kubernetes.
KEDA podporuje koncept škálovača — pôsobí ako most medzi KEDA a externým systémom. Implementácia škálovača je špecifická pre každý cieľový systém a extrahuje z neho dáta. Potom KEDA tieto dáta využíva na riadenie automatického škálovania.
Skálera podporujú viaceré zdroje údajov, ako sú Kafka, Redis, Prometheus. To znamená, že KEDA sa dá použiť na automatické škálovanie nasadení Kubernetes na základe metriky Prometheus.
Testovacia aplikácia
Testovacia aplikácia v Golangu poskytuje prístup cez HTTP a vykonáva dve dôležité funkcie:
- Používa klientsku knižnicu Prometheus Go na instrumentáciu aplikácie a poskytovanie metriky http_requests, ktorá obsahuje počet požiadaviek. Konečný bod, na ktorom sú metriky Prometheus dostupné, sa nachádza na URI
/metrics.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "počet http požiadaviek", }) - Na požiadavku
GETaplikácia zvyšuje hodnotu kľúča (access_count) v Redis. To je jednoduchý spôsob, ako vykonať prácu ako súčasť HTTP spracovateľa a skontrolovať metriky Prometheus. Hodnota metriky by mala byť rovnaká ako hodnotaaccess_countv 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("Nemožno zvýšiť počítadlo redis", err) os.Exit(1) } resp := "Prístup na " + time.Now().String() + "nPočet prístupov " + strconv.Itoa(int(count)) w.Write([]byte(resp)) }) http.ListenAndServe(":8080", nil) }
Aplikácia sa nasadzuje v Kubernetes cez Nasadenie. Tiež sa vytvorí služba ClusterIP, ktorá umožňuje serveru Prometheus prijímať metriky aplikácie.
Tu sú .
Server Prometheus
Manifest nasadenia Prometheus pozostáva z:
ConfigMap— pre prenášanie konfigurácie Prometheus;Nasadenie— na nasadenie Prometheus v Kubernetes klastri;ClusterIP— služba na prístup k UI Prometheus;ClusterRole,ClusterRoleBindingaServiceAccount— na vykonávanie automatického objavovania služieb v Kubernetes (Auto-discovery).
Tu sú .
KEDA Prometheus ScaledObject
Skáler funguje ako most medzi KEDA a externým systémom, z ktorého je potrebné získavať metriky. ScaledObject — konfigurovateľný zdroj, ktorý je potrebné nasadiť na synchronizáciu nasadenia so zdrojom udalostí, v tomto prípade s Prometheus.
ScaledObject obsahuje informácie o škálovaní nasadenia, metadáta o zdroji udalosti (napr. tajomstvá na pripojenie, názov fronty), interval dotazovania, čas zotavenia a ďalšie údaje. Vedie k zodpovedajúcemu zdroju automatického škálovania (definícia HPA) pre škálovanie nasadenia.
Keď objekt ScaledObject odstráni sa, zodpovedajúca definícia HPA sa vyčistí.
Tu je definícia ScaledObject pre náš príklad, používa sa š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]))
Zohľadnite nasledujúce body:
- Ukazuje na
Nasadenies názvomgo-prom-app. - Typ spúšťača je
Prometheus. Adresa servera Prometheus sa spomína spolu s názvom metriky, prahovou hodnotou a , ktorý sa použije. Dotaz PromQL jesum(rate(http_requests[2m])). - Podľa
pollingInterval, KEDA žiada cieľ od Prometheus každých pätnásť sekúnd. Podporuje sa minimálne jeden pod (minReplicaCount), pričom maximálny počet podov nesmie prekročiťmaxReplicaCountv tomto príklade — desať.
Môže sa nastaviť minReplicaCount na nulu. V tomto prípade KEDA spustí nasadenie zo systému nula na jeden a potom zabezpečí HPA na ďalšie automatické škálovanie. Možný je aj opačný poriadok, teda škálovanie z jedného na nula. V príklade sme nezvolili nulu, pretože ide o HTTP službu, nie systém na požiadanie.
Kúzlo v rámci automatického škálovania
Prahová hodnota sa používa ako spúšťač pre škálovanie nasadenia. V našom príklade dotaz PromQL sum(rate(http_requests[2m])) vracia agregovanú hodnotu rýchlosti HTTP požiadaviek (počet požiadaviek za sekundu), meranú za posledné dve minúty.
Keďže prahová hodnota je tri, bude jeden pod, pokiaľ bude hodnota sum(rate(http_requests[2m])) menšia ako tri. Keď sa však hodnota zvyšuje, pridáva sa ďalší pod vždy, keď sum(rate(http_requests[2m])) sa zvýši o tri. Napríklad, ak hodnota stúpne z 12 na 14, počet podov bude štyri.
Teraz to skúsme nastaviť!
Predbežné nastavenie
Všetko, čo potrebujete, je cluster Kubernetes a nastavený nástroj kubectl. V tomto príklade sa používa cluster minikube, ale môžete použiť akýkoľvek iný. Pre inštaláciu clusteru existuje .
Inštalovať najnovšiu verziu 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/
Nainštalujte , aby ste získali prístup k clusteru Kubernetes.
Nainštalovať najnovšiu verziu 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
Inštalácia KEDA
Môžete nasadiť KEDA rôznymi spôsobmi, ktoré sú uvedené v . Používam monolitný YAML:
kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml
KEDA a jej komponenty sa inštalujú do priestoru názvov keda. Príkaz na kontrolu:
kubectl get pods -n keda
Čakajte, kým pod KEDA Operator štartuje — prejde do bežiaceho stavu. A potom pokračujte.
Inštalácia Redis pomocou Helm
Ak nemáte nainštalovaný Helm, použite tento . Príkaz na inštaláciu na Mac:
brew install kubernetes-helm
helm init --history-max 200
helm init iniciuje lokálny príkazový riadok a tiež inštaluje Tiller do Kubernetes klastrov.
kubectl get pods -n kube-system | grep tiller
Čakajte, kým pod Tiller prejde do stavu Running.
Poznámka prekladateľa: Autor používa Helm@2, ktorý vyžaduje inštaláciu serverovej komponenty Tiller. Momentálne je aktuálny Helm@3, pre ktorý serverová časť nie je potrebná.
Po inštalácii Helmu je na spustenie Redis potrebný len jeden príkaz:
helm install --name redis-server --set cluster.enabled=false --set
usePassword=false stable/redis
Uistite sa, že Redis sa úspešne spustil:
kubectl get pods/redis-server-master-0
Čakajte, kým pod Redis prejde do stavu Running.
Nasadenie aplikácie
Príkaz na nasadenie:
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
Skontrolujte, že všetko beží:
kubectl get pods -l=app=go-prom-app
Čakajte, kým Redis prejde do stavu Running.
Nasadenie servera Prometheus
Manifest Prometheus používa . Umožňuje dynamicky objavovať pod aplikácie na základe označenia služby.
kubernetes_sd_configs:
- role: service
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_run]
regex: go-prom-app-service
action: keep
Na nasadenie:
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
Skontrolujte, že všetko beží:
kubectl get pods -l=app=prometheus-server
Čakajte, kým pod Prometheus prejde do stavu Running.
Použite kubectl port-forward na prístup k používateľskému rozhraniu Prometheus (alebo serveru API) na adrese .
kubectl port-forward service/prometheus-service 9090
Nasadenie konfigurácie automatického škálovania KEDA
Príkaz na vytvorenie ScaledObject:
kubectl apply -f keda-prometheus-scaledobject.yaml
Skontrolujte záznamy 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ýsledok vyzerá približne takto:
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"
Skontrolujte pod aplikácie. Musí byť spustený jeden exemplár, pretože minReplicaCount rovná 1:
kubectl get pods -l=app=go-prom-app
Skontrolujte, či bol zdroj HPA úspešne vytvorený:
kubectl get hpa
Mali by ste vidieť niečo ako:
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: prístup k aplikácii
Aby ste získali prístup k koncovému bodu REST našej aplikácie, spustite:
kubectl port-forward service/go-prom-app-service 8080
Teraz môžete získať prístup k aplikácii Go pomocou adresy . Na to vykonajte príkaz:
curl http://localhost:8080/test
Výsledok vyzerá približne takto:
Prístupné dňa 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Počet prístupov 1
V tejto fáze skontrolujte aj Redis. Uvidíte, že kľúč access_count sa zvýšil na 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Uistite sa, že hodnota metriky http_requests je rovnaká:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests počet HTTP požiadaviek
# TYPE http_requests counter
http_requests 1
Generovanie záťaže
Budem používať — utilitu na generovanie záťaže:
curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64
&& chmod a+x hey
Môžete si tiež stiahnuť utilitu pre alebo .
Spustite ju:
./hey http://localhost:8080/test
Predvolene utilita posiela 200 požiadaviek. Môžete sa o tom presvedčiť pomocou metrík Prometheus a tiež Redis.
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests počet HTTP požiadaviek
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201
Potvrďte hodnotu skutočnej metriky (vrátenej požiadavkou 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 prípade je skutočný výsledok 1,686057971014493 a zobrazuje sa v poli value. To nestačí na škálovanie, pretože stanovený prah je 3.
Viac záťaže!
V novom termináli sledujte počet podov aplikácie:
kubectl get pods -l=app=go-prom-app -w
Poďme zvýšiť záťaž pomocou príkazu:
./hey -n 2000 http://localhost:8080/test
O chvíľu uvidíte, že HPA škáluje nasadenie a spúšťa nové pod. Skontrolujte HPA, aby ste si to overili:
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
Ak je záťaž nepravidelná, nasadenie sa zníži na bod, pri ktorom funguje len jeden pod. Ak chcete skontrolovať skutočnú metriku (vrátenú dopytom PromQL), použite príkaz:
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
Vymazanie
//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áver
KEDA umožňuje automaticky škálovať vaše nasadenia Kubernetes (až/od nuly) na základe údajov z externých metrík. Napríklad na základe metrík Prometheus, dĺžky fronty v Redis, oneskorenia spotrebiteľa v téme Kafka.
KEDA vykonáva integráciu s externým zdrojom a poskytuje jeho metriku prostredníctvom Metrics Server pre Horizontal Pod Autoscaler.
Veľa šťastia!
Čo ďalšie čítať:
- .
- .
- .
Zdroj: habr.com
