Миқёспазирӣ як талаботи калидӣ барои барномаҳои абрӣ мебошад. Бо Kubernetes, миқёси барнома ба мисли зиёд кардани шумораи репликаҳо барои ҷойгиркунии мувофиқ ё оддӣ аст. ReplicaSet
— вале ин процесси дастй аст.
Kubernetes имкон медиҳад, ки барномаҳо ба таври худкор миқёси васеъ карда шаванд (яъне Pods дар ҷойгиркунӣ ё ReplicaSet
) ба таври декларативӣ бо истифода аз мушаххасоти Horizontal Pod Autoscaler. Меъёри пешфарз барои миқёси автоматӣ ченакҳои истифодаи CPU (метрикаи захираҳо) мебошад, аммо шумо метавонед ченакҳои фармоишӣ ва берунӣ пешниҳодшударо ҳамҷоя кунед.
гурӯҳ
Ба ҷои автоматикунонии уфуқӣ аз pods, Kubernetes Event Driven Autoscaling (KEDA) истифода мешавад, оператори кушодаи Kubernetes. Он ба таври аслӣ бо Horizontal Pod Autoscaler ҳамгиро мешавад, то миқёси бефосиларо (аз ҷумла ба/аз сифр) барои сарбории кории ба рӯйдодҳо асосёфта таъмин намояд. Рамзи дастрас дар
Шарҳи мухтасари система
Дар диаграмма тавсифи мухтасари он, ки ҳама чиз кор мекунад, нишон медиҳад:
- Ин барнома ченакҳои ҳисобкунии HTTP-ро дар формати Prometheus таъмин мекунад.
- Prometheus барои ҷамъоварии ин нишондиҳандаҳо танзим шудааст.
- Миқёси Prometheus дар KEDA барои ба таври худкор миқёси барнома дар асоси шумораи хитҳои HTTP танзим карда шудааст.
Ҳоло ман ба шумо дар бораи ҳар як элемент муфассал нақл мекунам.
KEDA ва Прометей
Prometheus як асбоби мониторинг ва огоҳкунии системаи кушодаасос аст, қисми
KEDA консепсияи скалерро дастгирӣ мекунад - он ҳамчун пул байни KEDA ва системаи беруна амал мекунад. Татбиқи scaler барои ҳар як системаи мақсаднок хос аст ва аз он маълумот мегирад. Сипас KEDA онҳоро барои назорат кардани миқёси худкор истифода мебарад.
Скалерҳо сарчашмаҳои зиёди маълумотро дастгирӣ мекунанд, масалан, Кафка, Редис, Прометей. Яъне, KEDA метавонад барои ба таври худкор миқёси ҷойгиркунии Kubernetes бо истифода аз ченакҳои Prometheus ҳамчун меъёр истифода шавад.
Аризаи санҷишӣ
Замимаи санҷишии Golang дастрасиро тавассути HTTP таъмин мекунад ва ду вазифаи муҳимро иҷро мекунад:
- Китобхонаи муштарии Prometheus Go -ро барои асбоби барнома истифода мебарад ва метрикаи http_requests-ро, ки шумораи хитҳоро дар бар мегирад, истифода мебарад. Нуқтаи ниҳоӣ, ки дар он ченакҳои Prometheus дастрасанд, дар URI ҷойгир аст
/metrics
.var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests", Help: "number of http requests", })
- Дар посух ба дархост
GET
барнома арзиши калидро зиёд мекунад (access_count
) дар Redis. Ин роҳи осони иҷрои кор ҳамчун як қисми коркардкунандаи HTTP ва инчунин санҷиши ченакҳои Prometheus аст. Арзиши метрӣ бояд бо арзиш якхела бошадaccess_count
дар Редис.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) }
Барнома тавассути Kubernetes ҷойгир карда мешавад Deployment
. Хизматрасонӣ низ таъсис дода мешавад ClusterIP
, он ба сервери Prometheus имкон медиҳад, ки ченакҳои барномаро ба даст орад.
дар ин ҷо
Сервери Prometheus
Манифести густариши Prometheus аз инҳо иборат аст:
ConfigMap
— интиқоли конфигуратсияи Prometheus;Deployment
— барои ҷойгиркунии Prometheus дар кластери Kubernetes;ClusterIP
— хизматрасонӣ барои дастрасӣ ба UI Prometheus;ClusterRole
,ClusterRoleBinding
иServiceAccount
— барои худкор муайян кардани хадамот дар Кубернетес (Авто-кашф).
дар ин ҷо
KEDA Prometheus ScaledObject
Скалер ҳамчун пули байни KEDA ва системаи беруна амал мекунад, ки аз он ченакҳо бояд гирифта шаванд. ScaledObject
манбаи фармоишӣ аст, ки бояд барои ҳамоҳангсозии ҷойгиркунӣ бо манбаи ҳодиса, дар ин ҳолат Prometheus ҷойгир карда шавад.
ScaledObject
дорои маълумоти миқёси густариш, метамаълумоти сарчашмаи ҳодиса (ба монанди асрори пайвастшавӣ, номи навбат), фосилаи овоздиҳӣ, давраи барқарорсозӣ ва дигар маълумот. Он ба манбаи мувофиқи автоматӣ (таърифи HPA) барои миқёси густариш оварда мерасонад.
Вақте ки объект ScaledObject
нест карда мешавад, таърифи мувофиқи HPA тоза карда мешавад.
Ин аст таъриф ScaledObject
барои мисоли мо, он scaler-ро истифода мебарад 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
. Суроғаи сервери 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 бошад, пас шумораи қуттиҳо чор аст.
Акнун биёед кӯшиш кунем, ки онро танзим кунем!
танзими пешакӣ
Ба шумо танҳо кластери Kubernetes ва утилитаи танзимшуда лозим аст kubectl
. Ин мисол кластерро истифода мебарад minikube
, аммо шумо метавонед ягон каси дигарро гиред. Барои насб кардани кластер вуҷуд дорад
Версияи охиринро дар Mac насб кунед:
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/
Set
Версияи охиринро дар Mac насб кунед:
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
. Ва баъд аз он, давом диҳед.
Насб кардани Redis бо истифода аз Helm
Агар шумо Helm насб накарда бошед, аз ин истифода баред
brew install kubernetes-helm
helm init --history-max 200
helm init
интерфейси сатри фармони маҳаллиро оғоз мекунад ва инчунин насб мекунад Tiller
ба кластери Кубернетес.
kubectl get pods -n kube-system | grep tiller
Мунтазир бошед, ки подшипник Tiller ба ҳолати давидан ворид шавад.
Ёддошти тарҷумон: Муаллиф Helm@2-ро истифода мебарад, ки барои насб кардани ҷузъи сервери Tiller талаб мекунад. Ҳоло Helm@3 мувофиқ аст, он қисми серверро талаб намекунад.
Пас аз насб кардани Helm, як фармон барои оғоз кардани Redis кифоя аст:
helm install --name redis-server --set cluster.enabled=false --set
usePassword=false stable/redis
Боварӣ ҳосил кунед, ки 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
Интизор шавед, ки Redis ба давлат ворид шавад Running
.
Ҷойгир кардани сервери Prometheus
Истифодаи манифести Прометей
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
барои дастрасӣ ба интерфейси корбари Prometheus (ё сервери 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
Дар ин лаҳза инчунин 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
Эҷоди бор
Мо истифода хоҳем бурд
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
Агар сарборӣ номувофиқ бошад, ҷойгиркунӣ то ба дараҷае кам карда мешавад, ки танҳо як pod кор мекунад. Агар шумо хоҳед, ки метрикаи воқеиро тафтиш кунед (бо дархости 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 ба шумо имкон медиҳад, ки дар асоси додаҳои ченакҳои беруна ҷойгиркунии Kubernetes-и худро ба таври худкор васеъ кунед (ба/аз сифр). Масалан, дар асоси ченакҳои Prometheus, дарозии навбат дар Redis, таъхири истеъмолкунанда дар мавзӯи Кафка.
KEDA бо манбаи беруна ҳамгиро мешавад ва инчунин ченакҳои худро тавассути Metrics Server ба Horizontal Pod Autoscaler медиҳад.
Барори кор
Боз чӣ хондан лозим аст:
Таҷрибаҳои беҳтарин ва таҷрибаҳои беҳтарин барои идора кардани контейнерҳо ва кубернетҳо дар муҳити истеҳсолӣ .90+ Воситаҳои муфид барои Kubernetes: Ҷойгиркунӣ, идоракунӣ, мониторинг, амният ва ғайра .Канали мо дар атрофи Kubernetes дар Telegram .
Манбаъ: will.com