Autoscaling Kubernetes applications เป‚เบ”เบเปƒเบŠเป‰ Prometheus เปเบฅเบฐ KEDA

Autoscaling Kubernetes applications เป‚เบ”เบเปƒเบŠเป‰ Prometheus เปเบฅเบฐ KEDABalloon Man เป‚เบ”เบ Cimuanos

เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบฐเบซเบเบฒเบเป„เบ”เป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบฑเบเบชเปเบฒเบฅเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ„เบฅเบฒเบง. เบ”เป‰เบงเบ Kubernetes, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเป€เบ—เบปเปˆเบฒเบเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบซเบผเบท ReplicaSet โ€” เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบ„เบนเปˆโ€‹เบกเบทโ€‹.

Kubernetes เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เป€เบŠเบฑเปˆเบ™: Pods เปƒเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰ เบซเบผเบท ReplicaSet) เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบเบฒเบ™เบ›เบฐเบเบฒเบ”เป‚เบ”เบเปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐ Horizontal Pod Autoscaler. เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบกเปˆเบ™ metrics เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ CPU (metrics เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™), เปเบ•เปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ metrics เบเปเบฒเบ™เบปเบ”เป€เบญเบ‡เปเบฅเบฐเบžเบฒเบเบ™เบญเบเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰.

เบ—เบตเบกเบ‡เบฒเบ™ Kubernetes aaS เบˆเบฒเบ Mail.ru เปเบ›เบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเปƒเบŠเป‰เบ•เบปเบงเบงเบฑเบ”เปเบ—เบเบžเบฒเบเบ™เบญเบเป€เบžเบทเปˆเบญเบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Kubernetes เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”, เบœเบนเป‰เบ‚เบฝเบ™เปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰เบšเบญเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ HTTP, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเป‚เบ”เบเปƒเบŠเป‰ Prometheus.

เปเบ—เบ™เบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ•เบฒเบกเปเบ™เบงเบ™เบญเบ™เบ‚เบญเบ‡เบเบฑเบ, Kubernetes Event Driven Autoscaling (KEDA) เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ” Kubernetes operator. เบกเบฑเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบกเบเบฑเบš Horizontal Pod Autoscaler เป€เบžเบทเปˆเบญเบชเบฐเปœเบญเบ‡เบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบšเบšเบšเปเปˆเบกเบตเบฎเบญเบเบ•เปเปˆ (เบฅเบงเบกเบ—เบฑเบ‡เบซเบฒ/เบˆเบฒเบเบชเบนเบ™) เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เป‚เบ”เบเป€เบซเบ”เบเบฒเบ™. เบฅเบฐเบซเบฑเบ”เบกเบตเบขเบนเปˆ GitHub.

เบžเบฒเบšเบฅเบงเบกเป‚เบ”เบเบซเบเปเป‰เบ‚เบญเบ‡เบฅเบฐเบšเบปเบš

Autoscaling Kubernetes applications เป‚เบ”เบเปƒเบŠเป‰ Prometheus เปเบฅเบฐ KEDA

เปเบœเบ™เบงเบฒเบ”เบชเบฐเปเบ”เบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเป€เบฎเบฑเบ”เบงเบฝเบเบ—เบธเบเบขเปˆเบฒเบ‡:

  1. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบซเป‰ HTTP hit count metrics เปƒเบ™เบฎเบนเบšเปเบšเบš Prometheus.
  2. Prometheus เป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบเปเบฒเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.
  3. Prometheus scaler เปƒเบ™ KEDA เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบˆเปเบฒเบ™เบงเบ™ HTTP hits.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบš.

KEDA เปเบฅเบฐ Prometheus

