Skaalautuvuus on pilvisovellusten keskeinen vaatimus. Kubernetesilla sovelluksen skaalaaminen on yhtä helppoa kuin replikoiden määrän lisääminen tietylle käyttöönotolle tai ReplicaSet - mutta se on manuaalinen prosessi.
Kubernetesin avulla voit skaalata sovelluksia automaattisesti (esim. käyttöönoton aikana tai ReplicaSet) deklaratiivisesti käyttämällä Horizontal Pod Autoscaler -spesifikaatiota. Automaattisen skaalauksen oletusehto on suorittimen käyttömetriikka (resurssimetriikka), mutta voit integroida mukautettuja mittareita ja ulkoisesti toimitettuja mittareita.
Joukkue Kubernetes aaS osoitteesta Mail.ru käänsi artikkelin ulkoisten mittareiden käyttämisestä Kubernetes-sovelluksen automaattiseen skaalaukseen. Näyttääkseen kuinka kaikki toimii, kirjoittaja käyttää HTTP-käyttöpyyntömittareita, jotka kerätään Prometheuksen avulla.
Vaakasuuntaisen pod-automaattisen skaalauksen sijaan Kubernetes Event Driven Autoscaling (KEDA) on avoimen lähdekoodin Kubernetes-operaattori. Se integroituu natiivisti Horizontal Pod Autoscalerin kanssa ja tarjoaa saumattoman automaattisen skaalauksen (mukaan lukien nollasta/nollasta) tapahtumapohjaisissa työkuormissa. Koodi on saatavilla osoitteessa GitHub.
Lyhyt katsaus järjestelmän toimivuuteen
Kaavio on lyhyt kuvaus siitä, kuinka kaikki toimii:
Sovellus tarjoaa HTTP-osumamäärämittauksia Prometheus-muodossa.
Prometheus on määritetty keräämään näitä mittareita.
KEDA:n Prometheus-skaalaaja on määritetty skaalaamaan sovellus automaattisesti HTTP-osumien määrän perusteella.
Puhutaan nyt jokaisesta elementistä yksityiskohtaisesti.
KEDA ja Prometheus
Prometheus on avoimen lähdekoodin järjestelmän valvonta- ja hälytystyökalusarja, osa Cloud Native Computing -säätiö. Kerää mittareita eri lähteistä ja tallentaa aikasarjatietoina. Voit visualisoida tietoja käyttämällä grafana tai muita Kubernetes API:n kanssa toimivia visualisointityökaluja.
KEDA tukee skaalauskonseptia - se toimii siltana KEDA:n ja ulkoisen järjestelmän välillä. Skaalaustoteutus on kunkin kohdejärjestelmän mukainen ja poimii siitä dataa. KEDA käyttää niitä sitten automaattisen skaalauksen ohjaamiseen.
Skaalaimet tukevat useita tietolähteitä, kuten Kafka, Redis, Prometheus. Toisin sanoen KEDAa voidaan käyttää Kubernetes-asennusten automaattiseen skaalaukseen käyttämällä Prometheus-mittareita kriteereinä.
testisovellus
Golang-testisovellus tarjoaa HTTP-yhteyden ja suorittaa kaksi tärkeää toimintoa:
Käyttää Prometheus Go -asiakaskirjastoa instrumentoidakseen sovelluksen ja tarjotakseen http_requests-mittarin, joka sisältää osumamäärän. Päätepiste, jossa Prometheus-mittarit ovat saatavilla, sijaitsee URI:n mukaan /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Vastauksena pyyntöön GET sovellus lisää avaimen arvoa (access_count) Redisissä. Tämä on helppo tapa saada työ tehtyä osana HTTP-käsittelijää ja myös tarkistaa Prometheus-mittarit. Mittarin arvon on oltava sama kuin arvon access_count paikassa Redis.
Skaalauslaite toimii siltana KEDA:n ja ulkoisen järjestelmän välillä, josta saadaan mittareita. ScaledObject on mukautettu resurssi, se on otettava käyttöön, jotta käyttöönotto synkronoidaan tapahtumalähteen, tässä tapauksessa Prometheuksen, kanssa.
ScaledObject sisältää tietoja käyttöönoton skaalauksesta, metatiedot tapahtuman lähteestä (esimerkiksi yhteyden salaisuudet, jonon nimi), kyselyvälistä, palautusjaksosta ja muita tietoja. Se johtaa asianmukaiseen automaattiseen skaalaukseen (HPA-määrittely) käyttöönoton skaalaamiseksi.
Kun esine ScaledObject on poistettu, sitä vastaava HPA-määritelmä tyhjennetään.
Tässä on määritelmä ScaledObject esimerkiksi se käyttää skaalainta Prometheus:
laukaisutyyppi - Prometheus. Prometheus-palvelimen osoite mainitaan yhdessä mittarin nimen, kynnyksen ja PromQL kyselykäytettäväksi. PromQL-kysely − sum(rate(http_requests[2m])).
Mukaan pollingIntervalKEDA kysyy Prometheukselta kohdetta viidentoista sekunnin välein. Vähintään yksi pod on tuettu (minReplicaCount), ja palojen enimmäismäärä ei ylitä maxReplicaCount (tässä esimerkissä kymmenen).
Voi asentaa minReplicaCount yhtä suuri kuin nolla. Tässä tapauksessa KEDA aktivoi käyttöönoton nollasta yhteen ja tarjoaa sitten HPA:n automaattista lisäskaalausta varten. Myös käänteinen järjestys on mahdollinen, eli skaalaus yhdestä nollaan. Esimerkissä emme valinneet nollaa, koska se on HTTP-palvelu eikä tilausjärjestelmä.
Taika automaattiskaalan sisällä
Kynnysarvoa käytetään käynnistyksenä skaalattaessa käyttöönottoa. Esimerkissämme PromQL-kysely sum(rate (http_requests [2m])) palauttaa kootun HTTP-pyyntönopeuden (pyyntöjä sekunnissa) mitattuna viimeisen kahden minuutin aikana.
Koska kynnysarvo on kolme, arvoon asti on yksi pod sum(rate (http_requests [2m])) alle kolme. Jos arvo kasvaa, ylimääräinen ali lisätään joka kerta sum(rate (http_requests [2m])) kasvaa kolmella. Jos arvo on esimerkiksi 12-14, koteloiden lukumäärä on neljä.
Nyt yritetään mukauttaa!
esiasetus
Tarvitset vain Kubernetes-klusterin ja määritetyn apuohjelman kubectl. Tässä esimerkissä käytetään klusteria minikube, mutta voit ottaa minkä tahansa muun. Voit perustaa klusterin руководство.
helm init alustaa paikallisen komentoriviliittymän ja myös asettaa Tiller Kubernetes-klusteriin.
kubectl get pods -n kube-system | grep tiller
Odota, kunnes Tiller Pod siirtyy Käynnissä-tilaan.
Kääntäjän huomautus: Tekijä käyttää Helm@2:ta, joka vaatii Tiller-palvelinkomponentin asentamisen. Nyt Helm@3 on relevantti, palvelinosaa ei siihen tarvita.
Helmin asennuksen jälkeen yksi komento riittää käynnistämään Redis:
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
Tarkista, että kaikki toimii:
kubectl get pods -l=app=prometheus-server
Odota, kunnes Prometheus tulee osavaltioon Running.
käyttö kubectl port-forward päästäksesi Prometheus-käyttöliittymään (tai API-palvelimeen) osoitteessa http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Tulos näyttää suunnilleen tältä:
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"
Tarkista sovellukset alta. Yhden esiintymän on oltava käynnissä, koska minReplicaCount on yhtä kuin 1:
kubectl get pods -l=app=go-prom-app
Varmista, että HPA-resurssin luominen onnistui:
kubectl get hpa
Sinun pitäisi nähdä jotain tällaista:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Voit nyt käyttää Go-sovellusta käyttämällä osoitetta http://localhost:8080. Voit tehdä tämän suorittamalla komennon:
curl http://localhost:8080/test
Tulos näyttää suunnilleen tältä:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Tarkista tässä vaiheessa myös Redis. Näet sen avaimen access_count nostettu 1:een:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Varmista metriarvo http_requests sama:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Tässä tapauksessa todellinen tulos on 1,686057971014493 ja näytetään kentällä value. Tämä ei riitä skaalaukseen, koska asettamamme kynnys on 3.
Lisää kuormaa!
Seuraa uudessa terminaalissa sovelluskoteloiden määrää:
kubectl get pods -l=app=go-prom-app -w
Lisätään kuormaa komennolla:
./hey -n 2000 http://localhost:8080/test
Hetken kuluttua huomaat, että HPA laajentaa käyttöönottoa ja käynnistää uusia koteloita. Tarkista HPA varmistaaksesi:
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
Jos kuormitus on ajoittaista, käyttöönotto kutistuu pisteeseen, jossa vain yksi Pod on käynnissä. Jos haluat tarkistaa todellisen mittarin (jonka PromQL-kysely palauttaa), käytä komentoa:
//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
Johtopäätös
KEDA antaa sinun skaalata Kubernetes-asetuksesi automaattisesti (nollaan/nollasta) ulkoisten mittareiden tietojen perusteella. Esimerkiksi Prometheus-mittareiden perusteella jonon pituus Redisissä, kuluttajaviive Kafka-aiheessa.
KEDA integroituu ulkoiseen lähteeseen ja tarjoaa myös mittansa Metrics Serverin kautta Horizontal Pod Autoscaleriin.