Ko te tauineine he whakaritenga matua mo nga tono kapua. Ki nga Kubernetes, he ngawari noa iho te whakamaarama i tetahi tono penei i te whakanui ake i te maha o nga tauira mo te whakatakotoranga tika, ReplicaSet — engari he mahi a-ringa.
Ka whakaaetia e Kubernetes nga tono kia whakahiahia aunoatia (arā, Pods i roto i te horahanga ReplicaSet) i roto i te tikanga whakapuakanga ma te whakamahi i te whakatakotoranga Whakapae Pod Autoscaler. Ko te paearu taunoa mo te tauine aunoa ko nga inenga whakamahi PTM (rauemi rauemi), engari ka taea e koe te whakauru i nga inenga ritenga me nga inenga o waho.
rōpū Kubernetes aaS mai i Mail.ru i whakamaoritia he tuhinga mo te whakamahi i nga inenga o waho ki te tauine aunoa i te tono Kubernetes. Hei whakaatu i te mahi o nga mea katoa, ka whakamahia e te kaituhi nga inenga tono urunga HTTP, ka kohia ma te whakamahi i te Prometheus.
Hei utu mo te whakahiato-aunoa o nga poro, ka whakamahia te Kubernetes Event Driven Autoscaling (KEDA), he kaiwhakahaere Kubernetes puna tuwhera. Ka tuitui taketake me te Horizontal Pod Autoscaler ki te whakarato i te whakakao aunoa (tae atu ki te/mai i te kore) mo nga kawenga mahi-a-takahanga. Waehere e waatea ana i GitHub.
He tirohanga poto mo te punaha
E whakaatu ana te hoahoa i te whakaahuatanga poto mo te mahi o nga mea katoa:
Ka whakaratohia e te tono nga inenga tatauranga hit HTTP i roto i te whakatakotoranga Prometheus.
Kua whirihorahia a Prometheus ki te kohikohi i enei inenga.
Ko te Prometheus scaler i KEDA kua whirihorahia ki te tauine aunoa i te tono i runga i te maha o nga whiu HTTP.
Inaianei ka korero au ki a koe mo ia huānga.
KEDA me Prometheus
Ko te Prometheus he punaha punaha tuwhera mo te tirotiro me te kete taputapu mataara, he waahanga Kapua Te Punaha Rorohiko Rapu. Ka kohia nga inenga mai i nga momo puna ka penapena hei raraunga raupapa wa. Hei tiro i nga raraunga ka taea e koe te whakamahi Karepe etahi atu taputapu whakaata ranei e mahi ana me te Kubernetes API.
Kei te tautoko a KEDA i te ariā o te tauine - ka noho hei piriti i waenga i te KEDA me te punaha o waho. Ko te whakatinanatanga o te scaler he mea motuhake ki ia punaha whaainga me te tango raraunga mai i a ia. Ka whakamahia e KEDA ki te whakahaere i te tauine aunoa.
Ka tautokohia e nga kaitarai nga puna raraunga maha, hei tauira, Kafka, Redis, Prometheus. Arā, ka taea te whakamahi KEDA ki te āwhata aunoa i ngā tukunga Kubernetes mā te whakamahi i ngā inenga Prometheus hei paearu.
Tono whakamatautau
Ko te tono whakamatautau a Golang e tuku uru ana ma te HTTP me te mahi i nga mahi nui e rua:
Ka whakamahi i te whare pukapuka kiritaki a Prometheus Go ki te whakamahi i te tono me te whakarato i te inenga http_requests, kei roto he tatau pa. Kei te URI te waahi mutunga kei te waatea nga inenga Prometheus /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Hei whakautu mo te tono GET ka whakanui te tono i te uara o te matua (access_count) i Redis. He huarahi ngawari tenei ki te mahi i nga mahi hei waahanga o te kaihautu HTTP me te tirotiro hoki i nga inenga Prometheus. Me rite te uara ine ki te uara access_count i Redis.
Ka noho te kaiwhatu hei piriti i waenga i te KEDA me te punaha o waho e tika ana kia whiwhi inenga. ScaledObject he rauemi ritenga e tika ana kia tukuna ki te tukutahi i te tukunga me te puna takahanga, i tenei keehi ko Prometheus.
ScaledObject kei roto nga korero whakahiatotanga, metadata puna takahanga (pēnei i nga mea ngaro hononga, ingoa tūtira), wa pooti, wa whakaora, me etahi atu raraunga. Ka puta ko te rauemi whakahiato-aunoa e rite ana (whakamaramatanga HPA) hei tauine i te horahanga.
Ina he ahanoa ScaledObject kua mukua, kua whakawāteatia te whakamāramatanga HPA e hāngai ana.
Anei te whakamāramatanga ScaledObject mo ta tatou tauira, ka whakamahia he tauine Prometheus:
Momo keu - Prometheus. Kei te whakahuahia te wahitau tūmau Prometheus me te ingoa ineine, te paepae me te Uiui PromQL, ka whakamahia. Uiui PromQL - sum(rate(http_requests[2m])).
E ai ki pollingInterval, Ka tono a KEDA i tetahi whaainga mai i a Prometheus ia tekau ma rima hēkona. Kia kotahi i raro (minReplicaCount), karekau e nui ake te maha o nga poti maxReplicaCount (i tenei tauira - tekau).
Ka taea te whakauru minReplicaCount rite ki te kore. I tenei keehi, ka whakahohehia e KEDA te tukunga kore-ki-tetahi katahi ka whakaatu i te HPA mo te whakatikatika aunoa. Ka taea hoki te raupapa whakamuri, ara, te tauine mai i te kotahi ki te kore. I roto i te tauira, kaore matou i whiriwhiri i te kore no te mea he ratonga HTTP tenei, ehara i te punaha tono.
Ko te makutu i roto i te tauine aunoa
Ka whakamahia te paepae hei keu ki te whakarahi i te horahanga. I roto i ta maatau tauira, ko te patai PromQL sum(rate (http_requests [2m])) ka whakahoki i te reiti tono HTTP whakahiato (tono mo ia hekona), i ine i nga meneti e rua kua hipa.
I te mea ko te uara paepae e toru, ko te tikanga ka kotahi i raro i te waa o te uara sum(rate (http_requests [2m])) iti iho i te toru. Mena ka piki ake te uara, ka taapirihia he taapiri i ia wa sum(rate (http_requests [2m])) ka piki ma te toru. Hei tauira, mena mai i te 12 ki te 14 te uara, ka wha te maha o nga pene.
Inaianei me ngana ki te whakarite!
Tuhinga o mua
Ko nga mea katoa e hiahiatia ana e koe ko te roopu Kubernetes me tetahi taputapu whirihora kubectl. Ka whakamahia e tenei tauira he tautau minikube, engari ka taea e koe te tango i tetahi atu. Hei whakauru i te tautau kei reira rangatira.
helm init ka arawhiti i te atanga raina whakahau a rohe me te whakauru ano hoki Tiller ki te kāhui Kubernetes.
kubectl get pods -n kube-system | grep tiller
Tatari kia uru te Pokao Tiller ki te ahua Rere.
Panui a te kaiwhakamaori: Ka whakamahi te kaituhi i a Helm@2, e hiahia ana kia whakauruhia te waahanga tūmau Tiller. Inaianei he mea tika a Helm@3, kaore e hiahiatia he waahanga tūmau.
Whai muri i te whakauru i te Helm, kotahi te whakahau hei timata i a 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
Tirohia kua timata nga mea katoa:
kubectl get pods -l=app=prometheus-server
Taria kia haere a Prometheus ki te kawanatanga Running.
Whakamahia kubectl port-forward ki te uru ki te atanga kaiwhakamahi Prometheus (tūmau API ranei) i http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
He penei te ahua o te hua:
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"
Tirohia i raro i nga tono. Me rere tetahi tauira na te mea minReplicaCount rite 1:
kubectl get pods -l=app=go-prom-app
Manatokohia kua tutuki pai te hanga rauemi HPA:
kubectl get hpa
Me kite koe i tetahi mea penei:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Tirohanga hauora: uru tono
Hei uru atu ki te waahi mutunga REST o ta maatau tono, whakahaere:
Ka taea e koe te uru atu ki to taupānga Haere ma te whakamahi i te wahitau http://localhost:8080. Ki te mahi i tenei, whakahaerehia te whakahau:
curl http://localhost:8080/test
He penei te ahua o te hua:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
I tenei wa tirohia ano a Redis. Ka kite koe ko te ki access_count kua piki ki te 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Me mohio ko te uara ine http_requests rite tonu:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Waihanga Utaina
Ka whakamahia e matou hey — whaipainga mo te whakaputa kawenga:
I tenei keehi ko te hua tuturu 1,686057971014493 ka whakaatuhia ki te mara value. He iti rawa tenei mo te whakatauine, i te mea ko te paepae i whakaritea e matou ko te 3.
He kawenga ake!
I roto i te tauranga hou, aroturuki i te maha o nga putunga tono:
kubectl get pods -l=app=go-prom-app -w
Me whakanui ake te uta ma te whakamahi i te whakahau:
./hey -n 2000 http://localhost:8080/test
Whai muri i etahi wa, ka kite koe i te HPA e whakaheke ana i te tukunga me te whakarewa i nga putunga hou. Tirohia to HPA kia mohio ai:
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
Mena kaore i te rite te kawenga, ka whakahekehia te tukunga ki te waahi kotahi anake te putunga e rere ana. Mena kei te pirangi koe ki te tirotiro i te ine tika (i whakahokia mai e te patai PromQL), katahi ka whakamahi i te whakahau:
//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
mutunga
Ma te KEDA ka taea e koe te whakarahi aunoa i o tukunga Kubernetes (ki/mai i te kore) i runga i nga raraunga mai i nga inenga o waho. Hei tauira, i runga i nga inenga Prometheus, te roa o te tutira i Redis, te roanga o nga kaihoko ki te kaupapa Kafka.
Kei te whakauru a KEDA ki tetahi puna o waho me te whakarato hoki i ana inenga na roto i te Tūmau Metrics ki te Horizontal Pod Autoscaler.