Scalability shine mabuɗin mahimmanci don aikace-aikacen girgije. Tare da Kubernetes, ƙaddamar da aikace-aikacen yana da sauƙi kamar ƙara adadin kwafi don ƙaddamar da ya dace ko ReplicaSet - amma tsari ne na hannu.
Kubernetes yana ba da damar haɓaka aikace-aikacen ta atomatik (watau Pods a cikin turawa ko ReplicaSet) a cikin hanyar sanarwa ta amfani da ƙayyadaddun ƙayyadaddun Pod Autoscaler na Horizontal. Ma'auni na tsoho don sikelin atomatik shine ma'aunin amfani da CPU (ma'auni na albarkatu), amma kuna iya haɗa ma'auni na al'ada da na waje.
tawagar Kubernetes aaS daga Mail.ru Fassara labarin kan yadda ake amfani da awo na waje don auna aikace-aikacen Kubernetes ta atomatik. Don nuna yadda komai ke aiki, marubucin yana amfani da ma'aunin neman damar HTTP, waɗanda aka tattara ta amfani da Prometheus.
Maimakon a kwance autoscaling na pods, Kubernetes Event Driven Autoscaling (KEDA) ana amfani da shi, ma'aikacin Kubernetes mai buɗewa. Yana haɗawa ta asali tare da Horizontal Pod Autoscaler don samar da autoscaling mara nauyi (ciki har da zuwa/daga sifili) don abubuwan da ke haifar da aukuwa. Akwai code a GitHub.
Takaitaccen bayanin tsarin
Jadawalin yana nuna taƙaitaccen bayanin yadda komai ke aiki:
Aikace-aikacen yana ba da ma'aunin ƙidayar hit HTTP a cikin tsarin Prometheus.
An saita Prometheus don tattara waɗannan ma'auni.
An saita ma'aunin Prometheus a cikin KEDA don yin girman aikace-aikacen ta atomatik bisa adadin hits HTTP.
Yanzu zan gaya muku dalla-dalla game da kowane kashi.
KEDA da Prometheus
Prometheus shine buɗaɗɗen tsarin sa ido da kayan aikin faɗakarwa, sashi Gidauniyar putididdigar ativeasar Cloud. Yana tattara awo daga tushe daban-daban kuma yana adana su azaman bayanan jerin lokaci. Don ganin bayanan za ku iya amfani da su Grafana ko wasu kayan aikin gani waɗanda ke aiki tare da Kubernetes API.
KEDA tana goyan bayan manufar ma'auni - yana aiki azaman gada tsakanin KEDA da tsarin waje. Aiwatar da ma'aunin ƙayyadaddun ƙayyadaddun tsarin kowane tsarin manufa kuma yana fitar da bayanai daga gare ta. Daga nan KEDA yana amfani da su don sarrafa sikelin atomatik.
Scalers suna tallafawa tushen bayanai da yawa, misali, Kafka, Redis, Prometheus. Wato, ana iya amfani da KEDA don daidaita ayyukan Kubernetes ta atomatik ta amfani da ma'aunin Prometheus azaman ma'auni.
Gwaji aikace-aikace
Aikace-aikacen gwajin Golang yana ba da dama ta hanyar HTTP kuma yana yin ayyuka masu mahimmanci guda biyu:
Yana amfani da ɗakin karatu na abokin ciniki na Prometheus Go don kayan aikin aikace-aikacen kuma ya samar da ma'aunin http_requests, wanda ya ƙunshi ƙidayar bugawa. Ƙarshen inda ake samun ma'aunin Prometheus yana a URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Dangane da wata bukata GET aikace-aikacen yana ƙara darajar maɓalli (access_count) in Redis. Wannan hanya ce mai sauƙi don yin aikin a matsayin ɓangare na mai sarrafa HTTP da kuma duba ma'aunin Prometheus. Dole ne ma'auni ya zama daidai da ƙimar access_count in Redis.
Ana tura aikace-aikacen zuwa Kubernetes ta hanyar Deployment. Hakanan an ƙirƙiri sabis ClusterIP, yana ba da damar uwar garken Prometheus don samun ma'aunin aikace-aikacen.
Ma'auni yana aiki azaman gada tsakanin KEDA da tsarin waje wanda ake buƙatar samun awo. ScaledObject wata hanya ce ta al'ada wacce ke buƙatar turawa don daidaita aiki tare da tushen taron, a cikin wannan yanayin Prometheus.
ScaledObject ya ƙunshi bayanan ƙaddamar da aiki, metadata tushen taron (kamar sirrin haɗi, sunan jerin gwano), tazarar zabe, lokacin dawowa, da sauran bayanai. Yana haifar da daidaitaccen albarkatun autoscaling (HPA ma'anar) don ƙaddamar da ƙaddamarwa.
Lokacin abu ScaledObject an share, an share ma'anar HPA daidai.
Ga ma'anar ScaledObject ga misalinmu, yana amfani da sikeli Prometheus:
Nau'in tashin hankali - Prometheus. An ambaci adireshin uwar garken Prometheus tare da ma'auni suna, kofa da Tambayar PromQL, wanda za a yi amfani da shi. Tambayar PromQL - sum(rate(http_requests[2m])).
A cewar pollingInterval,KEDA na buƙatar manufa daga Prometheus kowane daƙiƙa goma sha biyar. Akalla ɗaya ƙarƙashin (minReplicaCount), kuma matsakaicin adadin kwas ɗin bai wuce ba maxReplicaCount (a cikin wannan misali - goma).
Ana iya girka minReplicaCount daidai da sifili. A wannan yanayin, KEDA tana kunna jigilar sifili-zuwa ɗaya sannan ta fallasa HPA don ƙarin sikelin atomatik. Hakanan ana iya yin jujjuyawar odar, wato, yin ƙima daga ɗaya zuwa sifili. A cikin misali, ba mu zaɓi sifili ba saboda wannan sabis ɗin HTTP ne ba tsarin da ake buƙata ba.
Sihiri a cikin autoscaling
Ana amfani da madaidaicin azaman abin faɗakarwa don ƙaddamar da ƙaddamarwa. A cikin misalinmu, tambayar PromQL sum(rate (http_requests [2m])) yana dawo da adadin buƙatar HTTP da aka tara (buƙatun daƙiƙa guda), wanda aka auna a cikin mintuna biyu na ƙarshe.
Tun da ƙimar ƙima uku ne, yana nufin za a sami ɗaya ƙarƙashin yayin ƙimar sum(rate (http_requests [2m])) kasa da uku. Idan ƙimar ta ƙaru, ana ƙara ƙarin ƙara kowane lokaci sum(rate (http_requests [2m])) yana ƙaruwa da uku. Misali, idan darajar ta kasance daga 12 zuwa 14, to adadin kwasfa ya zama hudu.
Yanzu bari mu gwada saita shi!
Pre-saitin
Duk abin da kuke buƙata shine tarin Kubernetes da ingantaccen kayan aiki kubectl. Wannan misali yana amfani da gungu minikube, amma kuna iya ɗaukar kowane ɗayan. Don shigar da gungu akwai jagora.
helm init yana fara ƙirar layin umarni na gida kuma yana shigarwa Tiller zuwa gungu na Kubernetes.
kubectl get pods -n kube-system | grep tiller
Jira faifan Tiller don shigar da yanayin Gudu.
Bayanin mai fassaraMarubucin yana amfani da Helm@2, wanda ke buƙatar shigar da bangaren uwar garken Tiller. Yanzu Helm@3 ya dace, baya buƙatar ɓangaren uwar garken.
Bayan shigar da Helm, umarni ɗaya ya isa don fara 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
Duba cewa komai ya fara:
kubectl get pods -l=app=prometheus-server
Jira Prometheus ya shiga cikin jihar Running.
Amfani kubectl port-forward don samun dama ga mai amfani da Prometheus (ko uwar garken API) a http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Sakamakon yana kama da wani abu kamar haka:
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"
Duba ƙarƙashin aikace-aikace. Dole ne misali ɗaya yana gudana saboda minReplicaCount daidai 1:
kubectl get pods -l=app=go-prom-app
Tabbatar cewa an ƙirƙiri albarkatun HPA cikin nasara:
kubectl get hpa
Ya kamata ku ga wani abu kamar:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Binciken lafiya: samun damar aikace-aikace
Don samun damar zuwa ƙarshen REST na aikace-aikacen mu, gudu:
Yanzu zaku iya shiga app ɗin ku ta amfani da adireshin http://localhost:8080. Don yin wannan, gudanar da umarni:
curl http://localhost:8080/test
Sakamakon yana kama da wani abu kamar haka:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
A wannan gaba kuma duba Redis. Za ku ga cewa mabuɗin access_count ya karu zuwa 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Tabbatar cewa ƙimar awo ta kasance http_requests duk daya:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Load Halitta
Za mu yi amfani hey - mai amfani don samar da kaya:
A wannan yanayin ainihin sakamakon shine 1,686057971014493 kuma ana nunawa a cikin filin value. Wannan bai isa ba don sikeli, tunda matakin da muka saita shine 3.
Ƙarin kaya!
A cikin sabon tasha, saka idanu da adadin kwas ɗin aikace-aikacen:
kubectl get pods -l=app=go-prom-app -w
Bari mu ƙara kaya ta amfani da umarni:
./hey -n 2000 http://localhost:8080/test
Bayan ɗan lokaci, zaku ga HPA tana ƙididdige turawa da ƙaddamar da sabbin kwasfa. Bincika HPA don tabbatar da cewa:
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
Idan nauyin bai dace ba, za a rage ƙaddamarwa zuwa inda kwafsa ɗaya kawai ke gudana. Idan kuna son bincika ainihin ma'auni (wanda aka dawo da ta hanyar PromQL), sannan yi amfani da umarnin:
//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
ƙarshe
KEDA tana ba ku damar haɓaka ayyukan Kubernetes ta atomatik (zuwa/daga sifili) dangane da bayanai daga ma'aunin waje. Misali, dangane da ma'aunin Prometheus, tsayin layi a cikin Redis, jinkirin mabukaci a cikin batun Kafka.
KEDA yana haɗawa tare da tushen waje kuma yana ba da ma'auni ta hanyar Sabar Ma'auni zuwa Horizontal Pod Autoscaler.