توزیع کول د کلاوډ غوښتنلیکونو لپاره کلیدي اړتیا ده. د Kubernetes سره، د غوښتنلیک اندازه کول دومره ساده دي لکه څنګه چې د مناسب ځای پرځای کولو لپاره د نقلونو شمیر زیاتول یا ReplicaSet
- مګر دا یو لاسي پروسه ده.
Kubernetes غوښتنلیکونو ته اجازه ورکوي چې په اتوماتيک ډول اندازه شي (د بیلګې په توګه پوډونه په ځای پرځای کولو کې یا ReplicaSet
) د افقی پوډ آټوسکلر مشخصاتو په کارولو سره په اعلاناتي ډول. د اتوماتیک پیمانه کولو لپاره اصلي معیار د CPU کارولو میټریک (د سرچینو میټریک) دی، مګر تاسو کولی شئ دودیز او بهرنۍ چمتو شوي میټریکونه یوځای کړئ.
ټیم
د پوډونو افقی اتوماتیک کولو پرځای، د Kubernetes Event Driven Autoscaling (KEDA) کارول کیږي، د خلاصې سرچینې Kubernetes آپریټر. دا په اصلي ډول د افقی پوډ آټوسکلر سره مدغم کوي ترڅو د پیښې لخوا پرمخ وړل شوي کاري بارونو لپاره بې سیمه اتوماتیک کول (په شمول له صفر څخه) چمتو کړي. کوډ په کې شتون لري
د سیسټم لنډه کتنه
ډیاګرام یو لنډ توضیح ښیي چې څنګه هرڅه کار کوي:
- غوښتنلیک د پرومیټیوس فارمیټ کې د HTTP هټ شمیرنې میټریک چمتو کوي.
- Prometheus د دې میترونو راټولولو لپاره ترتیب شوی.
- په KEDA کې د پرومیتیوس سکیلر ترتیب شوی ترڅو غوښتنلیک په اتوماتيک ډول د HTTP هیټونو شمیر پراساس اندازه کړي.
اوس زه به تاسو ته د هر عنصر په اړه په تفصیل سره ووایم.
KEDA او Prometheus
Prometheus د خلاصې سرچینې سیسټم نظارت او خبرتیا وسیله ده، برخه
KEDA د سکیلر مفهوم ملاتړ کوي - دا د KEDA او بهرني سیسټم تر مینځ د پل په توګه کار کوي. د سکیلر تطبیق د هر هدف سیسټم لپاره ځانګړی دی او له هغې څخه ډاټا استخراجوي. KEDA بیا دوی د اتوماتیک اندازه کولو کنټرول لپاره کاروي.
سکیلرز د ډیری ډیټا سرچینو ملاتړ کوي، د بیلګې په توګه، کافکا، ریډیس، پرومیتیس. دا دی، KEDA د معیارونو په توګه د Prometheus میټریکونو په کارولو سره د کبرنیټس ګمارنې په اتوماتيک ډول اندازه کولو لپاره کارول کیدی شي.
د ازموینې غوښتنلیک
د ګولنګ ټیسټ غوښتنلیک د HTTP له لارې لاسرسی چمتو کوي او دوه مهمې دندې ترسره کوي:
- د غوښتنلیک وسیله کولو لپاره د Prometheus Go پیرودونکي کتابتون کاروي او د http_requests میټریک چمتو کوي، کوم چې د هټ شمیره لري. پای ټکی چیرې چې د پرومیټیوس میټریک شتون لري په URI کې موقعیت لري
/metrics
.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "number of http requests", })
- د غوښتنې په ځواب کې
GET
غوښتنلیک د کیلي ارزښت زیاتوي (access_count
په Redis کې. دا د HTTP هینډلر برخې په توګه د کار کولو لپاره اسانه لار ده او د پرومیتیس میټریک هم چیک کړئ. د میټریک ارزښت باید د ارزښت سره ورته ويaccess_count
په Redis کې.func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { defer httpRequestsCounter.Inc() count, err := client.Incr(redisCounterName).Result() if err != nil { fmt.Println("Unable to increment redis counter", err) os.Exit(1) } resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count)) w.Write([]byte(resp)) }) http.ListenAndServe(":8080", nil) }
غوښتنلیک د کبرنیټس له لارې ګمارل شوی Deployment
. یو خدمت هم رامینځته کیږي ClusterIP
، دا د پرومیټیوس سرور ته اجازه ورکوي چې د غوښتنلیک میټریک ترلاسه کړي.
دلته
پرومیتیوس سرور
د پرومیتیس ګمارنې منشور عبارت دي له:
ConfigMap
- د پرومیتیوس ترتیب لیږدولو لپاره؛Deployment
- د کوبرنیټس کلستر کې د پرومیتیس ځای پرځای کولو لپاره؛ClusterIP
- UI Prometheus ته د لاسرسي لپاره خدمت؛ClusterRole
,ClusterRoleBinding
иServiceAccount
- په Kubernetes کې د خدماتو د اتوماتیک کشف لپاره (آتو کشف).
دلته
KEDA Prometheus ScaledObject
سکیلر د KEDA او بهرني سیسټم تر مینځ د پل په توګه کار کوي چې له هغې څخه میټریکونه باید ترلاسه شي. ScaledObject
یو دودیز سرچینه ده چې د پیښې سرچینې سره د ګمارنې همغږي کولو لپاره ګمارل کیدو ته اړتیا لري ، پدې حالت کې پرومیتیوس.
ScaledObject
د ګمارنې اندازه کولو معلومات، د پیښې سرچینې میټاډاټا (لکه د پیوستون راز، د کتار نوم)، د رایې ورکولو وقفه، د بیا رغونې موده، او نور معلومات لري. دا د اړونده اتوماتیک کولو سرچینې (HPA تعریف) په پایله کې د ځای په ځای کولو اندازه کوي.
کله چې یو اعتراض ScaledObject
حذف شوی، د HPA اړونده تعریف پاک شوی.
دلته تعریف دی ScaledObject
زموږ د مثال لپاره، دا یو سکیلر کاروي Prometheus
:
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: default
labels:
deploymentName: go-prom-app
spec:
scaleTargetRef:
deploymentName: go-prom-app
pollingInterval: 15
cooldownPeriod: 30
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress:
http://prometheus-service.default.svc.cluster.local:9090
metricName: access_frequency
threshold: '3'
query: sum(rate(http_requests[2m]))
لاندې ټکو ته پام وکړئ:
- هغه ته اشاره کوي
Deployment
د نوم سرهgo-prom-app
. - د محرک ډول -
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 پورې وي، نو د پوډونو شمیر څلور دی.
اوس راځئ چې د دې تنظیم کولو هڅه وکړو!
presetting
ټول هغه څه چې تاسو ورته اړتیا لرئ د Kubernetes کلستر او یو ترتیب شوی افادیت دی kubectl
. دا مثال کلستر کاروي minikube
، مګر تاسو کولی شئ کوم بل واخلئ. د کلستر نصبولو لپاره شتون لري
په ماک کې وروستۍ نسخه نصب کړئ:
curl -Lo minikube
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
سیټ
په ماک کې وروستۍ نسخه نصب کړئ:
curl -LO
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version
د KEDA نصب کول
تاسو کولی شئ KEDA په څو لارو ځای په ځای کړئ، دوی په کې لیست شوي دي
kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml
KEDA او د هغې برخې په نوم ځای کې نصب شوي keda
. د چک کولو امر:
kubectl get pods -n keda
د KEDA آپریټر پیل کولو ته انتظار وکړئ او لاړ شئ Running State
. او له هغې وروسته، دوام ورکړئ.
د هیلم په کارولو سره د ریډیس نصب کول
که تاسو هیلم نصب نه کړئ، دا وکاروئ
brew install kubernetes-helm
helm init --history-max 200
helm init
د محلي کمانډ لاین انٹرفیس پیل کوي او هم یې نصبوي Tiller
د Kubernetes کلستر ته.
kubectl get pods -n kube-system | grep tiller
د ټیلر پوډ ته انتظار وکړئ چې روان حالت ته ننوځي.
د ژباړونکي یادښت: لیکوال Helm@2 کاروي، کوم چې د ټیلر سرور برخې نصبولو ته اړتیا لري. اوس Helm@3 اړونده ده، دا د سرور برخې ته اړتیا نلري.
د هیلم نصبولو وروسته، یو کمانډ د Redis پیل کولو لپاره کافي دی:
helm install --name redis-server --set cluster.enabled=false --set
usePassword=false stable/redis
تایید کړئ چې ریډیس په بریالیتوب سره پیل شوی:
kubectl get pods/redis-server-master-0
د ریډیس حالت ته د تلو لپاره انتظار وکړئ Running
.
د غوښتنلیک ځای پرځای کول
د ځای پرځای کولو امر:
kubectl apply -f go-app.yaml
//output
deployment.apps/go-prom-app created
service/go-prom-app-service created
وګورئ چې هرڅه پیل شوي دي:
kubectl get pods -l=app=go-prom-app
د ریډیس حالت ته د ننوتلو لپاره انتظار وکړئ Running
.
د پرومیتیوس سرور ځای په ځای کول
د Prometheus manifest کاروي
kubernetes_sd_configs:
- role: service
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_run]
regex: go-prom-app-service
action: keep
د ځای پرځای کولو لپاره:
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 سرور) ته لاسرسی لپاره
kubectl port-forward service/prometheus-service 9090
د KEDA د اتوماتیک کولو تنظیم کول
د جوړولو امر ScaledObject
:
kubectl apply -f keda-prometheus-scaledobject.yaml
د KEDA آپریټر لاګ چیک کړئ:
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 پای نقطې ته د لاسرسي لپاره ، چل کړئ:
kubectl port-forward service/go-prom-app-service 8080
تاسو اوس کولی شئ د پتې په کارولو سره خپل Go ایپ ته لاسرسی ومومئ
curl http://localhost:8080/test
پایله یو څه داسې ښکاري:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
پدې وخت کې ریډیس هم چیک کړئ. تاسو به دا کلید وګورئ 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
بار جوړول
موږ به وکاروو
curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64
&& chmod a+x hey
تاسو هم کولی شئ د دې لپاره افادیت ډاونلوډ کړئ
چل یې کړئ:
./hey http://localhost:8080/test
په ډیفالټ ، یوټیلیټ 200 غوښتنې لیږي. تاسو کولی شئ دا د Prometheus میټریکونو او همدارنګه Redis په کارولو سره تایید کړئ.
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201
د حقیقي میټریک ارزښت تایید کړئ (د PromQL پوښتنې لخوا بیرته راستانه شوی):
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}
په دې حالت کې اصلي پایله ده 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 پوښتنې لخوا بیرته راستانه شوی)، نو کمانډ وکاروئ:
curl -g
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
انځور
//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 تاسو ته اجازه درکوي په اتوماتيک ډول د بهرني میټریکونو معلوماتو پراساس خپل د کوبرنیټس ګمارنې (له صفر څخه) اندازه کړئ. د مثال په توګه، د Prometheus میټریکونو پر بنسټ، په ریډیس کې د قطار اوږدوالی، د کافکا موضوع کې د مصرف کونکي ځنډ.
KEDA د یوې بهرنۍ سرچینې سره مدغم کیږي او د میټریک سرور له لارې افقی پوډ آټوسکلر ته خپل میټریک چمتو کوي.
ښه چانس!
نور څه ولولئ:
د تولید چاپیریال کې د کانټینرونو او کبرنیټ چلولو لپاره غوره تمرینونه او غوره کړنې .د کبرنیټس لپاره 90+ ګټورې وسیلې: ځای په ځای کول، مدیریت، څارنه، امنیت او نور ډیر څه .زموږ چینل په ټیلیګرام کې د کوبرنیټس شاوخوا .
سرچینه: www.habr.com