క్లౌడ్ అప్లికేషన్లకు స్కేలబిలిటీ ఒక కీలకమైన అవసరం. కుబెర్నెటెస్తో, అనువర్తనాన్ని స్కేలింగ్ చేయడం అనేది తగిన విస్తరణ కోసం ప్రతిరూపాల సంఖ్యను పెంచడం లేదా ReplicaSet - కానీ ఇది మాన్యువల్ ప్రక్రియ.
కుబెర్నెటెస్ అప్లికేషన్లను స్వయంచాలకంగా స్కేల్ చేయడానికి అనుమతిస్తుంది (అనగా విస్తరణలో పాడ్లు లేదా ReplicaSet) హారిజాంటల్ పాడ్ ఆటోస్కేలర్ స్పెసిఫికేషన్ని ఉపయోగించి డిక్లరేటివ్ పద్ధతిలో. ఆటోమేటిక్ స్కేలింగ్ కోసం డిఫాల్ట్ ప్రమాణం CPU వినియోగ కొలమానాలు (రిసోర్స్ మెట్రిక్స్), కానీ మీరు అనుకూల మరియు బాహ్యంగా అందించిన కొలమానాలను ఏకీకృతం చేయవచ్చు.
జట్టు Mail.ru నుండి Kubernetes aaS Kubernetes అప్లికేషన్ను స్వయంచాలకంగా స్కేల్ చేయడానికి బాహ్య కొలమానాలను ఎలా ఉపయోగించాలో అనే కథనాన్ని అనువదించారు. ప్రతిదీ ఎలా పని చేస్తుందో చూపించడానికి, రచయిత HTTP యాక్సెస్ అభ్యర్థన కొలమానాలను ఉపయోగిస్తాడు, వీటిని ప్రోమేథియస్ ఉపయోగించి సేకరించారు.
పాడ్ల క్షితిజ సమాంతర ఆటోస్కేలింగ్కు బదులుగా, కుబెర్నెటెస్ ఈవెంట్ డ్రైవెన్ ఆటోస్కేలింగ్ (కెఇడిఎ) ఉపయోగించబడుతుంది, ఇది ఓపెన్ సోర్స్ కుబెర్నెట్స్ ఆపరేటర్. ఈవెంట్-డ్రైవెన్ వర్క్లోడ్ల కోసం అతుకులు లేని ఆటోస్కేలింగ్ (సున్నా నుండి/సున్నా వరకు) అందించడానికి ఇది క్షితిజసమాంతర పాడ్ ఆటోస్కేలర్తో స్థానికంగా అనుసంధానించబడుతుంది. కోడ్ అందుబాటులో ఉంది గ్యాలరీలు.
సిస్టమ్ యొక్క సంక్షిప్త అవలోకనం
రేఖాచిత్రం ప్రతిదీ ఎలా పని చేస్తుందో సంక్షిప్త వివరణను చూపుతుంది:
అప్లికేషన్ ప్రోమేథియస్ ఫార్మాట్లో HTTP హిట్ కౌంట్ మెట్రిక్లను అందిస్తుంది.
ఈ కొలమానాలను సేకరించడానికి ప్రోమేతియస్ కాన్ఫిగర్ చేయబడింది.
KEDAలోని ప్రోమెథియస్ స్కేలర్ HTTP హిట్ల సంఖ్య ఆధారంగా అప్లికేషన్ను స్వయంచాలకంగా స్కేల్ చేయడానికి కాన్ఫిగర్ చేయబడింది.
ఇప్పుడు నేను ప్రతి మూలకం గురించి మీకు వివరంగా చెబుతాను.
KEDA మరియు ప్రోమేతియస్
ప్రోమేతియస్ అనేది ఓపెన్ సోర్స్ సిస్టమ్ పర్యవేక్షణ మరియు హెచ్చరిక టూల్కిట్, భాగం క్లౌడ్ స్థానిక కంప్యూటింగ్ ఫౌండేషన్. వివిధ మూలాల నుండి కొలమానాలను సేకరిస్తుంది మరియు వాటిని సమయ శ్రేణి డేటాగా నిల్వ చేస్తుంది. డేటాను దృశ్యమానం చేయడానికి మీరు ఉపయోగించవచ్చు గ్రాఫనా లేదా Kubernetes APIతో పని చేసే ఇతర విజువలైజేషన్ సాధనాలు.
KEDA స్కేలర్ భావనకు మద్దతు ఇస్తుంది - ఇది KEDA మరియు బాహ్య వ్యవస్థ మధ్య వంతెనగా పనిచేస్తుంది. స్కేలర్ అమలు ప్రతి లక్ష్య వ్యవస్థకు నిర్దిష్టంగా ఉంటుంది మరియు దాని నుండి డేటాను సంగ్రహిస్తుంది. KEDA ఆటోమేటిక్ స్కేలింగ్ని నియంత్రించడానికి వాటిని ఉపయోగిస్తుంది.
స్కేలర్లు బహుళ డేటా మూలాలకు మద్దతు ఇస్తాయి, ఉదాహరణకు, కాఫ్కా, రెడిస్, ప్రోమేథియస్. అంటే, ప్రోమెథియస్ మెట్రిక్లను ప్రమాణంగా ఉపయోగించి స్వయంచాలకంగా కుబెర్నెట్స్ విస్తరణలను స్కేల్ చేయడానికి KEDAని ఉపయోగించవచ్చు.
పరీక్ష అప్లికేషన్
గోలాంగ్ టెస్ట్ అప్లికేషన్ HTTP ద్వారా యాక్సెస్ను అందిస్తుంది మరియు రెండు ముఖ్యమైన విధులను నిర్వహిస్తుంది:
అప్లికేషన్ను ఇన్స్ట్రుమెంట్ చేయడానికి మరియు హిట్ కౌంట్ని కలిగి ఉన్న http_requests మెట్రిక్ని అందించడానికి Prometheus Go క్లయింట్ లైబ్రరీని ఉపయోగిస్తుంది. ప్రోమేతియస్ కొలమానాలు అందుబాటులో ఉన్న ముగింపు స్థానం URI వద్ద ఉంది /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
ఒక అభ్యర్థనకు ప్రతిస్పందనగా GET అప్లికేషన్ కీ విలువను పెంచుతుంది (access_count) Redis లో. ఇది HTTP హ్యాండ్లర్లో భాగంగా పని చేయడానికి సులభమైన మార్గం మరియు ప్రోమేతియస్ మెట్రిక్లను కూడా తనిఖీ చేస్తుంది. మెట్రిక్ విలువ తప్పనిసరిగా విలువతో సమానంగా ఉండాలి access_count Redis లో.
అప్లికేషన్ Kubernetes ద్వారా అమలు చేయబడింది Deployment. ఒక సేవ కూడా సృష్టించబడుతుంది ClusterIP, ఇది ప్రోమేతియస్ సర్వర్ అప్లికేషన్ మెట్రిక్లను పొందేందుకు అనుమతిస్తుంది.
స్కేలర్ KEDA మరియు కొలమానాలను పొందవలసిన బాహ్య వ్యవస్థ మధ్య వంతెనగా పనిచేస్తుంది. ScaledObject ఈవెంట్ సోర్స్తో డిప్లాయ్మెంట్ని సింక్రొనైజ్ చేయడానికి ఉపయోగించాల్సిన అనుకూల వనరు, ఈ సందర్భంలో ప్రోమేథియస్.
ScaledObject విస్తరణ స్కేలింగ్ సమాచారం, ఈవెంట్ సోర్స్ మెటాడేటా (కనెక్షన్ రహస్యాలు, క్యూ పేరు వంటివి), పోలింగ్ విరామం, పునరుద్ధరణ కాలం మరియు ఇతర డేటాను కలిగి ఉంటుంది. ఇది విస్తరణను స్కేల్ చేయడానికి సంబంధిత ఆటోస్కేలింగ్ రిసోర్స్ (HPA నిర్వచనం)కి దారి తీస్తుంది.
ఒక వస్తువు ఉన్నప్పుడు ScaledObject తొలగించబడింది, సంబంధిత HPA నిర్వచనం క్లియర్ చేయబడింది.
ఇక్కడ నిర్వచనం ఉంది ScaledObject మా ఉదాహరణ కోసం, ఇది స్కేలర్ను ఉపయోగిస్తుంది Prometheus:
ట్రిగ్గర్ రకం - Prometheus. ప్రోమేతియస్ సర్వర్ చిరునామా మెట్రిక్ పేరు, థ్రెషోల్డ్ మరియు PromQL ప్రశ్న, ఇది ఉపయోగించబడుతుంది. PromQL ప్రశ్న - sum(rate(http_requests[2m])).
ప్రకారం pollingInterval,KEDA ప్రతి పదిహేను సెకన్లకు ప్రోమేతియస్ నుండి లక్ష్యాన్ని అభ్యర్థిస్తుంది. కనీసం ఒకటి కింద (minReplicaCount), మరియు పాడ్ల గరిష్ట సంఖ్య మించదు maxReplicaCount (ఈ ఉదాహరణలో - పది).
ఇన్స్టాల్ చేసుకోవచ్చు minReplicaCount సున్నాకి సమానం. ఈ సందర్భంలో, KEDA జీరో-టు-వన్ డిప్లాయ్మెంట్ను సక్రియం చేస్తుంది మరియు తదుపరి ఆటోమేటిక్ స్కేలింగ్ కోసం HPAని బహిర్గతం చేస్తుంది. రివర్స్ ఆర్డర్ కూడా సాధ్యమే, అంటే, ఒకటి నుండి సున్నాకి స్కేలింగ్. ఉదాహరణలో, మేము సున్నాని ఎంచుకోలేదు ఎందుకంటే ఇది HTTP సేవ మరియు ఆన్-డిమాండ్ సిస్టమ్ కాదు.
ఆటోస్కేలింగ్ లోపల మ్యాజిక్
థ్రెషోల్డ్ విస్తరణను స్కేల్ చేయడానికి ట్రిగ్గర్గా ఉపయోగించబడుతుంది. మా ఉదాహరణలో, PromQL ప్రశ్న sum(rate (http_requests [2m])) గత రెండు నిమిషాల్లో కొలిచిన సమగ్ర HTTP అభ్యర్థన రేటు (సెకనుకు అభ్యర్థనలు)ని అందిస్తుంది.
థ్రెషోల్డ్ విలువ మూడు కాబట్టి, విలువ కింద ఒకటి ఉంటుందని అర్థం sum(rate (http_requests [2m])) మూడు కంటే తక్కువ. విలువ పెరిగితే, ప్రతిసారీ అదనపు సబ్ జోడించబడుతుంది sum(rate (http_requests [2m])) మూడు పెరుగుతుంది. ఉదాహరణకు, విలువ 12 నుండి 14 వరకు ఉంటే, అప్పుడు పాడ్ల సంఖ్య నాలుగు.
ఇప్పుడు దాన్ని సెటప్ చేయడానికి ప్రయత్నిద్దాం!
ముందస్తు సెట్టింగ్
మీకు కావలసిందల్లా కుబెర్నెట్స్ క్లస్టర్ మరియు కాన్ఫిగర్ చేయబడిన యుటిలిటీ kubectl. ఈ ఉదాహరణ క్లస్టర్ని ఉపయోగిస్తుంది minikube, కానీ మీరు మరేదైనా తీసుకోవచ్చు. క్లస్టర్ను ఇన్స్టాల్ చేయడానికి ఉంది గైడ్.
helm init స్థానిక కమాండ్ లైన్ ఇంటర్ఫేస్ను ప్రారంభిస్తుంది మరియు ఇన్స్టాల్ చేస్తుంది Tiller కుబెర్నెటీస్ క్లస్టర్కి.
kubectl get pods -n kube-system | grep tiller
టిల్లర్ పాడ్ రన్నింగ్ స్టేట్లోకి ప్రవేశించే వరకు వేచి ఉండండి.
అనువాదకుని గమనిక: రచయిత Helm@2ని ఉపయోగిస్తున్నారు, దీనికి Tiller సర్వర్ కాంపోనెంట్ ఇన్స్టాల్ చేయబడాలి. ఇప్పుడు హెల్మ్@3 సంబంధితంగా ఉంది, దీనికి సర్వర్ భాగం అవసరం లేదు.
హెల్మ్ని ఇన్స్టాల్ చేసిన తర్వాత, రెడిస్ను ప్రారంభించడానికి ఒక ఆదేశం సరిపోతుంది:
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
ప్రతిదీ ప్రారంభించబడిందో లేదో తనిఖీ చేయండి:
kubectl get pods -l=app=prometheus-server
ప్రోమేతియస్ రాష్ట్రంలోకి వెళ్లే వరకు వేచి ఉండండి Running.
ఉపయోగం kubectl port-forward వద్ద ప్రోమేతియస్ యూజర్ ఇంటర్ఫేస్ (లేదా API సర్వర్) యాక్సెస్ చేయడానికి http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
ఫలితం ఇలా కనిపిస్తుంది:
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"
అప్లికేషన్ల క్రింద తనిఖీ చేయండి. ఒక ఉదాహరణ తప్పనిసరిగా నడుస్తూ ఉండాలి ఎందుకంటే minReplicaCount 1కి సమానం:
kubectl get pods -l=app=go-prom-app
HPA వనరు విజయవంతంగా సృష్టించబడిందని ధృవీకరించండి:
kubectl get hpa
మీరు ఇలాంటివి చూడాలి:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
ఆరోగ్య తనిఖీ: అప్లికేషన్ యాక్సెస్
మా అప్లికేషన్ యొక్క REST ఎండ్ పాయింట్ని యాక్సెస్ చేయడానికి, అమలు చేయండి:
మీరు ఇప్పుడు చిరునామాను ఉపయోగించి మీ Go యాప్ని యాక్సెస్ చేయవచ్చు http://localhost:8080. దీన్ని చేయడానికి, ఆదేశాన్ని అమలు చేయండి:
curl http://localhost:8080/test
ఫలితం ఇలా కనిపిస్తుంది:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
ఈ సమయంలో Redisని కూడా తనిఖీ చేయండి. మీరు ఆ కీని చూస్తారు access_count 1కి పెరిగింది:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
మెట్రిక్ విలువ ఉండేలా చూసుకోండి http_requests అదే:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
లోడ్ సృష్టి
మేము ఉపయోగిస్తాము హే - లోడ్ ఉత్పత్తి కోసం ప్రయోజనం:
ఈ సందర్భంలో, నిజమైన ఫలితం 1,686057971014493 మరియు ఫీల్డ్లో ప్రదర్శించబడుతుంది value. స్కేలింగ్ కోసం ఇది సరిపోదు, ఎందుకంటే మేము సెట్ చేసిన థ్రెషోల్డ్ 3.
మరింత లోడ్!
కొత్త టెర్మినల్లో, అప్లికేషన్ పాడ్ల సంఖ్యను పర్యవేక్షించండి:
kubectl get pods -l=app=go-prom-app -w
కమాండ్ ఉపయోగించి లోడ్ పెంచుదాం:
./hey -n 2000 http://localhost:8080/test
కొంతకాలం తర్వాత, మీరు HPA విస్తరణను స్కేల్ చేయడం మరియు కొత్త పాడ్లను ప్రారంభించడాన్ని చూస్తారు. నిర్ధారించుకోవడానికి మీ HPAని తనిఖీ చేయండి:
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
లోడ్ అస్థిరంగా ఉంటే, ఒక పాడ్ మాత్రమే రన్ అయ్యే స్థాయికి విస్తరణ తగ్గించబడుతుంది. మీరు అసలు మెట్రిక్ని తనిఖీ చేయాలనుకుంటే (PromQL ప్రశ్న ద్వారా తిరిగి ఇవ్వబడింది), ఆపై ఆదేశాన్ని ఉపయోగించండి:
//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
తీర్మానం
KEDA బాహ్య కొలమానాల నుండి డేటా ఆధారంగా మీ కుబెర్నెట్స్ విస్తరణలను (సున్నాకి/నుండి) స్వయంచాలకంగా స్కేల్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఉదాహరణకు, ప్రోమేతియస్ మెట్రిక్స్, రెడిస్లో క్యూ పొడవు, కాఫ్కా టాపిక్లో వినియోగదారు జాప్యం ఆధారంగా.
KEDA బాహ్య సోర్స్తో అనుసంధానం చేస్తుంది మరియు మెట్రిక్స్ సర్వర్ ద్వారా క్షితిజసమాంతర పాడ్ ఆటోస్కేలర్కు దాని కొలమానాలను కూడా అందిస్తుంది.