Scalability yog qhov xav tau tseem ceeb rau kev siv huab. Nrog Kubernetes, scaling ib daim ntawv thov yog yooj yim li nce tus naj npawb ntawm replicas rau qhov tsim nyog xa mus los yog ReplicaSet - tab sis nws yog tus txheej txheem phau ntawv.
Kubernetes tso cai rau cov ntawv thov kom tau txais kev ntsuas (piv txwv li Pods hauv kev xa tawm lossis ReplicaSet) nyob rau hauv ib qho kev tshaj tawm siv cov kab rov tav Pod Autoscaler specification. Lub ntsiab lus tseem ceeb rau kev ntsuas tsis siv neeg yog CPU siv cov ntsuas ntsuas (peev txheej ntsuas), tab sis koj tuaj yeem sib xyaw cov kev cai thiab kev ntsuas sab nraud.
pab neeg Kubernetes aaS los ntawm Mail.ru tau txhais ib tsab xov xwm hais txog yuav ua li cas siv cov ntsuas sab nraud kom tau txais daim ntawv thov Kubernetes. Los qhia tias txhua yam ua haujlwm li cas, tus kws sau ntawv siv HTTP nkag mus thov ntsuas, uas tau sau los ntawm Prometheus.
Prometheus scaler hauv KEDA tau teeb tsa kom tau txais daim ntawv teev npe raws li tus lej HTTP hits.
Tam sim no kuv yuav qhia rau koj paub meej txog txhua yam.
KEDA thiab Prometheus
Prometheus yog qhov qhib qhov system saib xyuas thiab ceeb toom cov cuab yeej, ib feem Huab hwm coj xam huab. Sau cov metrics los ntawm ntau qhov chaw thiab khaws cia ua cov ntaub ntawv teev sijhawm. Txhawm rau pom cov ntaub ntawv koj tuaj yeem siv ua grafana lossis lwm yam cuab yeej pom kev pom uas ua haujlwm nrog Kubernetes API.
KEDA txhawb nqa lub tswv yim ntawm tus nplaig - nws ua tus choj ntawm KEDA thiab cov txheej txheem sab nraud. Kev siv scaler yog tshwj xeeb rau txhua lub hom phiaj thiab muab cov ntaub ntawv los ntawm nws. KEDA ces siv lawv los tswj tsis siv neeg scaling.
Scalers txhawb ntau cov ntaub ntawv, piv txwv li, Kafka, Redis, Prometheus. Ntawd yog, KEDA tuaj yeem siv los txiav txim ntsuas Kubernetes kev xa tawm siv Prometheus metrics raws li cov qauv.
Test daim ntawv thov
Daim ntawv thov Golang xeem muab nkag los ntawm HTTP thiab ua ob txoj haujlwm tseem ceeb:
Siv lub tsev qiv ntawv Prometheus Go cov neeg siv khoom los ntsuas daim ntawv thov thiab muab qhov http_requests metric, uas muaj cov suav ntaus. Qhov kawg qhov twg Prometheus metrics muaj nyob ntawm URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Teb rau qhov kev thov GET daim ntawv thov nce tus nqi ntawm tus yuam sij (access_count) hauv Redis. Qhov no yog ib txoj hauv kev yooj yim los ua haujlwm raws li ib feem ntawm HTTP handler thiab kuj tshawb xyuas Prometheus metrics. Tus nqi metric yuav tsum yog tib yam li tus nqi access_count hauv Redis.
Daim ntawv thov raug xa mus rau Kubernetes ntawm Deployment. Ib qho kev pabcuam kuj raug tsim ClusterIP, nws tso cai rau Prometheus server kom tau txais daim ntawv thov ntsuas.
Lub scaler ua raws li tus choj ntawm KEDA thiab cov txheej txheem sab nraud los ntawm qhov kev ntsuas yuav tsum tau txais. ScaledObject yog ib qho kev cai uas yuav tsum tau muab xa mus rau synchronize kev xa mus nrog qhov xwm txheej, qhov no Prometheus.
ScaledObject muaj cov ntaub ntawv qhia txog kev xa tawm, cov xwm txheej metadata (xws li kev sib txuas lus zais cia, npe hu), lub sijhawm xaiv tsa, lub sijhawm rov qab los, thiab lwm yam ntaub ntawv. Nws ua rau qhov sib thooj autoscaling resource (HPA txhais) los ntsuas qhov kev xa tawm.
Trigger hom - Prometheus. Prometheus server chaw nyob tau hais nrog rau lub npe metric, pib thiab PromQL lus nug, uas yuav siv tau. PromQL Query - sum(rate(http_requests[2m])).
Raws li pollingInterval, KEDA thov lub hom phiaj los ntawm Prometheus txhua kaum tsib vib nas this. Tsawg kawg yog ib qho hauv qab (minReplicaCount), thiab qhov siab tshaj plaws ntawm cov pods tsis tshaj maxReplicaCount (hauv qhov piv txwv no - kaum).
Yuav nruab minReplicaCount sib npaug rau xoom. Nyob rau hauv rooj plaub no, KEDA qhib lub xoom-rau-ib xa tawm thiab tom qab ntawd nthuav tawm HPA rau kev ntsuas tsis siv neeg ntxiv. Qhov kev txiav txim rov qab kuj tseem ua tau, uas yog, ntsuas los ntawm ib mus rau xoom. Hauv qhov piv txwv, peb tsis tau xaiv xoom vim qhov no yog qhov kev pabcuam HTTP thiab tsis yog qhov kev xav tau.
Cov khawv koob hauv autoscaling
Qhov chaw pib yog siv los ua ib qho txiaj ntsig los ntsuas qhov kev xa tawm. Hauv peb qhov piv txwv, PromQL cov lus nug sum(rate (http_requests [2m])) xa rov qab qhov sib sau HTTP thov tus nqi (thov ib ob), ntsuas ob feeb dhau los.
Txij li thaum tus nqi pib yog peb, nws txhais tau tias yuav muaj ib qho qis dua thaum tus nqi sum(rate (http_requests [2m])) tsawg dua peb. Yog tias tus nqi nce, ib qho ntxiv sub ntxiv txhua zaus sum(rate (http_requests [2m])) nce los ntawm peb. Piv txwv li, yog tias tus nqi yog los ntawm 12 mus rau 14, ces tus naj npawb ntawm cov pods yog plaub.
helm init initializes lub zos hais kom ua kab interface thiab kuj installs Tiller mus rau Kubernetes pawg.
kubectl get pods -n kube-system | grep tiller
Tos kom Tiller pod nkag mus rau lub xeev khiav.
Tus neeg txhais lus sau tseg: Tus kws sau ntawv siv Helm@2, uas yuav tsum tau nruab Tiller server tivthaiv. Tam sim no Helm@3 yog qhov tseem ceeb, nws tsis tas yuav muaj ib feem ntawm cov neeg rau zaub mov.
Tom qab txhim kho Helm, ib qho lus txib txaus los pib 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
Xyuas tias txhua yam tau pib:
kubectl get pods -l=app=prometheus-server
Tos kom Prometheus mus rau hauv lub xeev Running.
Siv kubectl port-forward nkag mus rau Prometheus tus neeg siv interface (lossis API server) ntawm http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Cov txiaj ntsig zoo li no:
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"
Xyuas hauv qab daim ntawv thov. Ib qho piv txwv yuav tsum tau khiav vim minReplicaCount sib npaug 1:
kubectl get pods -l=app=go-prom-app
Xyuas kom tseeb tias HPA cov peev txheej tau tsim tiav:
kubectl get hpa
Koj yuav tsum pom qee yam xws li:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Tam sim no koj tuaj yeem nkag mus rau koj lub Go app siv qhov chaw nyob http://localhost:8080. Txhawm rau ua qhov no, khiav cov lus txib:
curl http://localhost:8080/test
Cov txiaj ntsig zoo li no:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Nyob rau ntawm no tseem kos Redis. Koj yuav pom tus yuam sij ntawd access_count nce mus rau 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Xyuas kom tseeb tias tus nqi metric yog http_requests tib yam:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
//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
xaus
KEDA tso cai rau koj tuaj yeem ntsuas koj lub Kubernetes kev xa tawm (rau / los ntawm xoom) raws li cov ntaub ntawv los ntawm kev ntsuas sab nraud. Piv txwv li, raws li Prometheus metrics, queue ntev nyob rau hauv Redis, neeg siv latency nyob rau hauv Kafka lub ncauj lus.
KEDA koom nrog ib qho chaw sab nraud thiab tseem muab nws cov kev ntsuas los ntawm Metrics Server rau Kab rov tav Pod Autoscaler.