Fitakiana lehibe amin'ny fampiharana rahona ny scalability. Miaraka amin'ny Kubernetes, ny fampitomboana ny rindranasa iray dia tsotra toy ny fampitomboana ny isan'ny kopia ho an'ny fametrahana sahaza na ReplicaSet — fa dingana an-tanana izany.
Ny Kubernetes dia mamela ny rindranasa ho tonga ho azy (izany hoe Pods amin'ny fametrahana na ReplicaSet) amin'ny fomba fanambarana amin'ny fampiasana ny fanondroana Horizontal Pod Autoscaler. Ny mari-pandrefesana mahazatra ho an'ny fanamafisam-peo mandeha ho azy dia ny metrika fampiasana CPU (metrika loharano), saingy azonao atao ny mampiditra metrika mahazatra sy omena avy any ivelany.
ekipa Kubernetes aaS avy amin'ny Mail.ru nandika lahatsoratra iray momba ny fomba fampiasana metrika ivelany hanamafisana ho azy ny fampiharana Kubernetes. Mba hampisehoana ny fomba fiasan'ny zava-drehetra dia mampiasa metrika fangatahana fidirana HTTP ny mpanoratra, izay angonina amin'ny fampiasana Prometheus.
Raha tokony ho fanamafisam-peo marindrano ny pods, Kubernetes Event Driven Autoscaling (KEDA) no ampiasaina, mpandraharaha Kubernetes loharano misokatra. Izy io dia mitambatra amin'ny horizontal Pod Autoscaler ho an'ny autoscaling tsy misy fotony (ao anatin'izany ny / manomboka amin'ny aotra) ho an'ny enta-mavesatry ny hetsika. Code azo alaina amin'ny GitHub.
Fijery fohy momba ny rafitra
Ny diagram dia mampiseho famaritana fohy ny fomba fiasan'ny zava-drehetra:
Ny fampiharana dia manome metrika HTTP hit count amin'ny endrika Prometheus.
Prometheus dia namboarina hanangona ireo metrika ireo.
Ny scaler Prometheus ao amin'ny KEDA dia namboarina mba hanesorana ho azy ny fampiharana mifototra amin'ny isan'ny HTTP hits.
Ankehitriny dia hilaza aminareo amin'ny antsipiriany momba ny singa tsirairay aho.
KEDA sy Prometheus
Prometheus dia rafitra fanaraha-maso sy fitaovana fampitandremana misokatra, ampahany Cloud Computing Foundation. Manangona metrika avy amin'ny loharano isan-karazany ary mitahiry azy ireo ho angona andiam-potoana. Mba hijerena ny angona azonao ampiasaina grafana na fitaovana fijerena sary hafa izay miasa miaraka amin'ny Kubernetes API.
KEDA dia manohana ny foto-kevitry ny scaler - miasa toy ny tetezana eo amin'ny KEDA sy ny rafitra ivelany. Ny fampiharana scaler dia manokana ho an'ny rafitra kendrena tsirairay ary maka angona avy aminy. KEDA avy eo dia mampiasa azy ireo hifehy ny scaling mandeha ho azy.
Ny scalers dia manohana loharanom-baovao marobe, ohatra, Kafka, Redis, Prometheus. Izany hoe, ny KEDA dia azo ampiasaina hanesorana ho azy ny fanaparitahana Kubernetes amin'ny fampiasana metrika Prometheus ho fepetra.
Fampiharana fitsapana
Ny fampiharana fitsapana Golang dia manome fidirana amin'ny alàlan'ny HTTP ary manao asa roa lehibe:
Mampiasa ny famakiam-bokin'ny mpanjifa Prometheus Go mba hitehirizana ny rindranasa sy hanomezana ny mari-pamantarana http_requests, izay misy isa isa. Ny teboka farany misy ny metrika Prometheus dia hita ao amin'ny URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Ho valin'ny fangatahana GET ny fampiharana dia mampitombo ny sandan'ny fanalahidy (access_count) any Redis. Ity dia fomba mora hanaovana ny asa amin'ny maha-tompon'andraikitra HTTP ary jereo ihany koa ny metrika Prometheus. Ny sanda metrika dia tsy maintsy mitovy amin'ny sandany access_count any Redis.
Ny scaler dia miasa toy ny tetezana eo amin'ny KEDA sy ny rafitra ivelany izay ilana ny metrika. ScaledObject dia loharano mahazatra izay mila apetraka mba hampifanaraka ny fametrahana amin'ny loharano hetsika, amin'ity tranga ity Prometheus.
ScaledObject mirakitra fampahafantarana momba ny fanaparitahana, metadata loharanon-javatra (toy ny tsiambaratelon'ny fifandraisana, anaran'ny filaharana), elanelana fandatsaham-bato, vanim-potoana fanarenana, ary angona hafa. Izany dia miteraka loharanon'ny autoscaling mifanaraka amin'izany (famaritana HPA) hanamafisana ny fametrahana.
Araka ny pollingInterval, KEDA dia mangataka lasibatra avy amin'ny Prometheus isaky ny dimy ambin'ny folo segondra. Farafahakeliny iray ambany (minReplicaCount), ary tsy mihoatra ny isan'ny pods maxReplicaCount (amin'ity ohatra ity - folo).
Azo apetraka minReplicaCount mitovy amin'ny aotra. Amin'ity tranga ity, ny KEDA dia manetsika ny fametrahana zero-to-one ary avy eo dia mampiseho ny HPA ho an'ny scaling mandeha ho azy. Ny filaharana mivadika koa dia azo atao, izany hoe ny fisondrotana avy amin'ny iray ka hatramin'ny aotra. Amin'ny ohatra, tsy nifidy aotra izahay satria serivisy HTTP fa tsy rafitra misy fangatahana.
Ny majika ao anaty autoscaling
Ampiasaina ho toy ny trigger ny tokonam-baravarana hanamafisana ny fametrahana. Ao amin'ny ohatra ataontsika, ny fangatahana PromQL sum(rate (http_requests [2m])) mamerina ny tahan'ny fangatahana HTTP natambatra (fangatahana isan-tsegondra), refesina tao anatin'ny roa minitra farany.
Satria ny sandan'ny tokonam-baravarana dia telo, midika izany fa hisy iray eo ambanin'ny sandany sum(rate (http_requests [2m])) latsaky ny telo. Raha mitombo ny sandany dia misy zana-tohatra fanampiny ampiana isaky ny mandeha sum(rate (http_requests [2m])) mitombo telo. Ohatra, raha 12 ka hatramin'ny 14 ny sandany, dia efatra ny isan'ny pods.
Andeha isika hanandrana hametraka azy io!
presetting
Ny hany ilainao dia kluster Kubernetes sy fitaovana namboarina kubectl. Ity ohatra ity dia mampiasa cluster minikube, fa afaka maka iray hafa ianao. Ny fametrahana cluster dia misy mpitarika.
helm init dia manomboka ny interface baiko eo an-toerana ary mametraka ihany koa Tiller mankany amin'ny cluster Kubernetes.
kubectl get pods -n kube-system | grep tiller
Andraso ny pod Tiller hiditra amin'ny fanjakana Running.
Fanamarihan'ny mpandika teny: Ny mpanoratra dia mampiasa Helm@2, izay mitaky ny fametrahana ny singa mpizara Tiller. Ny Helm@3 izao dia manan-danja, tsy mitaky ampahany amin'ny server.
Rehefa avy nametraka Helm, baiko iray dia ampy hanombohana 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
Hamarino fa nanomboka ny zava-drehetra:
kubectl get pods -l=app=prometheus-server
Miandrasa an'i Prometheus ho any amin'ny fanjakana Running.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Toy izao ny vokatra:
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"
Jereo eo ambanin'ny applications. Ohatra iray dia tsy maintsy mihazakazaka satria minReplicaCount mitovy 1:
kubectl get pods -l=app=go-prom-app
Hamarino fa nahomby ny famoronana HPA:
kubectl get hpa
Tokony hahita zavatra toy izao ianao:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Afaka miditra amin'ny fampiharana Go ianao izao amin'ny alàlan'ny adiresy http://localhost:8080. Mba hanaovana izany, araho ny baiko:
curl http://localhost:8080/test
Toy izao ny vokatra:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Amin'ity tranga ity, jereo koa ny Redis. Ho hitanao fa ny fanalahidy access_count nitombo ho 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Ataovy azo antoka fa ny sanda metrika dia http_requests mitovy:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Amin'ity tranga ity, ny tena vokatra dia 1,686057971014493 ary aseho amin'ny saha value. Tsy ampy ho an'ny scaling izany, satria ny tokonam-baravarana napetrakay dia 3.
More entana!
Ao amin'ny terminal vaovao, araho ny isan'ny pods fampiharana:
kubectl get pods -l=app=go-prom-app -w
Andao hampitombo ny entana mampiasa ny baiko:
./hey -n 2000 http://localhost:8080/test
Rehefa afaka kelikely, dia ho hitanao ny HPA manamafy ny fametrahana sy mamoaka pods vaovao. Jereo ny HPA-nao mba hahazoana antoka fa:
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
Raha toa ka tsy mifanaraka ny enta-mavesatra, dia hihena ho amin'ny toerana iray izay pod iray ihany no mandeha. Raha te hanamarina ny metrika tena izy ianao (naverina tamin'ny fangatahana PromQL), dia ampiasao ny baiko:
//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
famaranana
KEDA dia ahafahanao manitsy ho azy ny fametrahanao Kubernetes (hatramin'ny aotra) mifototra amin'ny angona avy amin'ny metrika ivelany. Ohatra, mifototra amin'ny metrika Prometheus, ny halavan'ny filaharana ao amin'ny Redis, ny faharetan'ny mpanjifa amin'ny lohahevitra Kafka.
KEDA dia mitambatra amin'ny loharano ivelany ary manome ny metrikany amin'ny alàlan'ny Metrics Server amin'ny Horizontal Pod Autoscaler.