مقیاس خودکار برنامه های Kubernetes با استفاده از Prometheus و KEDA

مقیاس خودکار برنامه های Kubernetes با استفاده از Prometheus و KEDAمرد بادکنکی اثر Cimuanos

مقیاس پذیری یک نیاز کلیدی برای برنامه های کاربردی ابری است. با Kubernetes، مقیاس‌بندی یک برنامه به سادگی افزایش تعداد کپی‌ها برای استقرار مناسب یا ReplicaSet - اما این یک فرآیند دستی است.

Kubernetes اجازه می دهد تا برنامه ها به طور خودکار مقیاس شوند (یعنی Pods در یک استقرار یا ReplicaSet) به صورت اعلامی با استفاده از مشخصات Horizontal Pod Autoscaler. معیار پیش‌فرض برای مقیاس‌بندی خودکار، معیارهای استفاده از CPU (معیارهای منابع) است، اما می‌توانید معیارهای سفارشی و ارائه‌شده خارجی را ادغام کنید.

تیم Kubernetes aaS از Mail.ru مقاله ای در مورد نحوه استفاده از معیارهای خارجی برای مقیاس خودکار یک برنامه Kubernetes ترجمه کرد. برای نشان دادن اینکه همه چیز چگونه کار می کند، نویسنده از معیارهای درخواست دسترسی HTTP استفاده می کند که با استفاده از Prometheus جمع آوری می شوند.

به جای مقیاس خودکار افقی pods، Kubernetes Event Driven Autoscaling (KEDA) استفاده می شود، یک اپراتور Kubernetes منبع باز. این به طور بومی با Horizontal Pod Autoscaler ادغام می شود تا مقیاس خودکار یکپارچه (از جمله از/صفر) را برای بارهای کاری مبتنی بر رویداد فراهم کند. کد موجود در GitHub.

مروری کوتاه بر سیستم

مقیاس خودکار برنامه های Kubernetes با استفاده از Prometheus و KEDA

نمودار شرح مختصری از نحوه کار همه چیز را نشان می دهد:

  1. این برنامه معیارهای تعداد بازدید HTTP را در قالب Prometheus ارائه می دهد.
  2. پرومتئوس برای جمع آوری این معیارها پیکربندی شده است.
  3. مقیاس‌کننده Prometheus در KEDA به گونه‌ای پیکربندی شده است که به طور خودکار برنامه را بر اساس تعداد بازدیدهای HTTP مقیاس‌بندی کند.

اکنون در مورد هر عنصر به طور کامل به شما خواهم گفت.

KEDA و پرومتئوس

Prometheus یک مجموعه ابزار مانیتورینگ و هشدار سیستم منبع باز است بنیاد رایانش بومی ابر. معیارها را از منابع مختلف جمع آوری می کند و آنها را به عنوان داده های سری زمانی ذخیره می کند. برای تجسم داده ها می توانید استفاده کنید گرافانا یا سایر ابزارهای تجسمی که با Kubernetes API کار می کنند.

KEDA از مفهوم مقیاس کننده پشتیبانی می کند - به عنوان پلی بین KEDA و سیستم خارجی عمل می کند. پیاده سازی مقیاس کننده برای هر سیستم هدف خاص است و داده ها را از آن استخراج می کند. سپس KEDA از آنها برای کنترل مقیاس بندی خودکار استفاده می کند.

مقیاس‌کننده‌ها از چندین منبع داده مانند کافکا، ردیس، پرومتئوس پشتیبانی می‌کنند. یعنی، KEDA را می توان برای مقیاس خودکار استقرار Kubernetes با استفاده از معیارهای Prometheus به عنوان معیار استفاده کرد.

نرم افزار تست

برنامه تست Golang دسترسی را از طریق HTTP فراهم می کند و دو عملکرد مهم را انجام می دهد:

  1. از کتابخانه مشتری Prometheus Go برای ابزار دقیق برنامه و ارائه معیار http_requests که حاوی تعداد بازدید است استفاده می کند. نقطه پایانی که معیارهای Prometheus در آن موجود است در URI قرار دارد /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. در پاسخ به یک درخواست GET برنامه مقدار کلید را افزایش می دهد (access_count) در ردیس. این یک راه آسان برای انجام کار به عنوان بخشی از یک کنترل کننده 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 در یک خوشه Kubernetes.
  • ClusterIP - خدمات دسترسی به UI Prometheus؛
  • ClusterRole, ClusterRoleBinding и ServiceAccount - برای تشخیص خودکار خدمات در Kubernetes (کشف خودکار).

در اینجا این است مانیفست برای اجرای پرومتئوس.

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]))

به نکات زیر توجه کنید:

  1. اشاره می کند Deployment با نام go-prom-app.
  2. نوع ماشه - Prometheus. آدرس سرور Prometheus به همراه نام متریک، آستانه و پرس و جو PromQL، که مورد استفاده قرار خواهد گرفت. درخواست PromQL - sum(rate(http_requests[2m])).
  3. طبق pollingIntervalKEDA هر پانزده ثانیه یک هدف از پرومتئوس درخواست می کند. حداقل یکی زیر (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، اما شما می توانید هر نوع دیگری را بردارید. برای نصب یک کلاستر وجود دارد رهبری.

آخرین نسخه را روی مک نصب کنید:

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/

مجموعه کوبکتلبرای دسترسی به خوشه Kubernetes.

آخرین نسخه را روی مک نصب کنید:

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 را به روش های مختلفی مستقر کنید، آنها در لیست هستند مستندات. من از YAML یکپارچه استفاده می کنم:

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 به خوشه Kubernetes.

kubectl get pods -n kube-system | grep tiller

منتظر بمانید تا Tiller pod وارد حالت Running شود.

یادداشت مترجم: نویسنده از 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

منتظر بمانید تا Redis به حالت تبدیل شود 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 برای 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) در http://localhost:9090.

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 خود دسترسی پیدا کنید 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

ایجاد بار

ما استفاده خواهیم کرد هی - ابزار برای تولید بار:

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 را خواهید دید که مقیاس استقرار و راه اندازی pod های جدید را انجام می دهد. 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 به شما این امکان را می دهد که به طور خودکار استقرارهای Kubernetes خود را (به/از صفر) بر اساس داده های معیارهای خارجی مقیاس کنید. به عنوان مثال، بر اساس معیارهای پرومتئوس، طول صف در Redis، تأخیر مصرف کننده در موضوع کافکا.

KEDA با یک منبع خارجی ادغام می شود و همچنین معیارهای خود را از طریق Metrics Server به Horizontal Pod Autoscaler ارائه می دهد.

موفق باشید!

دیگر چه بخوانیم:

  1. بهترین روش ها و بهترین روش ها برای اجرای کانتینرها و Kubernetes در محیط های تولید.
  2. بیش از 90 ابزار مفید برای Kubernetes: استقرار، مدیریت، نظارت، امنیت و موارد دیگر.
  3. کانال ما اطراف کوبرنتس در تلگرام.

منبع: www.habr.com

اضافه کردن نظر