Prometheus เปเบกเปˆเบ™เบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก เปเบฅเบฐเปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบฅเบฐเบšเบปเบšเปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”, เบชเปˆเบงเบ™เปœเบถเปˆเบ‡ เบกเบนเบ™เบ™เบดเบ—เบดเบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‰ Cloud Native. เบฅเบงเบšเบฅเบงเบกเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบˆเบฒเบเปเบซเบผเปˆเบ‡เบ•เปˆเบฒเบ‡เป†เปเบฅเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบžเบงเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบŠเบธเบ”เป€เบงเบฅเบฒ. เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบซเป‰เป€เบซเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ เบเบฃเบฒเบŸเบฒเบ™เบฒ เบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Kubernetes API.

KEDA เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ scaler - เบกเบฑเบ™เป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ‚เบปเบงเบฅเบฐเบซเบงเปˆเบฒเบ‡ KEDA เปเบฅเบฐเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบ. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” scaler เปเบกเปˆเบ™เบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเปเบ•เปˆเบฅเบฐเบฅเบฐเบšเบปเบšเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบฅเบฐเบชเบฐเบเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบกเบฑเบ™. KEDA เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

Scalers เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, Kafka, Redis, Prometheus. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, KEDA เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ‚เบฐ เปœเบฒเบ” เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Kubernetes เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ Prometheus metrics เป€เบ›เบฑเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚.

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš 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) เปƒเบ™ Redis. เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ HTTP เปเบฅเบฐเบเบฑเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡ Prometheus metrics. เบ„เปˆเบฒเป€เบกเบ•เบฃเบดเบเบ•เป‰เบญเบ‡เป€เบ—เบปเปˆเบฒเบเบฑเบšเบ„เปˆเบฒ 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)
       }
    

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเบ™เบณเปƒเบŠเป‰เบเบฑเบš Kubernetes เบœเปˆเบฒเบ™ Deployment. เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบเบฑเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™ ClusterIP, เบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Prometheus เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ.

เบ—เบตเปˆเบ™เบตเป‰ เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” manifest เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ.

เป€เบŠเบตเบšเป€เบงเบต Prometheus

เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Prometheus เบ›เบฐเบเบญเบšเบ”เป‰เบงเบ:

  • ConfigMap - เบเบฒเบ™โ€‹เป‚เบญเบ™โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ Prometheusโ€‹;
  • Deployment โ€” เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Prometheus เปƒเบ™เบเบธเปˆเบก Kubernetes;
  • ClusterIP โ€” เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡ UI Prometheusโ€‹;
  • ClusterRole, ClusterRoleBinding ะธ ServiceAccount โ€” เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹เปƒเบ™ Kubernetes (เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบžเบปเบšโ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹)โ€‹.

เบ—เบตเปˆเบ™เบตเป‰ manifest เบชเปเบฒเบฅเบฑเบšเปเบฅเปˆเบ™ Prometheus.

KEDA Prometheus ScaledObject

เป€เบ„เบทเปˆเบญเบ‡เบงเบฑเบ”เปเบ—เบเบ‚เบฐเบซเบ™เบฒเบ”เป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ‚เบปเบงเบฅเบฐเบซเบงเปˆเบฒเบ‡ KEDA เปเบฅเบฐเบฅเบฐเบšเบปเบšเบžเบฒเบเบ™เบญเบเบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบš metrics. ScaledObject เป€เบ›เบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบทเปˆเบญ synchronize เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเบฑเบšเปเบซเบผเปˆเบ‡เป€เบซเบ”เบเบฒเบ™, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰ Prometheus.

