Prometheus рдЖрдгрд┐ KEDA рд╡рд╛рдкрд░реВрди Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ

Prometheus рдЖрдгрд┐ KEDA рд╡рд╛рдкрд░реВрди Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧCimuanos рджреНрд╡рд╛рд░реЗ рдмрд▓реВрди рдореЕрди

рдХреНрд▓рд╛рдЙрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рд╣реА рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. Kubernetes рд╕рд╣, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд░рдгреЗ рдпреЛрдЧреНрдп рддреИрдирд╛рддреАрд╕рд╛рдареА рдкреНрд░рддрд┐рдХреГрддреАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд╡рдгреНрдпрд╛рдЗрддрдХреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ рдХрд┐рдВрд╡рд╛ ReplicaSet - рдкрдг рд╣реА рдПрдХ рдореЕрдиреНрдпреБрдЕрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ.

Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдирд╛ рдЖрдкреЛрдЖрдк рд╕реНрдХреЗрд▓ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ (рдЙрджрд╛. рдЙрдкрдпреЛрдЬрдирд╛рддреАрд▓ рдкреЙрдбреНрд╕ рдХрд┐рдВрд╡рд╛ ReplicaSet) рдХреНрд╖реИрддрд┐рдЬ рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЗрд▓рд░ рддрдкрд╢реАрд▓ рд╡рд╛рдкрд░реВрди рдШреЛрд╖рдгрд╛рддреНрдордХ рдкрджреНрдзрддреАрдиреЗ. рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧрд╕рд╛рдареА рдбреАрдлреЙрд▓реНрдЯ рдирд┐рдХрд╖ CPU рд╡рд╛рдкрд░ рдореЗрдЯреНрд░рд┐рдХреНрд╕ (рд╕рдВрд╕рд╛рдзрди рдореЗрдЯреНрд░рд┐рдХреНрд╕) рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреБрдореНрд╣реА рд╕рд╛рдиреБрдХреВрд▓ рдЖрдгрд┐ рдмрд╛рд╣реНрдпрд░рд┐рддреНрдпрд╛ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░реВ рд╢рдХрддрд╛.

рд╕рдВрдШ Mail.ru рд╡рд░реВрди Kubernetes aaS Kubernetes рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╕реНрдХреЗрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рд╣реНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╕реЗ рд╡рд╛рдкрд░рд╛рд╡реЗ рдпрд╛рд╡рд░реАрд▓ рд▓реЗрдЦрд╛рдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рдХреЗрд▓реЗ. рд╕рд░реНрд╡ рдХрд╛рд╣реА рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рджрд░реНрд╢рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рд▓реЗрдЦрдХ HTTP рдкреНрд░рд╡реЗрд╢ рд╡рд┐рдирдВрддреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рдкрд░рддрд╛рдд, рдЬреЗ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╡рд╛рдкрд░реВрди рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рдкреЙрдбреНрд╕рдЪреНрдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧрдРрд╡рдЬреА, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЗрд╡реНрд╣реЗрдВрдЯ рдбреНрд░рд╛рдпрд╡реНрд╣рди рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ (KEDA) рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ, рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ Kubernetes рдСрдкрд░реЗрдЯрд░. рдЗрд╡реНрд╣реЗрдВрдЯ-рдЪрд╛рд▓рд┐рдд рд╡рд░реНрдХрд▓реЛрдбреНрд╕рд╕рд╛рдареА рд╕реАрдорд▓реЗрд╕ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ (рд╢реВрдиреНрдп рдкрд╛рд╕реВрди/рд╢реВрдиреНрдп рд╕рд╣рд┐рдд) рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдХреНрд╖реИрддрд┐рдЬ рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЗрд▓рд░рд╕рд╣ рдореВрд│рдкрдгреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рддреЗ. рдХреЛрдб рдпреЗрдереЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ GitHub.

рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

Prometheus рдЖрдгрд┐ KEDA рд╡рд╛рдкрд░реВрди Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ

рдЖрдХреГрддреА рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд░реНрдгрди рджрд░реНрд╢рд╡рд┐рддреЗ:

  1. рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ HTTP рд╣рд┐рдЯ рдХрд╛рдЙрдВрдЯ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
  2. рд╣реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ.
  3. KEDA рдордзреАрд▓ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕реНрдХреЗрд▓рд░ рд╣реЗ HTTP рд╣рд┐рдЯрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдореЛрдЬрдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рдЖрддрд╛ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХрд╛рдмрджреНрджрд▓ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕рд╛рдВрдЧреЗрди.

рдХреЗрдбрд╛ рдЖрдгрд┐ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕

рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╣реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рд┐рд╕реНрдЯрдо рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдЖрдгрд┐ рдЕрд▓рд░реНрдЯрд┐рдВрдЧ рдЯреВрд▓рдХрд┐рдЯ рдЖрд╣реЗ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡реНрд╣ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдлрд╛рдЙрдВрдбреЗрд╢рди. рд╡рд┐рд╡рд┐рдз рд╕реНрддреНрд░реЛрддрд╛рдВрдХрдбреВрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╡реЗрд│ рдорд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛ рдореНрд╣рдгреВрди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ. рдбреЗрдЯрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рдЯреВрд▓реНрд╕ рдЬреЗ Kubernetes API рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд.

KEDA рд╕реНрдХреЗрд▓рд░рдЪреНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдиреЗрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ - рддреЗ рдХреЗрдбрд╛ рдЖрдгрд┐ рдмрд╛рд╣реНрдп рдкреНрд░рдгрд╛рд▓реА рдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ рдкреВрд▓ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рддреЗ. рд╕реНрдХреЗрд▓рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдкреНрд░рддреНрдпреЗрдХ рд▓рдХреНрд╖реНрдп рдкреНрд░рдгрд╛рд▓реАрд╕рд╛рдареА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдбреЗрдЯрд╛ рдХрд╛рдврддреЛ. KEDA рдирдВрддрд░ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддреЗ.

рд╕реНрдХреЗрд▓рд░ рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХрд╛рдлреНрдХрд╛, рд░реЗрдбрд┐рд╕, рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕. рдореНрд╣рдгрдЬреЗрдЪ, KEDA рдЪрд╛ рд╡рд╛рдкрд░ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕рдЪрд╛ рдирд┐рдХрд╖ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░ рдХрд░реВрди рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЙрдкрдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдореЛрдЬрдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.

рдЪрд╛рдЪрдгреА рдЕрд░реНрдЬ

рдЧреЛрд▓рд╛рдВрдЧ рдЪрд╛рдЪрдгреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ HTTP рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддреЛ рдЖрдгрд┐ рджреЛрди рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЗ рдХрд░рддреЛ:

  1. рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдиреНрд╕реНрдЯреНрд░реБрдореЗрдВрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ http_requests рдореЗрдЯреНрд░рд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Prometheus Go рдХреНрд▓рд╛рдпрдВрдЯ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░рддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╣рд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдЕрд╕рддреЗ. рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЬрд┐рдереЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд рддреЛ рд╢реЗрд╡рдЯрдЪрд╛ рдмрд┐рдВрджреВ URI рд╡рд░ рд╕реНрдерд┐рдд рдЖрд╣реЗ /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. рд╡рд┐рдирдВрддреАрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдореНрд╣рдгреВрди GET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд┐ рдЪреЗ рдореВрд▓реНрдп рд╡рд╛рдврд╡рддреЗ (access_count) рд░реЗрдбрд┐рд╕ рдордзреНрдпреЗ. HTTP рд╣рдБрдбрд▓рд░рдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ Prometheus рдореЗрдЯреНрд░рд┐рдХреНрд╕ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪрд╛ рд╣рд╛ рдПрдХ рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рдореЗрдЯреНрд░рд┐рдХ рдореВрд▓реНрдп рдореВрд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗрдЪ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ 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)
       }
    

