Scalability ndichinthu chofunikira kwambiri pamapulogalamu amtambo. Ndi Kubernetes, kukulitsa pulogalamu ndikosavuta monga kuwonjezera kuchuluka kwa zofananira zomwe zikuyenera kutumizidwa kapena ReplicaSet - koma ndi ndondomeko yamanja.
Kubernetes imalola kuti mapulogalamu azingodziwongoleredwa okha (ie Pods mu kutumiza kapena ReplicaSet) m'njira yolengeza pogwiritsa ntchito mafotokozedwe a Horizontal Pod Autoscaler. Mulingo wokhazikika pakukulitsa kokha ndi ma metric kagwiritsidwe ntchito a CPU (ma metrics azinthu), koma mutha kuphatikiza ma metric omwe amaperekedwa kunja.
timu Kubernetes aaS kuchokera ku Mail.ru adamasulira nkhani yamomwe mungagwiritsire ntchito ma metric akunja kuti muwonjezere pulogalamu ya Kubernetes. Kuti awonetse momwe zonse zimagwirira ntchito, wolemba amagwiritsa ntchito ma metrics ofunsira HTTP, omwe amasonkhanitsidwa pogwiritsa ntchito Prometheus.
M'malo mongoyang'ana ma pod, Kubernetes Event Driven Autoscaling (KEDA) imagwiritsidwa ntchito, wotsegulira gwero la Kubernetes. Imaphatikizana mwachilengedwe ndi Horizontal Pod Autoscaler kuti ipereke mawonekedwe osasunthika (kuphatikiza mpaka/kuchokera ku ziro) pazantchito zoyendetsedwa ndi zochitika. Kodi ikupezeka pa GitHub.
Pulogalamuyi imapereka ma metric owerengera a HTTP mumtundu wa Prometheus.
Prometheus idakonzedwa kuti itenge ma metrics awa.
Prometheus scaler mu KEDA imakonzedwa kuti izingowonjezera pulogalamuyo potengera kuchuluka kwa kugunda kwa HTTP.
Tsopano ndikuwuzani mwatsatanetsatane za chinthu chilichonse.
KEDA ndi Prometheus
Prometheus ndi njira yotseguka yowunikira ndi kuchenjeza zida, gawo Cloud Native Computing Foundation. Imasonkhanitsa ma metrics kuchokera kuzinthu zosiyanasiyana ndikusunga ngati data yanthawi. Kuti muwone zithunzi zomwe mungagwiritse ntchito grafana kapena zida zina zowonera zomwe zimagwira ntchito ndi Kubernetes API.
KEDA imathandizira lingaliro la scaler - imakhala ngati mlatho pakati pa KEDA ndi dongosolo lakunja. Kukhazikitsa kwa scaler kumakhala kwachindunji pa dongosolo lililonse lachindunji ndikuchotsamo deta. KEDA ndiye amawagwiritsa ntchito kuwongolera makulitsidwe.
Ma Scalers amathandizira magwero angapo a data, mwachitsanzo, Kafka, Redis, Prometheus. Ndiye kuti, KEDA itha kugwiritsidwa ntchito kukulitsa kutumizidwa kwa Kubernetes pogwiritsa ntchito ma metric a Prometheus ngati njira.
Kuyesa ntchito
Ntchito yoyeserera ya Golang imapereka mwayi wofikira kudzera pa HTTP ndipo imagwira ntchito ziwiri zofunika:
Amagwiritsa ntchito laibulale ya kasitomala ya Prometheus Go kuti agwiritse ntchito ndikupereka http_requests metric, yomwe ili ndi kugunda. Mapeto pomwe ma metric a Prometheus amapezeka ali ku URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Poyankha pempho GET kugwiritsa ntchito kumawonjezera mtengo wa kiyi (access_count) ku Redis. Iyi ndi njira yosavuta yochitira ntchitoyo ngati gawo la wothandizira HTTP komanso onaninso ma metric a Prometheus. Mtengo wa metric uyenera kukhala wofanana ndi mtengowo access_count mu Redis.
Ntchitoyi imatumizidwa ku Kubernetes kudzera Deployment. Ntchito imapangidwanso ClusterIP, imalola seva ya Prometheus kupeza ma metrics ogwiritsira ntchito.
Scaler imagwira ntchito ngati mlatho pakati pa KEDA ndi dongosolo lakunja lomwe ma metric amafunikira. ScaledObject ndi chida chachizolowezi chomwe chiyenera kutumizidwa kuti chigwirizanitse kutumizidwa ndi gwero la chochitika, pankhaniyi Prometheus.
ScaledObject ili ndi zambiri zochulukirachulukira, metadata yoyambira zochitika (monga zinsinsi zamalumikizidwe, dzina la pamzere), nthawi yoponya mavoti, nthawi yochira, ndi data ina. Zimabweretsa gwero lofananira la autoscaling (kutanthauzira kwa HPA) kuti muwonjezere kutumizidwa.
Pamene chinthu ScaledObject imachotsedwa, tanthauzo lofananira la HPA limachotsedwa.
Apa pali tanthauzo ScaledObject kwa chitsanzo chathu, amagwiritsa ntchito scaler Prometheus:
Mtundu woyambitsa - Prometheus. Adilesi ya seva ya Prometheus imatchulidwa pamodzi ndi dzina la metric, poyambira ndi Funso la PromQL, zomwe zidzagwiritsidwe ntchito. Funso la PromQL - sum(rate(http_requests[2m])).
Malingana ndi pollingInterval,KEDA imapempha chandamale kuchokera kwa Prometheus masekondi khumi ndi asanu aliwonse. Mmodzi pansi (minReplicaCount), ndipo kuchuluka kwa ma pod sikudutsa maxReplicaCount (mu chitsanzo ichi - khumi).
Ikhoza kukhazikitsidwa minReplicaCount zofanana ndi ziro. Pamenepa, KEDA imayendetsa kutumizidwa kwa ziro-to-mmodzi ndikuwulula HPA kuti ichulukitsenso. Dongosolo lakumbuyo ndilothekanso, ndiye kuti, kukweza kuchokera pa imodzi kupita ku ziro. Mu chitsanzo, sitinasankhe zero chifukwa iyi ndi ntchito ya HTTP osati yofunidwa.
Matsenga mkati mwa autoscaling
Chidacho chimagwiritsidwa ntchito ngati chiwongolero kuti chiwonjezeke. Mu chitsanzo chathu, funso la PromQL sum(rate (http_requests [2m])) imabweretsanso kuchuluka kwa pempho la HTTP (zopempha pamphindikati), zoyezedwa pamphindi ziwiri zapitazi.
Popeza mtengo wapakati ndi atatu, zikutanthauza kuti padzakhala imodzi pansi pomwe mtengowo sum(rate (http_requests [2m])) osakwana atatu. Ngati mtengo ukuwonjezeka, gawo lowonjezera limawonjezeredwa nthawi iliyonse sum(rate (http_requests [2m])) kuchuluka katatu. Mwachitsanzo, ngati mtengo umachokera ku 12 mpaka 14, ndiye kuti chiwerengero cha pods ndi zinayi.
Tsopano tiyeni tiyese kuyikhazikitsa!
kukhazikitsa
Zomwe mukufunikira ndi gulu la Kubernetes ndi chida chokhazikitsidwa kubectl. Chitsanzo ichi chimagwiritsa ntchito masango minikube, koma mukhoza kutenga wina aliyense. Kukhazikitsa cluster pali kalozera.
helm init imayambitsa mawonekedwe a mzere wa malamulo amderalo ndikuyikanso Tiller ku gulu la Kubernetes.
kubectl get pods -n kube-system | grep tiller
Yembekezerani kuti Tiller pod alowe mu Running state.
Ndemanga za womasulira: Wolemba amagwiritsa ntchito Helm@2, zomwe zimafuna kuti gawo la seva la Tiller likhazikitsidwe. Tsopano Helm @ 3 ndiyofunikira, sifunika gawo la seva.
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
Onetsetsani kuti zonse zayamba:
kubectl get pods -l=app=go-prom-app
Yembekezerani Redis kulowa boma Running.
Kutumiza Seva ya Prometheus
Mawonekedwe a Prometheus amagwiritsa ntchito Kubernetes Service Discovery ya Prometheus. Zimalola kupezeka kwamphamvu kwa ma pods ogwiritsira ntchito kutengera chizindikiro chautumiki.
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
Onetsetsani kuti zonse zayamba:
kubectl get pods -l=app=prometheus-server
Dikirani kuti Prometheus apite ku boma Running.
Gwiritsani ntchito kubectl port-forward kuti mupeze mawonekedwe a Prometheus (kapena seva ya API) pa http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Zotsatira zake zikuwoneka motere:
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"
Onani pansi pa mapulogalamu. Chitsanzo chimodzi chiyenera kukhala chikuyenda chifukwa minReplicaCount zikufanana ndi 1:
kubectl get pods -l=app=go-prom-app
Tsimikizirani kuti zida za HPA zidapangidwa bwino:
kubectl get hpa
Muyenera kuwona chinthu chonga:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Kuwona zaumoyo: mwayi wogwiritsa ntchito
Kuti mupeze mapeto a pulogalamu yathu ya REST, thamangani:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Onetsetsani kuti mtengo wa metric ndi http_requests momwemonso:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Katundu Kulenga
Tidzagwiritsa ntchito Hei - Zothandizira kupanga katundu:
//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
Pomaliza
KEDA imakulolani kuti muzitha kukulitsa ma Kubernetes (kuyambira/kuchokera ku ziro) kutengera ma metric akunja. Mwachitsanzo, kutengera ma metric a Prometheus, kutalika kwa mzere ku Redis, kuchedwa kwa ogula pamutu wa Kafka.
KEDA imaphatikizana ndi gwero lakunja komanso imaperekanso ma metrics ake kudzera pa Metrics Server kupita ku Horizontal Pod Autoscaler.