ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื™ื™ืฉื•ืžื™ Kubernetes ื‘ืืžืฆืขื•ืช Prometheus ื•-KEDA

ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื™ื™ืฉื•ืžื™ Kubernetes ื‘ืืžืฆืขื•ืช Prometheus ื•-KEDAืื™ืฉ ื”ื‘ืœื•ื ื™ื ืžืืช Cimuanos

ืžื“ืจื’ื™ื•ืช ื”ื™ื ื“ืจื™ืฉืช ืžืคืชื— ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ ืขื ืŸ. ืขื Kubernetes, ืฉื™ื ื•ื™ ืงื ื” ืžื™ื“ื” ืฉืœ ื™ื™ืฉื•ื ื”ื•ื ืคืฉื•ื˜ ื›ืžื• ื”ื’ื“ืœืช ืžืกืคืจ ื”ืขืชืงื™ื ืœืคืจื™ืกื” ื”ืžืชืื™ืžื” ืื• ReplicaSet - ืื‘ืœ ื–ื” ืชื”ืœื™ืš ื™ื“ื ื™.

Kubernetes ืžืืคืฉืจ ืฉื™ื ื•ื™ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื™ื™ืฉื•ืžื™ื (ื›ืœื•ืžืจ Pods ื‘ืคืจื™ืกื” ืื• ReplicaSet) ื‘ืฆื•ืจื” ื”ืฆื”ืจืชื™ืช ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืžืคืจื˜ Horizontal Pod Autoscaler. ืงืจื™ื˜ืจื™ื•ืŸ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืขื‘ื•ืจ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ื”ื•ื ืžื“ื“ื™ ืฉื™ืžื•ืฉ ื‘ืžืขื‘ื“ (ืžื“ื“ื™ ืžืฉืื‘ื™ื), ืืš ื ื™ืชืŸ ืœืฉืœื‘ ืžื“ื“ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื•ืžืกื•ืคืงื™ื ื—ื™ืฆื•ื ื™ืช.

ืงื‘ื•ืฆื” Kubernetes aaS ืž-Mail.ru ืชืจื’ื ืžืืžืจ ืขืœ ืื™ืš ืœื”ืฉืชืžืฉ ื‘ืžื“ื“ื™ื ื—ื™ืฆื•ื ื™ื™ื ื›ื“ื™ ืœืฉื ื•ืช ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื™ื™ืฉื•ื Kubernetes. ื›ื“ื™ ืœื”ืจืื•ืช ืื™ืš ื”ื›ืœ ืขื•ื‘ื“, ื”ืžื—ื‘ืจ ืžืฉืชืžืฉ ื‘ืžื“ื“ื™ ื‘ืงืฉืช ื’ื™ืฉื” ืœ-HTTP, ืฉื ืืกืคื™ื ื‘ืืžืฆืขื•ืช Prometheus.

ื‘ืžืงื•ื ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืื•ืคืงื™ ืฉืœ ืชืจืžื™ืœื™ื, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-Kubernetes Event Driven Autoscaling (KEDA), ืžืคืขื™ืœ ืงื•ื“ ืคืชื•ื— ืฉืœ Kubernetes. ื”ื•ื ืžืฉืชืœื‘ ื‘ืื•ืคืŸ ืžืงื•ืจื™ ืขื Horizontal Pod Autoscaler ื›ื“ื™ ืœืกืคืง ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ื—ืœืง (ื›ื•ืœืœ ืขื“/ืžืืคืก) ืœืขื•ืžืกื™ ืขื‘ื•ื“ื” ืžื•ื ืขื™ ืื™ืจื•ืขื™ื. ืงื•ื“ ื–ืžื™ืŸ ื‘ GitHub.

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ื”ืžืขืจื›ืช

ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื™ื™ืฉื•ืžื™ Kubernetes ื‘ืืžืฆืขื•ืช Prometheus ื•-KEDA