рдЕрд░реНрдЬ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕рд╡рд░ рджреНрд╡рд╛рд░реЗ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ Deployment. рдПрдХ рд╕реЗрд╡рд╛ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХреЗрд▓реА рдЖрд╣реЗ ClusterIP, рд╣реЗ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдпреЗрдереЗ рдЕрд░реНрдЬрд╛рд╕рд╛рдареА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдореЕрдирд┐рдлреЗрд╕реНрдЯ.

рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕рд░реНрд╡реНрд╣рд░

рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдореЕрдирд┐рдлреЗрд╕реНрдЯрдордзреНрдпреЗ рд╣реЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ:

  • ConfigMap - рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА;
  • Deployment - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА;
  • ClusterIP - рдпреВрдЖрдп рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЗрд╡рд╛;
  • 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. рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕рд░реНрд╡реНрд╣рд░ рдкрддреНрддрд╛ рдореЗрдЯреНрд░рд┐рдХ рдирд╛рд╡, рдереНрд░реЗрд╢реЛрд▓реНрдб рдЖрдгрд┐ рд╕реЛрдмрдд рдирдореВрдж рдХреЗрд▓рд╛ рдЖрд╣реЗ PromQL рдХреНрд╡реЗрд░реА, рдЬреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдИрд▓. PromQL рдХреНрд╡реЗрд░реА - sum(rate(http_requests[2m])).
  3. рдорддреЗ pollingInterval,рдХреЗрдИрдбреАрдП рджрд░ рдкрдВрдзрд░рд╛ рд╕реЗрдХрдВрджрд╛рдВрдиреА рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕рдХрдбреВрди рд▓рдХреНрд╖реНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд░рддреЗ. рдХрд┐рдорд╛рди рдПрдХ рдЕрдВрддрд░реНрдЧрдд (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 рдкрд░реНрдпрдВрдд рдЕрд╕реЗрд▓, рддрд░ рд╢реЗрдВрдЧрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЪрд╛рд░ рдЖрд╣реЗ.

рдЖрддрд╛ рддреЗ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛!

рдкреНрд░реАрд╕реЗрдЯрд┐рдВрдЧ

рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЪреА рдЧрд░рдЬ рдЖрд╣реЗ 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/

рд╕реЗрдЯ kubectlKubernetes рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

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 рдСрдкрд░реЗрдЯрд░ рд╕реБрд░реВ рд╣реЛрдИрдкрд░реНрдпрдВрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рд╛ рдЖрдгрд┐ рд╡рд░ рдЬрд╛ Running State. рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░, рд╕реБрд░реВ рдареЗрд╡рд╛.

рд╣реЗрд▓реНрдо рд╡рд╛рдкрд░реВрди рд░реЗрдбрд┐рд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ

рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╣реЗрд▓реНрдо рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХреЗрд▓реЗрд▓реЗ рдирд╕рд▓реНрдпрд╛рд╕, рд╣реЗ рд╡рд╛рдкрд░рд╛ рдиреЗрддреГрддреНрд╡. Mac рд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрджреЗрд╢:

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

helm init рд╕реНрдерд╛рдирд┐рдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реБрд░реВ рдХрд░рддреЗ рдЖрдгрд┐ рд╕реНрдерд╛рдкрд┐рдд рджреЗрдЦреАрд▓ рдХрд░рддреЗ Tiller рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдХрдбреЗ.

kubectl get pods -n kube-system | grep tiller

рдЯрд┐рд▓рд░ рдкреЙрдб рд░рдирд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдордзреНрдпреЗ рдпреЗрдИрдкрд░реНрдпрдВрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рд╛.

рдЕрдиреБрд╡рд╛рджрдХрд╛рдЪреА рдЯреАрдк: рд▓реЗрдЦрдХ рд╣реЗрд▓реНрдо@2 рд╡рд╛рдкрд░рддреЛ, рдЬреНрдпрд╛рд╕рд╛рдареА рдЯрд┐рд▓рд░ рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрддрд╛ Helm@3 рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрд╣реЗ, рддреНрдпрд╛рд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░ рднрд╛рдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА.

рд╣реЗрд▓реНрдо рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рд░реЗрдбрд┐рд╕ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдХрдорд╛рдВрдб рдкреБрд░реЗрд╢реА рдЖрд╣реЗ:

helm install --name redis-server --set cluster.enabled=false --set 
usePassword=false stable/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.

рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕рд░реНрд╡реНрд╣рд░ рддреИрдирд╛рдд рдХрд░рдд рдЖрд╣реЗ

рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЕрдирд┐рдлреЗрд╕реНрдЯ рд╡рд╛рдкрд░рддреЛ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕рд╕рд╛рдареА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдбрд┐рд╕реНрдХрд╡рд░реА. рд╣реЗ рд╕рд░реНрд╡реНрд╣рд┐рд╕ рд▓реЗрдмрд▓рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЙрдбреНрд╕рдЪрд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╢реЛрдз рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

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

рдпрд╛рд╡реЗрд│реА рд░реЗрдбрд┐рд╕ рджреЗрдЦреАрд▓ рддрдкрд╛рд╕рд╛. рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХрд│реЗрд▓ 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

рдЖрдкрдг рдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрддрддрд╛ рджреЗрдЦреАрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛ linux рдХрд┐рдВрд╡рд╛ рд╡рд┐рдВрдбреЛрдЬ.

рддреЗ рдЪрд╛рд▓рд╡рд╛:

./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 рддрдкрд╛рд╕рд╛:

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

рдЬрд░ рд▓реЛрдб рд╡рд┐рд╕рдВрдЧрдд рдЕрд╕реЗрд▓, рддрд░ рддреИрдирд╛рддреА рдлрдХреНрдд рдПрдХ рдкреЙрдб рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдмрд┐рдВрджреВрдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓реА рдЬрд╛рдИрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдЯреНрд░рд┐рдХ (рдкреНрд░реЙрдордХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реАрджреНрд╡рд╛рд░реЗ рдкрд░рдд рдЖрд▓реЗ) рддрдкрд╛рд╕рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рд╛:

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 рдЙрдкрдпреЛрдЬрди (рд╢реВрдиреНрдп рдкрд╛рд╕реВрди/рд╢реВрдиреНрдп) рд╕реНрдХреЗрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕рд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рд░реЗрдбрд┐рд╕рдордзреАрд▓ рд░рд╛рдВрдЧреЗрдЪреА рд▓рд╛рдВрдмреА, рдХрд╛рдлреНрдХрд╛ рд╡рд┐рд╖рдпрд╛рддреАрд▓ рдЧреНрд░рд╛рд╣рдХ рд╡рд┐рд▓рдВрдм.

KEDA рдмрд╛рд╣реНрдп рд╕реНрддреНрд░реЛрддрд╛рд╢реА рд╕рдорд╛рдХрд▓рд┐рдд рд╣реЛрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд░реНрд╡реНрд╣рд░ рддреЗ Horizontal Pod Autoscaler рджреНрд╡рд╛рд░реЗ рджреЗрдЦреАрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рд░рд┐рдЭрд░реНрд╡реНрд╣рд░реНрд╡реНрд╣рд░ ... рдкреБрдиреНрд╣рд╛!

рдЖрдгрдЦреА рдХрд╛рдп рд╡рд╛рдЪрд╛рдпрдЪреЗ:

  1. рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА рдЖрдгрд┐ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА.
  2. Kubernetes рд╕рд╛рдареА 90+ рдЙрдкрдпреБрдХреНрдд рд╕рд╛рдзрдиреЗ: рдЙрдкрдпреЛрдЬрди, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рджреЗрдЦрд░реЗрдЦ, рд╕реБрд░рдХреНрд╖рд╛ рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА.
  3. рдЖрдордЪреЗ рдЪреЕрдиреЗрд▓ рдЕрд░рд╛рдЙрдВрдб рдХреБрдмрд░рдиреЗрдЯреЗрд╕ рдЯреЗрд▓реАрдЧреНрд░рд╛рдордордзреНрдпреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