Scalability bụ isi ihe achọrọ maka ngwa igwe ojii. Site na Kubernetes, ịmegharị ngwa dị mfe dị ka ịbawanye ọnụ ọgụgụ nke oyiri maka mbugharị kwesịrị ekwesị ma ọ bụ ReplicaSet - mana ọ bụ usoro ntuziaka.
Kubernetes na-enye ohere ka etinyere ngwa ngwa na-akpaghị aka (ya bụ, Pods na ntinye ma ọ bụ ReplicaSet) n'ụzọ nkwupụta site na iji nkọwapụta Horizontal Pod Autoscaler. Ụkpụrụ ndabara maka ịchacha akpaka bụ metrik ojiji CPU (metrics metrics), mana ị nwere ike jikọta metrik omenala na nke a na-enye na mpụga.
otu Kubernetes aaS sitere na Mail.ru tụgharịrị asụsụ edemede maka otu esi eji metrik mpụga iji tụọ ngwa Kubernetes na-akpaghị aka. Iji gosi ka ihe niile si arụ ọrụ, onye odee na-eji metrik nweta arịrịọ HTTP, nke anakọtara site na iji Prometheus.
Kama ịmegharị akpaaka kwụ ọtọ, Kubernetes Event Driven Autoscaling (KEDA) na-eji, onye ọrụ Kubernetes mepere emepe. Ọ na-ejikọta ya na Horizontal Pod Autoscaler iji nye autoscaling enweghị nkebi (gụnyere na / site na efu) maka ibu ọrụ na-ebute mmemme. Koodu dị na GitHub.
Nchịkọta nkenke nke usoro ahụ
Eserese ahụ na-egosi nkọwa dị nkenke nke ka ihe niile si arụ ọrụ:
Ngwa a na-enye metric hit HTTP n'ụdị Prometheus.
A haziri Prometheus ịnakọta metrik ndị a.
A haziri Prometheus scaler na KEDA ka ọ tụọ ngwa ngwa ngwa dabere na ọnụọgụ HTTP hits.
Ugbu a, m ga-agwa gị n'ụzọ zuru ezu banyere nke ọ bụla mmewere.
KEDA na Prometheus
Prometheus bụ ngwa nleba anya na nleba anya sistemụ mepere emepe, akụkụ Ngwé ojii Ngwá Ọrụ Ngwá Ọrụ. Na-anakọta metrik site na isi mmalite dị iche iche ma chekwaa ya ka data usoro oge. Iji hụ data ị nwere ike iji Grafana ma ọ bụ ngwaọrụ ọhụụ ndị ọzọ na-arụ ọrụ na Kubernetes API.
KEDA na-akwado echiche nke scaler - ọ na-arụ ọrụ dị ka àkwà mmiri n'etiti KEDA na usoro mpụga. Mmezu nke scaler bụ kpọmkwem maka sistemụ ebumnuche ọ bụla wee wepụta data na ya. KEDA na-eji ha na-ejikwa nha akpaka.
Scalers na-akwado ọtụtụ isi mmalite data, dịka ọmụmaatụ, Kafka, Redis, Prometheus. Nke ahụ bụ, enwere ike iji KEDA mee ka mkpokọta Kubernetes na-akpaghị aka na-eji Prometheus metrics dị ka njirisi.
Ngwa nwale
Ngwa ule Golang na-enye ohere site na HTTP ma rụọ ọrụ abụọ dị mkpa:
Na-eji ọbá akwụkwọ ndị ahịa Prometheus Go iji rụọ ngwa a wee weta metric http_requests, nke nwere ọnụ ọgụgụ dị egwu. Ebe njedebe ebe Prometheus metrics dị na URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Na nzaghachi maka arịrịọ GET ngwa a na-abawanye uru igodo (access_count) na Redis. Nke a bụ ụzọ dị mfe iji rụọ ọrụ ahụ dịka akụkụ nke onye na-ahụ maka HTTP ma lelee Prometheus metrics. Uru metrik ga-abụrịrị otu ihe ahụ access_count na Redis.
The scaler na-arụ ọrụ dị ka àkwà mmiri dị n'etiti KEDA na usoro mpụga nke achọrọ iji nweta metrics. ScaledObject bụ akụrụngwa omenala nke kwesịrị ibunye iji mekọrịta ntinye ya na isi mmalite ihe omume, na nke a Prometheus.
ScaledObject nwere ozi nlegharị anya, metadata isi mmalite mmemme (dị ka nzuzo njikọ, aha kwụ n'ahịrị), oge ntuli aka, oge mgbake na data ndị ọzọ. Ọ na-ebute ihe enyemaka autoscaling kwekọrọ (HPA definition) iji tụọ ntinye ya.
Mgbe ihe ScaledObject ehichapụrụ, a kpochapụrụ nkọwa HPA kwekọrọ.
Nke a bụ nkọwa ScaledObject maka ihe atụ anyị, ọ na-eji ihe nrịbama Prometheus:
Ụdị mkpali - Prometheus. Akpọrọ adreesị ihe nkesa Prometheus yana aha metrik, ọnụ ụzọ na Ajụjụ PromQL, nke a ga-eji. Ajụjụ PromQL - sum(rate(http_requests[2m])).
Dị ka pollingInterval,KEDA na-arịọ maka ebumnuche n'aka Prometheus kwa sekọnd iri na ise ọ bụla. Ọ dịkarịa ala otu n'okpuru (minReplicaCount), na ọnụ ọgụgụ kachasị nke pọd anaghị agafe maxReplicaCount (na ihe atụ a - iri).
Enwere ike itinye ya minReplicaCount nhata ka efu. N'okwu a, KEDA na-arụ ọrụ ntinye efu-na-otu wee kpughee HPA maka nhazigharị akpaaka ọzọ. Usoro ntụgharị ahụ nwekwara ike, ya bụ, ịcha site na otu gaa na efu. Na ọmụmaatụ, anyị ahọrọghị efu n'ihi na nke a bụ ọrụ HTTP ọ bụghị usoro achọrọ.
Anwansi dị n'ime autoscaling
A na-eji ọnụ ụzọ eme ihe dị ka ihe na-akpali akpali iji mee ka ntinye ahụ dị elu. N'ihe atụ anyị, ajụjụ PromQL sum(rate (http_requests [2m])) weghachite ọnụego arịrịọ HTTP achịkọtara (arịrịọ kwa nkeji), tụrụ n'ime nkeji abụọ gara aga.
Ebe ọ bụ na ọnụ ahịa ọnụ ụzọ bụ atọ, ọ pụtara na a ga-enwe otu n'okpuru mgbe uru ahụ sum(rate (http_requests [2m])) ihe na-erughị atọ. Ọ bụrụ na ọnụ ahịa na-abawanye, a na-agbakwunye mgbakwunye mgbakwunye oge ọ bụla sum(rate (http_requests [2m])) na-abawanye site na atọ. Dịka ọmụmaatụ, ọ bụrụ na uru sitere na 12 ruo 14, mgbe ahụ, ọnụ ọgụgụ nke pọd bụ anọ.
Ugbu a, ka anyị gbalịa ịhazi ya!
presetting
Naanị ihe ị chọrọ bụ ụyọkọ Kubernetes na akụrụngwa ahaziri kubectl. Ihe atụ a na-eji ụyọkọ minikube, ma ị nwere ike were nke ọ bụla ọzọ. Iji wụnye ụyọkọ enwere njikwa.
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
Lelee na ihe niile amalitela:
kubectl get pods -l=app=prometheus-server
Chere ka Prometheus banye na steeti Running.
Jiri kubectl port-forward iji nweta interface onye ọrụ Prometheus (ma ọ bụ ihe nkesa API) na http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Nsonaazụ dị ka nke a:
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"
Lelee n'okpuru ngwa. Otu ihe atụ ga-agba ọsọ n'ihi na minReplicaCount nha 1:
kubectl get pods -l=app=go-prom-app
Chọpụta na emepụtara akụrụngwa HPA nke ọma:
kubectl get hpa
Ị ga-ahụ ihe dị ka:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Ị nwere ike nweta ngwa Go gị site na iji adreesị http://localhost:8080. Iji mee nke a, gbanye iwu:
curl http://localhost:8080/test
Nsonaazụ dị ka nke a:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
N'oge a, leleekwa Redis. Ị ga-ahụ igodo ahụ access_count abawanye na 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Gbaa mbọ hụ na uru metric bụ http_requests otu ihe:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
N'okwu a, nsonaazụ ya bụ 1,686057971014493 a na-egosipụtakwa n'ọhịa value. Nke a ezughị maka ịchacha, ebe ọ bụ na ọnụ ụzọ anyị debere bụ 3.
Ibu ọzọ!
N'ọnụ ọnụ ọhụrụ ahụ, nyochaa ọnụ ọgụgụ pọd ngwa:
kubectl get pods -l=app=go-prom-app -w
Ka anyị bulie ibu site na iji iwu:
./hey -n 2000 http://localhost:8080/test
Mgbe obere oge gachara, ị ga-ahụ HPA ka ọ na-ebunye ọkwa ahụ yana ịmalite pọd ọhụrụ. Lelee HPA gị ka ijide n'aka:
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
Ọ bụrụ na ibu ahụ na-ekwekọghị ekwekọ, a ga-ebelata ntinye ya ruo ebe naanị otu pọd na-agba ọsọ. Ọ bụrụ na ịchọrọ ịlele metric n'ezie (nke ajụjụ PromQL weghachiri), wee jiri iwu a:
//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
nkwubi
KEDA na-enye gị ohere ịbawanye ntinye nke Kubernetes gị ozugbo (ruo/site na efu) dabere na data sitere na metrik mpụga. Dịka ọmụmaatụ, dabere na metrics Prometheus, ogologo kwụ n'ahịrị na Redis, latency ndị ahịa na isiokwu Kafka.
KEDA jikọtara ya na isi mmalite ma na-enyekwa metrik ya site na Metrics Server na Horizontal Pod Autoscaler.