ื”ืชืจืฉื™ื ืžืฆื™ื’ ืชื™ืื•ืจ ืงืฆืจ ืฉืœ ืื™ืš ื”ื›ืœ ืขื•ื‘ื“:

  1. ื”ืืคืœื™ืงืฆื™ื” ืžืกืคืงืช ืžื“ื“ื™ ืกืคื™ืจืช ื›ื ื™ืกื•ืช HTTP ื‘ืคื•ืจืžื˜ Prometheus.
  2. ืคืจื•ืžืชืื•ืก ืžื•ื’ื“ืจ ืœืืกื•ืฃ ืžื“ื“ื™ื ืืœื”.
  3. ื”-Prometheus scaler ื‘-KEDA ืžื•ื’ื“ืจ ืœืฉื™ื ื•ื™ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื‘ื”ืชื‘ืกืก ืขืœ ืžืกืคืจ ื›ื ื™ืกื•ืช HTTP.

ืขื›ืฉื™ื• ืื ื™ ืืกืคืจ ืœืš ื‘ืคื™ืจื•ื˜ ืขืœ ื›ืœ ืืœืžื ื˜.

KEDA ื•ืคืจื•ืžืชืื•ืก

Prometheus ื”ื•ื ืขืจื›ืช ื›ืœื™ื ืœื ื™ื˜ื•ืจ ื•ื”ืชืจืื” ืฉืœ ืžืขืจื›ืช ืงื•ื“ ืคืชื•ื—, ื—ืœืง ืงืจืŸ ืžื—ืฉื•ื‘ ืžืงื•ืžื™ืช ืœืขื ืŸ. ืื•ืกืฃ ืžื“ื“ื™ื ืžืžืงื•ืจื•ืช ืฉื•ื ื™ื ื•ืžืื—ืกืŸ ืื•ืชื ื›ื ืชื•ื ื™ ืกื“ืจื•ืช ื–ืžืŸ. ื›ื“ื™ ืœื”ืžื—ื™ืฉ ื ืชื•ื ื™ื ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื’ืจืคื ื” ืื• ื›ืœื™ ื”ื“ืžื™ื” ืื—ืจื™ื ืฉืขื•ื‘ื“ื™ื ืขื ื”-API ืฉืœ Kubernetes.

KEDA ืชื•ืžืš ื‘ืจืขื™ื•ืŸ ืฉืœ scaler - ื”ื•ื ืžืฉืžืฉ ื›ื’ืฉืจ ื‘ื™ืŸ KEDA ืœืžืขืจื›ืช ื”ื—ื™ืฆื•ื ื™ืช. ื”ื˜ืžืขืช scaler ืกืคืฆื™ืคื™ืช ืœื›ืœ ืžืขืจื›ืช ื™ืขื“ ื•ืžื—ืœืฆืช ืžืžื ื” ื ืชื•ื ื™ื. ืœืื—ืจ ืžื›ืŸ KEDA ืžืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœืฉืœื•ื˜ ื‘ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™.

ืกืงื•ืœืจื™ื ืชื•ืžื›ื™ื ื‘ืžืงื•ืจื•ืช ื ืชื•ื ื™ื ืžืจื•ื‘ื™ื, ืœืžืฉืœ, Kafka, Redis, Prometheus. ื›ืœื•ืžืจ, ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-KEDA ืœืฉื™ื ื•ื™ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ืคืจื™ืกื•ืช Kubernetes ื‘ืืžืฆืขื•ืช ืžื“ื“ื™ Prometheus ื›ืงืจื™ื˜ืจื™ื•ื ื™ื.

ื™ื™ืฉื•ื ื‘ื“ื™ืงื”