ScaledObject เบ›เบฐเบเบญเบšเบกเบตเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เบเบฒเบ™เบ™เบณเปƒเบŠเป‰, metadata เปเบซเบผเปˆเบ‡เป€เบซเบ”เบเบฒเบ™ (เป€เบŠเบฑเปˆเบ™: เบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบŠเบทเปˆเปเบ–เบง), เป„เบฅเบเบฐเบเบฒเบ™เบชเบณเบซเบผเบงเบ”, เป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เบเบนเป‰เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†. เบกเบฑเบ™เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ autoscaling เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™ (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. เบ›เบฐโ€‹เป€เบžเบ” Trigger - Prometheus. เบ—เบตเปˆเบขเบนเปˆเป€เบŠเบตเบšเป€เบงเบต Prometheus เป„เบ”เป‰เบ–เบทเบเบเปˆเบฒเบงเป€เบ–เบดเบ‡เบžเป‰เบญเบกเบเบฑเบšเบŠเบทเปˆ metric, เป€เบเบ™เปเบฅเบฐ เบชเบญเบšเบ–เบฒเบก PromQL, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. PromQL Query - sum(rate(http_requests[2m])).
  3. เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™ pollingInterval,KEDA เบฎเป‰เบญเบ‡เบ‚เปเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบˆเบฒเบ Prometheus เบ—เบธเบเป†เบชเบดเบšเบซเป‰เบฒเบงเบดเบ™เบฒเบ—เบต. เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบซเบ™เบถเปˆเบ‡เบžเบฒเบเปƒเบ•เป‰ (minReplicaCount), เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบเบฑเบเบšเปเปˆเป€เบเบตเบ™ maxReplicaCount (เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰ - เบชเบดเบš).

เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป„เบ”เป‰ minReplicaCount เป€เบ—เบปเปˆเบฒเบเบฑเบšเบชเบนเบ™. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, KEDA activates เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ zero-to-one เปเบฅเบฐโ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™ exposes HPA เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ”โ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบก. เบ„เปเบฒเบชเบฑเปˆเบ‡เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™เบเปเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบˆเบฒเบเบซเบ™เบถเปˆเบ‡เบซเบฒเบชเบนเบ™. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เป€เบฅเบทเบญเบเบชเบนเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ HTTP เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบฅเบฐเบšเบปเบšเบ•เบฒเบกเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™.

เบ„เบงเบฒเบกเบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™เบžเบฒเบเปƒเบ™ autoscaling

เป€เบเบ™เบ–เบทเบเปƒเบŠเป‰เป€เบ›เบฑเบ™เบ•เบปเบงเบเบฐเบ•เบธเป‰เบ™เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”เบเบฒเบ™เบ™เบณเปƒเบŠเป‰. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ„เปเบฒเบ–เบฒเบก PromQL sum(rate (http_requests [2m])) เบชเบปเปˆเบ‡เบ„เบทเบ™เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป HTTP เบฅเบงเบก (เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต), เบงเบฑเบ”เปเบ—เบเปƒเบ™เป„เบฅเบเบฐเบชเบญเบ‡เบ™เบฒเบ—เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เปˆเบฒเป€เบเบ™เปเบกเปˆเบ™เบชเบฒเบก, เบกเบฑเบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบˆเบฐเบกเบตเบซเบ™เบถเปˆเบ‡เบžเบฒเบเปƒเบ•เป‰เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบกเบนเบ™เบ„เปˆเบฒ sum(rate (http_requests [2m])) เบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบชเบฒเบก. เบ–เป‰เบฒเบกเบนเบ™เบ„เปˆเบฒเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™, เบเปˆเบญเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เบฑเป‰เบ‡ sum(rate (http_requests [2m])) เป€เบžเบตเปˆเบกโ€‹เบ‚เบถเป‰เบ™โ€‹เบชเบฒเบกโ€‹. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบ„เปˆเบฒเปเบกเปˆเบ™เบˆเบฒเบ 12 เบซเบฒ 14, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฑเบเปเบกเปˆเบ™เบชเบตเปˆ.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบฅเบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบกเบฑเบ™เป€เบšเบดเปˆเบ‡!

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบฅเปˆเบงเบ‡เปœเป‰เบฒ

เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปเบกเปˆเบ™โ€‹เบเบธเปˆเบก Kubernetes เปเบฅเบฐโ€‹เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบ„เปˆเบฒ kubectl. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เปƒเบŠเป‰เบเบธเปˆเบก minikube, เปเบ•เปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบญเบฑเบ™เบญเบทเปˆเบ™เป„เบ”เป‰. เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ cluster เบกเบต เบ„เบนเปˆเบกเบท.

เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบงเบตเบŠเบฑเบ™เบซเบผเป‰เบฒเบชเบธเบ”เปƒเบ™ 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/

เบ•เบฑเป‰เบ‡ kubectlเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบธเปˆเบก 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 monolithic:

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

KEDA เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ namespace 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 pod เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบชเบฐเบ–เบฒเบ™เบฐเปเบฅเปˆเบ™.

เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบ™เบฑเบเปเบ›: เบœเบนเป‰เบ‚เบฝเบ™เปƒเบŠเป‰ 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

Prometheus manifest เปƒเบŠเป‰ เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบšเปเบฅเบดเบเบฒเบ™ 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

เบฅเปเบ–เป‰เบฒ Prometheus เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฑเบ” Running.

เปƒเบŠเป‰ kubectl port-forward เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเบœเบนเป‰เปƒเบŠเป‰ Prometheus (เบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ API) เบขเบนเปˆ http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

เบ™เบณเปƒเบŠเป‰ KEDA Autoscaling Configuration

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡ 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"

เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ„เปˆเบฒ metric เปเบกเปˆเบ™ 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

เป‚เบซเบผเบ”เบเบฒเบ™เบชเป‰เบฒเบ‡

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ hey - เบœเบปเบ™โ€‹เบ›เบฐโ€‹เป‚เบซเบเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบซเบผเบ”โ€‹:

curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64 
&& chmod a+x hey

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ”เบฒเบงเบ™เปŒเป‚เบซเบฅเบ”เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบš Linux เบซเบผเบท Windows.

เปเบฅเปˆเบ™เบกเบฑเบ™:

./hey http://localhost:8080/test

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเบปเปˆเบ‡ 200 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ Prometheus metrics เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš 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.

เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก!

เปƒเบ™ terminal เปƒเบซเบกเปˆ, เบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ pods เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

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 เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เบญเบฑเบ”โ€‹เบ•เบฐโ€‹เป‚เบ™โ€‹เบกเบฑเบ” (เป€เบ›เบฑเบ™ / เบˆเบฒเบโ€‹เบชเบนเบ™โ€‹) เป‚เบ”เบโ€‹เบญเบตเบ‡โ€‹เปƒเบชเปˆโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบงเบฑเบ”โ€‹เปเบ—เบโ€‹เบžเบฒเบโ€‹เบ™เบญเบโ€‹. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบญเบตเบ‡เปƒเบชเปˆ metrics Prometheus, เบ„เบงเบฒเบกเบเบฒเบงเปเบ–เบงเปƒเบ™ Redis, เบ„เบงเบฒเบกเบŠเบฑเบเบŠเป‰เบฒเบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเป‚เบžเบเปƒเบ™เบซเบปเบงเบ‚เปเป‰ Kafka.

KEDA เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบšเปเบซเบผเปˆเบ‡เบžเบฒเบเบ™เบญเบเปเบฅเบฐเบเบฑเบ‡เบชเบฐเบซเบ™เบญเบ‡ metrics เบ‚เบญเบ‡เบกเบฑเบ™เป‚เบ”เบเบœเปˆเบฒเบ™ Metrics Server เบเบฑเบš Horizontal Pod Autoscaler.

เป‚เบŠเบเบ”เบต!

เบกเบตเบซเบเบฑเบ‡เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™:

  1. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเปˆเบ™เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบตเปเบฅเบฐ Kubernetes เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบœเบฐเบฅเบดเบ”.
  2. 90+ เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบš Kubernetes: เบเบฒเบ™เบ™เบณเปƒเบŠเป‰, เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™, เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž เปเบฅเบฐเบญเบทเปˆเบ™เป†เบญเบตเบ.
  3. เบŠเปˆเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบกเบฒเบ™ Kubernetes เปƒเบ™ Telegram.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™