He koi nui ka Scalability no nā noi ao. Me nā Kubernetes, maʻalahi ka hoʻonui ʻana i kahi noi e like me ka hoʻonui ʻana i ka nui o nā replicas no ka hoʻonohonoho kūpono a i ʻole. ReplicaSet - akā, he kaʻina hana lima.
Hāʻawi ʻo Kubernetes i nā noi e hoʻonui ʻia (ʻo ia hoʻi ReplicaSet) ma ke ʻano hoʻolaha me ka hoʻohana ʻana i ka kikoʻī Horizontal Pod Autoscaler. ʻO ka helu paʻamau no ka hoʻonui ʻana i ka maʻamau ʻo ia nā metric hoʻohana CPU (nā kumu waiwai), akā hiki iā ʻoe ke hoʻohui i nā metric maʻamau a hāʻawi ʻia i waho.
hui Kubernetes aaS mai Mail.ru unuhi i ka ʻatikala e pili ana i ka hoʻohana ʻana i nā ana waho e hoʻonui ʻakomi i kahi noi Kubernetes. No ka hōʻike ʻana i ka hana ʻana o nā mea āpau, hoʻohana ka mea kākau i nā metric noi noi komo HTTP, i hōʻiliʻili ʻia me ka hoʻohana ʻana iā Prometheus.
Ma kahi o ka hoʻokaʻawale autoscaling o nā pods, hoʻohana ʻia ʻo Kubernetes Event Driven Autoscaling (KEDA), kahi mea hoʻohana Kubernetes open source. Hoʻohui maoli ia me ka Horizontal Pod Autoscaler e hāʻawi i ka autoscaling maʻemaʻe (me ka / mai ka zero) no nā haʻahaʻa hana. Loaʻa ke code ma GitHub.
ʻIke pōkole o ka ʻōnaehana
Hōʻike ke kiʻikuhi i kahi wehewehe pōkole o ka hana ʻana o nā mea a pau:
Hāʻawi ka palapala noi i nā helu helu helu HTTP ma Prometheus format.
Hoʻonohonoho ʻia ʻo Prometheus e hōʻiliʻili i kēia mau ana.
Hoʻonohonoho ʻia ka scaler Prometheus ma KEDA e hoʻonui i ka noi ma muli o ka helu o HTTP hits.
I kēia manawa e haʻi aku wau iā ʻoe i nā kikoʻī e pili ana i kēlā me kēia mea.
KEDA a me Prometheus
ʻO Prometheus kahi ʻōnaehana wehe ʻana i ka ʻōnaehana mālama a me ka mea hana makaʻala, ʻāpana Ka Papahana Hoʻonohonoho ʻInikua Kapua. E hōʻiliʻili i nā metric mai nā kumu like ʻole a mālama iā lākou ma ke ʻano he ʻikepili manawa. No ka nānā ʻana i ka ʻikepili hiki iā ʻoe ke hoʻohana grafana a i ʻole nā mea hana ʻike ʻē aʻe e hana pū me ka Kubernetes API.
Kākoʻo ʻo KEDA i ka manaʻo o ka scaler - he alahaka ma waena o KEDA a me ka ʻōnaehana waho. He kiko'ī ka hoʻokō scaler i kēlā me kēia ʻōnaehana i hoʻopaʻa ʻia a unuhi i ka ʻikepili mai ia mea. A laila hoʻohana ʻo KEDA iā lākou e hoʻomalu i ka scaling maʻalahi.
Kākoʻo nā Scalers i nā kumu ʻikepili he nui, no ka laʻana, Kafka, Redis, Prometheus. ʻO ia hoʻi, hiki ke hoʻohana ʻia ke KEDA no ka hoʻonui ʻana i nā hoʻolaha Kubernetes me ka hoʻohana ʻana i nā metric Prometheus ma ke ʻano he pae hoʻohālike.
Noi hoao
Hāʻawi ka palapala hoʻokolohua Golang i ke komo ma o HTTP a hana i ʻelua mau hana koʻikoʻi:
Hoʻohana i ka waihona mea kūʻai Prometheus Go e hoʻohana i ka palapala noi a hāʻawi i ka metric http_requests, aia kahi helu pā. Aia ka helu hope i loaʻa ai nā metric Prometheus ma ka URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
I ka pane ʻana i kahi noi GET hoʻonui ka noi i ka waiwai o ke kī (access_count) ma Redis. He ala maʻalahi kēia e hana ai i ka hana ma ke ʻano he mea lawelawe HTTP a nānā pū i nā metric Prometheus. Pono e like ka waiwai me ka waiwai access_count ma Redis.
ʻO ka scaler ke alahaka ma waena o KEDA a me ka ʻōnaehana waho kahi e loaʻa ai nā ana. ScaledObject he kumu waiwai maʻamau e pono e hoʻokaʻawale ʻia e hoʻonohonoho i ka hoʻoili ʻana me ke kumu hanana, i kēia hihia Prometheus.
ScaledObject Loaʻa i ka ʻike hoʻolalelale ʻana, ka metadata kumu hanana (e like me nā mea huna pili, ka inoa queue), ka wā koho, ka manawa hoʻihoʻi, a me nā ʻikepili ʻē aʻe. Loaʻa ia i ka waiwai autoscaling e pili ana (ka wehewehe HPA) e hoʻonui i ka hoʻolālā.
Ina he mea ScaledObject holoi ʻia, holoi ʻia ka wehewehe HPA pili.
Eia ka wehewehe ScaledObject no kā mākou laʻana, hoʻohana ia i kahi scaler Prometheus:
Kuhikuhi ʻo ia iā Deployment Me ka inoa go-prom-app.
ʻAno hoʻāla - Prometheus. Ua ʻōlelo ʻia ka helu kikowaena Prometheus me ka inoa metric, paepae a me Nīnau PromQL, e hoʻohana ʻia. Nīnau PromQL - sum(rate(http_requests[2m])).
Wahi a pollingInterval, Noi ʻo KEDA i ka pahuhopu mai Prometheus i kēlā me kēia ʻumikumamālima kekona. Ma lalo o hoʻokahi (minReplicaCount), a ʻaʻole i ʻoi aku ka nui o nā pods maxReplicaCount (i kēia laʻana - ʻumi).
Hiki ke hoʻouka minReplicaCount like me ka ʻole. I kēia hihia, hoʻāla ʻo KEDA i ka hoʻolaha ʻana i ka zero-a-one a laila e hōʻike i ka HPA no ka hoʻonui ʻana i ka ʻakomi. Hiki nō hoʻi ke kaʻina hoʻohuli, ʻo ia hoʻi, ka hoʻonui ʻana mai kahi a i ʻole. I ka laʻana, ʻaʻole mākou i koho i ka zero no ka mea he lawelawe HTTP kēia a ʻaʻole kahi ʻōnaehana koi.
ʻO ke kilokilo i loko o ka autoscaling
Hoʻohana ʻia ka paepae ma ke ʻano he kumu e hoʻonui ai i ka hoʻolaha. Ma kā mākou hiʻohiʻona, ka nīnau PromQL sum(rate (http_requests [2m])) hoʻihoʻi i ka helu noi HTTP aggregated (noi i kekona), ana ʻia i nā minuke ʻelua i hala.
No ka mea he ʻekolu ka waiwai o ka paepae, ʻo ia hoʻi, aia kekahi ma lalo o ka waiwai sum(rate (http_requests [2m])) emi mai ka ekolu. Inā piʻi ka waiwai, hoʻohui ʻia kahi sub i kēlā me kēia manawa sum(rate (http_requests [2m])) piʻi ʻekolu. No ka laʻana, inā mai 12 a 14 ka waiwai, a laila ʻehā ka helu o nā pods.
I kēia manawa e hoʻāʻo kāua e hoʻonohonoho!
presetting
ʻO nā mea a pau āu e makemake ai he pūʻulu Kubernetes a me kahi pono i hoʻonohonoho ʻia kubectl. Hoʻohana kēia laʻana i kahi pūʻulu minikube, akā hiki iā ʻoe ke lawe i kekahi. No ka hoʻokomo ʻana i kahi pūʻulu aia alakaʻi.
helm init hoʻomaka i ke kikowaena laina kauoha kūloko a hoʻokomo pū Tiller i ka hui Kubernetes.
kubectl get pods -n kube-system | grep tiller
E kali no ke komo ʻana o ka Pod Tiller i ka mokuʻāina holo.
Palapala unuhi: Hoʻohana ka mea kākau iā Helm@2, kahi e pono ai e hoʻokomo i ka ʻāpana kikowaena Tiller. I kēia manawa kūpono ʻo Helm@3, ʻaʻole ia e koi i kahi ʻāpana kikowaena.
Ma hope o ka hoʻokomo ʻana iā Helm, ua lawa kahi kauoha e hoʻomaka iā 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
E nānā ua hoʻomaka nā mea a pau:
kubectl get pods -l=app=prometheus-server
E kali iā Prometheus e hele i ka moku'āina Running.
E hoʻohana kubectl port-forward e komo i ka Prometheus mea hoʻohana (a i ʻole API server) ma http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
ʻO ka hopena e like me kēia:
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"
E nānā ma lalo o nā noi. Pono e holo kekahi laʻana no ka mea minReplicaCount like 1:
kubectl get pods -l=app=go-prom-app
E hōʻoia i ka hana pono ʻana o ka punawai HPA:
kubectl get hpa
Pono ʻoe e ʻike i kekahi mea e like me:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Nānā olakino: komo i ka noi
No ke kiʻi ʻana i ka palena hope REST o kā mākou noi, holo:
Hiki iā ʻoe ke komo i kāu polokalamu Go me ka hoʻohana ʻana i ka helu wahi http://localhost:8080. No ka hana ʻana i kēia, e holo i ke kauoha:
curl http://localhost:8080/test
ʻO ka hopena e like me kēia:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
I kēia manawa e nānā pū iā Redis. E ʻike ʻoe i ke kī access_count hoʻonui i ka 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
E hōʻoia i ka waiwai metric http_requests ka mea like:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Hoʻouka ʻia
E hoʻohana mākou Hey — mea pono no ka hana ana i ka ukana:
I kēia hihia ka hopena maoli 1,686057971014493 a hōʻike ʻia ma ke kahua value. ʻAʻole lawa kēia no ka hoʻonui ʻana, ʻoiai ʻo ka paepae a mākou i hoʻonohonoho ai he 3.
Hoʻouka hou aku!
Ma ka pahu hou, e nānā i ka helu o nā pods noi:
kubectl get pods -l=app=go-prom-app -w
E hoʻonui i ka ukana me ke kauoha:
./hey -n 2000 http://localhost:8080/test
Ma hope o kekahi manawa, e ʻike ʻoe iā HPA e hoʻonui ana i ka hoʻolaha ʻana a me ka hoʻokuʻu ʻana i nā pods hou. E nānā i kāu HPA no ka ʻike:
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
Inā ʻaʻole kūlike ka ukana, e hoʻemi ʻia ka hoʻolaha ʻana i kahi e holo ana hoʻokahi pod. Inā makemake ʻoe e nānā i ka metric maoli (hoʻihoʻi ʻia e ka nīnau PromQL), a laila e hoʻohana i ke kauoha:
//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
hopena
Hiki iā KEDA ke ho'onui 'akomi i kāu ho'olālā Kubernetes (i/mai ka 'ole) ma muli o ka 'ikepili mai nā ana o waho. No ka laʻana, e pili ana i nā metric Prometheus, ka lōʻihi o ka pila ma Redis, ka latency o nā mea kūʻai aku ma ke kumuhana Kafka.
Hoʻohui pū ʻo KEDA me kahi kumu waho a hāʻawi pū i kāna mau ana ma o Metrics Server i Horizontal Pod Autoscaler.