ืืคืœื™ืงืฆื™ื™ืช ื”ื‘ื“ื™ืงื” ืฉืœ Golang ืžืกืคืงืช ื’ื™ืฉื” ื‘ืืžืฆืขื•ืช HTTP ื•ืžื‘ืฆืขืช ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช ื—ืฉื•ื‘ื•ืช:

  1. ืžืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช ื”ืœืงื•ื—ื•ืช ืฉืœ Prometheus Go ื›ื“ื™ ืœื”ื›ืฉื™ืจ ืืช ื”ืืคืœื™ืงืฆื™ื” ื•ืœืกืคืง ืืช ื”ืžื“ื“ http_requests, ื”ืžื›ื™ืœ ืกืคื™ืจืช ื”ืชืืžื•ืช. ื ืงื•ื“ืช ื”ืงืฆื” ืฉื‘ื” ื–ืžื™ื ื™ื ืžื“ื“ื™ ืคืจื•ืžืชืื•ืก ืžืžื•ืงืžืช ื‘-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 - ืœื”ืขื‘ื™ืจ ืืช ืชืฆื•ืจืช ืคืจื•ืžืชืื•ืก;
  • Deployment - ืœืคืจื™ืกืช Prometheus ื‘ืืฉื›ื•ืœ Kubernetes;
  • ClusterIP - ืฉื™ืจื•ืช ืœื’ื™ืฉื” ืœืžืžืฉืง ื”ืžืฉืชืžืฉ Prometheus;
  • ClusterRole, ClusterRoleBinding ะธ ServiceAccount - ืœื–ื™ื”ื•ื™ ืื•ื˜ื•ืžื˜ื™ ืฉืœ ืฉื™ืจื•ืชื™ื ื‘-Kubernetes (ื’ื™ืœื•ื™ ืื•ื˜ื•ืžื˜ื™).

ื›ืืŸ ืžื ื™ืคืกื˜ ืœื”ืคืขืœืช ืคืจื•ืžืชืื•ืก.

KEDA Prometheus ScaledObject

ื”-scaler ืžืฉืžืฉ ื›ื’ืฉืจ ื‘ื™ืŸ 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]))

ืฉืงื•ืœ ืืช ื”ื ืงื•ื“ื•ืช ื”ื‘ืื•ืช:

  1. ื”ื•ื ืžืฆื‘ื™ืข ืขืœ Deployment ืขื ืฉื go-prom-app.
  2. ืกื•ื’ ื˜ืจื™ื’ืจ - Prometheus. ื›ืชื•ื‘ืช ืฉืจืช Prometheus ืžื•ื–ื›ืจืช ื™ื—ื“ ืขื ื”ืฉื ื”ืžื˜ืจื™, ื”ืกืฃ ื• ืฉืื™ืœืชืช PromQL, ืืฉืจ ื™ืฉืžืฉ. ืฉืื™ืœืชืช PromQL - sum(rate(http_requests[2m])).
  3. ืขืœ ืคื™ 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/

ืœื”ืชืงื™ืŸ ืงื•ื‘ืงื˜ืœื›ื“ื™ ืœื’ืฉืช ืœืืฉื›ื•ืœ Kubernetes.

ื”ืชืงืŸ ืืช ื”ื’ืจืกื” ื”ืื—ืจื•ื ื” ื‘-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 ื‘ื›ืžื” ื“ืจื›ื™ื, ื”ื ืจืฉื•ืžื™ื ื‘ ืชื™ืขื•ื“. ืื ื™ ืžืฉืชืžืฉ ื‘-YAML ืžื•ื ื•ืœื™ื˜ื™:

kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml

KEDA ื•ืจื›ื™ื‘ื™ื• ืžื•ืชืงื ื™ื ื‘ืžืจื—ื‘ ื”ืฉืžื•ืช keda. ืคืงื•ื“ื” ืœื‘ื“ื™ืงื”:

kubectl get pods -n keda

ื”ืžืชืŸ ืœ-KEDA Operator ืฉื™ืชื—ื™ืœ ื•ื™ืขื‘ื•ืจ ืืœ Running State. ื•ืื—ืจื™ ื–ื” ืชืžืฉื™ืš.

ื”ืชืงื ืช Redis ื‘ืืžืฆืขื•ืช Helm

