Өргөтгөх чадвар нь үүлэн хэрэглээний гол шаардлага юм. Kubernetes-ийн тусламжтайгаар програмыг масштаблах нь тохиромжтой байршуулалт эсвэл хуулбарын тоог нэмэгдүүлэхтэй адил хялбар юм. ReplicaSet
- гэхдээ энэ нь гараар хийдэг процесс юм.
Kubernetes нь програмуудыг автоматаар масштаблах боломжийг олгодог (жишээ нь, суулгац дахь Pods эсвэл ReplicaSet
) Horizontal Pod Autoscaler тодорхойлолтыг ашиглан тунхаглалын хэлбэрээр. Автомат масштабын өгөгдмөл шалгуур нь CPU ашиглалтын хэмжүүр (нөөцийн хэмжүүр) боловч та захиалгат болон гаднаас өгсөн хэмжигдэхүүнүүдийг нэгтгэж болно.
баг
Pod-ийн хэвтээ автомат масштабын оронд Kubernetes Event Driven Autoscaling (KEDA) нь нээлттэй эхийн Kubernetes операторыг ашигладаг. Энэ нь Horizontal Pod Autoscaler-тай үндсэндээ нэгтгэгдэж, үйл явдалд тулгуурласан ажлын ачааллыг автоматаар масштаблах (тэг хүртэл/тэгээс) хангах боломжтой. Кодыг хаягаар авах боломжтой
Системийн товч тойм
Диаграм нь бүх зүйл хэрхэн ажилладаг талаар товч тайлбарыг харуулж байна:
- Энэхүү програм нь Prometheus форматаар HTTP цохилтын тоон үзүүлэлтүүдийг өгдөг.
- Prometheus нь эдгээр хэмжигдэхүүнүүдийг цуглуулахаар тохируулагдсан.
- KEDA дахь Prometheus scaler нь HTTP хандалтын тоонд үндэслэн програмыг автоматаар масштаблахаар тохируулагдсан.
Одоо би элемент бүрийн талаар дэлгэрэнгүй ярих болно.
KEDA ба Прометей
Prometheus бол нээлттэй эхийн системийн хяналт, сэрэмжлүүлгийн хэрэгсэл, хэсэг юм
KEDA нь масштаб хэмжигч гэсэн ойлголтыг дэмждэг - энэ нь KEDA болон гадаад системийн хооронд гүүр болж ажилладаг. Скалерын хэрэгжилт нь зорилтот систем тус бүрт зориулагдсан бөгөөд үүнээс өгөгдлийг гаргаж авдаг. Дараа нь KEDA нь автомат масштабыг хянахын тулд тэдгээрийг ашигладаг.
Scalers нь Кафка, Редис, Прометей гэх мэт олон мэдээллийн эх сурвалжийг дэмждэг. Өөрөөр хэлбэл, KEDA нь Prometheus хэмжигдэхүүнийг шалгуур болгон ашиглан Kubernetes байршуулалтыг автоматаар масштаблахад ашиглаж болно.
Туршилтын програм
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 серверт програмын хэмжүүрийг авах боломжийг олгодог.
энд
Прометей сервер
Прометейг байршуулах манифест нь дараахь зүйлээс бүрдэнэ.
ConfigMap
- Prometheus тохиргоог шилжүүлэх;Deployment
— Prometheus-ийг Кубернетес кластерт байрлуулахад;ClusterIP
- UI Prometheus руу нэвтрэх үйлчилгээ;ClusterRole
,ClusterRoleBinding
иServiceAccount
— Кубернетес дэх үйлчилгээг автоматаар илрүүлэхэд зориулагдсан (Авто-ололт).
энд
KEDA Prometheus ScaledObject
Хэмжигч нь KEDA болон хэмжигдэхүүнийг авах шаардлагатай гадаад системийн хооронд гүүр болж ажилладаг. ScaledObject
нь үйл явдлын эх сурвалжтай байршуулалтыг синхрончлохын тулд ашиглах шаардлагатай захиалгат нөөц бөгөөд энэ тохиолдолд Prometheus.
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
. Prometheus серверийн хаягийг хэмжүүрийн нэр, босго болонPromQL асуулга , үүнийг ашиглах болно. PromQL Query -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/
Тогто
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
. Үүний дараа үргэлжлүүлээрэй.
Helm ашиглан Redis суулгаж байна
Хэрэв танд Helm суулгаагүй бол үүнийг ашиглаарай
brew install kubernetes-helm
helm init --history-max 200
helm init
локал командын мөрийн интерфейсийг эхлүүлж мөн суулгадаг Tiller
Kubernetes кластер руу.
kubectl get pods -n kube-system | grep tiller
Tiller pod Running төлөвт орохыг хүлээнэ үү.
Орчуулагчийн тэмдэглэл: Зохиогч нь Tiller серверийн бүрэлдэхүүнийг суулгахыг шаарддаг Helm@2 ашигладаг. Одоо 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
Редис мужид орохыг хүлээнэ үү 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 нь байршуулалтыг өргөжүүлж, шинэ pods эхлүүлэхийг харах болно. 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 хэмжигдэхүүн дээр үндэслэсэн, Redis дахь дарааллын урт, Кафка сэдэв дэх хэрэглэгчийн хоцролт.
KEDA нь гадаад эх сурвалжтай нэгдэж, хэмжигдэхүүнээ Metrics Server-ээр дамжуулан Horizontal Pod Autoscaler-д өгдөг.
Амжилт хүсье!
Өөр юу унших вэ:
Үйлдвэрлэлийн орчинд контейнер болон Кубернетес ажиллуулах шилдэг туршлага, шилдэг туршлагууд .Kubernetes-д зориулсан 90+ хэрэгтэй хэрэгсэл: байршуулалт, удирдлага, хяналт, аюулгүй байдал болон бусад .Telegram дахь Kubernetes-ийн эргэн тойронд манай суваг .
Эх сурвалж: www.habr.com