Skaalbaarheid is 'n sleutelvereiste vir wolktoepassings. Met Kubernetes is die skaal van 'n toepassing so eenvoudig soos om die aantal replikas vir die toepaslike ontplooiing of ReplicaSet - maar dit is 'n handmatige proses.
Kubernetes laat toepassings toe om outomaties geskaal te word (d.w.s. Peule in 'n ontplooiing of ReplicaSet) op 'n verklarende wyse deur die Horizontal Pod Autoscaler-spesifikasie te gebruik. Die verstekkriterium vir outomatiese skaal is SVE-gebruikmaatstawwe (hulpbronmaatstawwe), maar jy kan pasgemaakte en ekstern verskafde maatstawwe integreer.
Span Kubernetes aaS van Mail.ru het 'n artikel vertaal oor hoe om eksterne maatstawwe te gebruik om 'n Kubernetes-toepassing outomaties te skaal. Om te wys hoe alles werk, gebruik die skrywer HTTP-toegangversoek-metrieke, wat met Prometheus ingesamel word.
In plaas van horisontale outoskaling van peule, word Kubernetes Event Driven Autoscaling (KEDA) gebruik, 'n oopbron Kubernetes-operateur. Dit integreer inheems met Horizontal Pod Autoscaler om naatlose outoskaling (insluitend na/van nul) vir gebeurtenisgedrewe werkladings te verskaf. Kode beskikbaar by GitHub.
Kort oorsig van die stelsel
Die diagram toon 'n kort beskrywing van hoe alles werk:
Die toepassing bied HTTP-treffertelling-metrieke in Prometheus-formaat.
Prometheus is opgestel om hierdie maatstawwe in te samel.
Die Prometheus-skaaler in KEDA is gekonfigureer om die toepassing outomaties te skaal op grond van die aantal HTTP-treffers.
Nou sal ek jou in detail oor elke element vertel.
KEDA en Prometheus
Prometheus is 'n oopbron stelsel monitering en waarskuwing toolkit, deel Cloud Native Computing Foundation. Versamel statistieke uit verskeie bronne en stoor dit as tydreeksdata. Om data te visualiseer wat jy kan gebruik grafana of ander visualiseringsnutsgoed wat met die Kubernetes API werk.
KEDA ondersteun die konsep van 'n scaler - dit dien as 'n brug tussen KEDA en die eksterne stelsel. Die skaalimplementering is spesifiek vir elke teikenstelsel en onttrek data daaruit. KEDA gebruik hulle dan om outomatiese skaal te beheer.
Skalers ondersteun verskeie databronne, byvoorbeeld Kafka, Redis, Prometheus. Dit wil sê, KEDA kan gebruik word om Kubernetes-ontplooiings outomaties te skaal deur Prometheus-metrieke as kriteria te gebruik.
Toets aansoek
Die Golang-toetstoepassing bied toegang via HTTP en voer twee belangrike funksies uit:
Gebruik die Prometheus Go-kliëntbiblioteek om die toepassing te instrumenteer en die http_requests-metriek te verskaf, wat 'n treftelling bevat. Die eindpunt waar Prometheus-metrieke beskikbaar is, is by die URI geleë /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
In reaksie op 'n versoek GET die toepassing verhoog die waarde van die sleutel (access_count) in Redis. Dit is 'n maklike manier om die werk as deel van 'n HTTP-hanteerder te doen en ook Prometheus-statistieke na te gaan. Die metrieke waarde moet dieselfde as die waarde wees access_count in Redis.
Die toepassing word na Kubernetes ontplooi via Deployment. 'n Diens word ook geskep ClusterIP, dit laat die Prometheus-bediener toe om toepassingsstatistieke te verkry.
Die skaaler dien as 'n brug tussen KEDA en die eksterne stelsel waaruit metrieke verkry moet word. ScaledObject is 'n pasgemaakte hulpbron wat ontplooi moet word om die ontplooiing met die gebeurtenisbron, in hierdie geval Prometheus, te sinchroniseer.
ScaledObject bevat ontplooiingskaalinligting, gebeurtenisbronmetadata (soos verbindingsgeheime, tounaam), steminterval, herstelperiode en ander data. Dit lei tot die ooreenstemmende outoskaalhulpbron (HPA-definisie) om die ontplooiing te skaal.
Wanneer 'n voorwerp ScaledObject geskrap word, word die ooreenstemmende HPA-definisie uitgevee.
Hier is die definisie ScaledObject vir ons voorbeeld, dit gebruik 'n scaler Prometheus:
Sneller tipe - Prometheus. Die Prometheus-bedieneradres word saam met die metrieke naam, drempel en PromQL-navraag, wat gebruik sal word. PromQL-navraag - sum(rate(http_requests[2m])).
Volgens pollingInterval,KEDA versoek elke vyftien sekondes 'n teiken van Prometheus. Ten minste een onder (minReplicaCount), en die maksimum aantal peule oorskry nie maxReplicaCount (in hierdie voorbeeld - tien).
Kan geïnstalleer word minReplicaCount gelyk aan nul. In hierdie geval aktiveer KEDA die nul-tot-een-ontplooiing en stel dan die HPA bloot vir verdere outomatiese skaal. Die omgekeerde volgorde is ook moontlik, dit wil sê, skaal van een tot nul. In die voorbeeld het ons nie nul gekies nie, want dit is 'n HTTP-diens en nie 'n op-aanvraag-stelsel nie.
Die magie binne-outoskaal
Die drempel word gebruik as 'n sneller om die ontplooiing te skaal. In ons voorbeeld, die PromQL-navraag sum(rate (http_requests [2m])) gee die saamgestelde HTTP-versoekkoers (versoeke per sekonde), gemeet oor die laaste twee minute.
Aangesien die drempelwaarde drie is, beteken dit dat daar een onder sal wees terwyl die waarde sum(rate (http_requests [2m])) minder as drie. As die waarde toeneem, word 'n bykomende sub elke keer bygevoeg sum(rate (http_requests [2m])) verhoog met drie. Byvoorbeeld, as die waarde van 12 tot 14 is, dan is die aantal peule vier.
Kom ons probeer dit nou opstel!
voorafinstelling
Al wat jy nodig het, is 'n Kubernetes-kluster en 'n gekonfigureerde hulpprogram kubectl. Hierdie voorbeeld gebruik 'n cluster minikube, maar jy kan enige ander een neem. Om 'n cluster te installeer is daar leierskap.
helm init inisialiseer die plaaslike opdragreëlkoppelvlak en installeer ook Tiller na die Kubernetes-kluster.
kubectl get pods -n kube-system | grep tiller
Wag vir die Tiller-peul om die Running-toestand te betree.
Vertaler se nota: Die skrywer gebruik Helm@2, wat vereis dat die Tiller-bedienerkomponent geïnstalleer moet word. Nou is Helm@3 relevant, dit benodig nie 'n bedieneronderdeel nie.
Nadat u Helm geïnstalleer het, is een opdrag genoeg om Redis te begin:
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
Maak seker dat alles begin het:
kubectl get pods -l=app=prometheus-server
Wag vir Prometheus om in staat te gaan Running.
Gebruik kubectl port-forward om toegang te verkry tot die Prometheus-gebruikerskoppelvlak (of API-bediener) by http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Die resultaat lyk iets soos volg:
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"
Kyk onder toepassings. Een geval moet loop omdat minReplicaCount gelyk aan 1:
kubectl get pods -l=app=go-prom-app
Verifieer dat die HPA-hulpbron suksesvol geskep is:
kubectl get hpa
Jy behoort iets te sien soos:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Gesondheidsondersoek: Toegang tot toepassing
Om toegang tot ons toepassing se REST-eindpunt te kry, hardloop:
Jy kan nou toegang tot jou Go-toepassing gebruik deur die adres te gebruik http://localhost:8080. Om dit te doen, voer die opdrag uit:
curl http://localhost:8080/test
Die resultaat lyk iets soos volg:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Kontroleer op hierdie punt ook Redis. Jy sal sien dat die sleutel access_count verhoog tot 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Maak seker die metrieke waarde is http_requests dieselfde:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Ladingskepping
Ons sal gebruik hey - nut vir die opwekking van vrag:
In hierdie geval is die werklike resultaat 1,686057971014493 en word in die veld vertoon value. Dit is nie genoeg vir skaal nie, aangesien die drempel wat ons stel 3 is.
Meer vrag!
In die nuwe terminaal, monitor die aantal toepassingpeule:
kubectl get pods -l=app=go-prom-app -w
Kom ons verhoog die vrag deur die opdrag:
./hey -n 2000 http://localhost:8080/test
Na 'n rukkie sal jy sien hoe HPA die ontplooiing skaal en nuwe peule begin. Gaan jou HPA na om seker te maak:
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
As die vrag inkonsekwent is, sal die ontplooiing verminder word tot die punt waar slegs een peul loop. As jy die werklike metrieke wil nagaan (teruggestuur deur die PromQL-navraag), gebruik dan die opdrag:
//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
Gevolgtrekking
KEDA laat jou toe om jou Kubernetes-ontplooiings outomaties te skaal (na/van nul) gebaseer op data van eksterne maatstawwe. Byvoorbeeld, gebaseer op Prometheus-metrieke, toulengte in Redis, verbruikersvertraging in Kafka-onderwerp.
KEDA integreer met 'n eksterne bron en verskaf ook sy statistieke deur Metrics Server na Horizontal Pod Autoscaler.