ืื ืœื ืžื•ืชืงืŸ ืืฆืœืš Helm, ื”ืฉืชืžืฉ ื‘ื–ื” ั€ัƒะบะพะฒะพะดัั‚ะฒะพะผ. ืคืงื•ื“ื” ืœื”ืชืงื ื” ื‘-Mac:

brew install kubernetes-helm
helm init --history-max 200

helm init ืžืืชื—ืœ ืืช ืžืžืฉืง ืฉื•ืจืช ื”ืคืงื•ื“ื” ื”ืžืงื•ืžื™ืช ื•ื’ื ืžืชืงื™ืŸ Tiller ืœืืฉื›ื•ืœ Kubernetes.

kubectl get pods -n kube-system | grep tiller

ื”ืžืชืŸ ืœืชืจืžื™ืœ Tiller ืœื”ื™ื›ื ืก ืœืžืฆื‘ 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

ื—ื›ื” ืขื“ ืฉืจื“ื™ืก ื™ื›ื ืก ืœืžื“ื™ื ื” 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.

ืคืจื™ืกืช ืฉืจืช ืคืจื•ืžืชืื•ืก

ืžื ื™ืคืกื˜ ืคืจื•ืžืชืื•ืก ืžืฉืชืžืฉ ื’ื™ืœื•ื™ ืฉื™ืจื•ืช Kubernetes ืขื‘ื•ืจ ืคืจื•ืžืชืื•ืก. ื”ื•ื ืžืืคืฉืจ ื’ื™ืœื•ื™ ื“ื™ื ืžื™ ืฉืœ ืชืจืžื™ืœื™ื ืฉืœ ื™ื™ืฉื•ืžื™ื ื‘ื”ืชื‘ืกืก ืขืœ ืชื•ื•ื™ืช ื”ืฉื™ืจื•ืช.

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

ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ื•ืจื™ื“ ืืช ื›ืœื™ ื”ืฉื™ืจื•ืช ืขื‘ื•ืจ ืœื™ื ื•ืงืก ืื• Windows.

ืชืจื™ืฅ ืืช ื–ื”:

./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 ืžืืคืฉืจ ืœืš ืœืฉื ื•ืช ืืช ืงื ื” ื”ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืคืจื™ืกื•ืช Kubernetes ืฉืœืš (ืžืืคืก/ืžืืคืก) ืขืœ ืกืžืš ื ืชื•ื ื™ื ืžื“ื“ื™ื ื—ื™ืฆื•ื ื™ื™ื. ืœื“ื•ื’ืžื”, ื‘ื”ืชื‘ืกืก ืขืœ ืžื“ื“ื™ Prometheus, ืื•ืจืš ืชื•ืจ ื‘ืจื“ื™ืก, ื–ืžืŸ ื—ื‘ื™ื•ืŸ ืฆืจื›ื ื™ ื‘ื ื•ืฉื ืงืคืงื.

KEDA ืžืฉืชืœื‘ ืขื ืžืงื•ืจ ื—ื™ืฆื•ื ื™ ื•ื’ื ืžืกืคืง ืืช ื”ืžื“ื“ื™ื ืฉืœื• ื“ืจืš ืฉืจืช ืžื“ื“ื™ื ืœ- Horizontal Pod Autoscaler.

ืžื–ืœ ื˜ื•ื‘!

ืžื” ืขื•ื“ ืœืงืจื•ื:

  1. ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ื•ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช ืœื”ืคืขืœืช ืงื•ื ื˜ื™ื™ื ืจื™ื ื•-Kubernetes ื‘ืกื‘ื™ื‘ื•ืช ื™ื™ืฆื•ืจ.
  2. 90+ ื›ืœื™ื ืฉื™ืžื•ืฉื™ื™ื ืขื‘ื•ืจ Kubernetes: ืคืจื™ืกื”, ื ื™ื”ื•ืœ, ื ื™ื˜ื•ืจ, ืื‘ื˜ื—ื” ื•ืขื•ื“.
  3. ื”ืขืจื•ืฅ ืฉืœื ื• Around Kubernetes ื‘ื˜ืœื’ืจื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”