Prometheus рд░ KEDA рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓ рдЧрд░реНрджреИ

Prometheus рд░ KEDA рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓ рдЧрд░реНрджреИCimuanos рджреНрд╡рд╛рд░рд╛ рдмреЗрд▓реБрди рдореНрдпрд╛рди

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

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

рдЯреЛрд▓реА Kubernetes aaS Mail.ru рдмрд╛рдЯ Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рдмрд╛рд╣реНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдПрдЙрдЯрд╛ рд▓реЗрдЦ рдЕрдиреБрд╡рд╛рдж рдЧрд░рд┐рдпреЛред рд╕рдмреИ рдХреБрд░рд╛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрджрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрди, рд▓реЗрдЦрдХрд▓реЗ HTTP рдкрд╣реБрдБрдЪ рдЕрдиреБрд░реЛрдз рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЬреБрди рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдиреНрдЫред

рдкреЛрдбрд╣рд░реВрдХреЛ рддреЗрд░реНрд╕реЛ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧрдХреЛ рд╕рдЯреНрдЯрд╛, Kubernetes Event Driven Autoscaling (KEDA) рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд Kubernetes рдЕрдкрд░реЗрдЯрд░ред рдпреЛ рдШрдЯрдирд╛-рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрдпрднрд╛рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рдорд▓реЗрд╕ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ (рд╢реВрдиреНрдпрдмрд╛рдЯ/рд╢реВрдиреНрдп рд╕рд╣рд┐рдд) рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╣реЛрд░рд┐рдЬреЛрдиреНрдЯрд▓ рдкреЛрдб рдЕрдЯреЛрд╕реНрдХреЗрд▓рд░рд╕рдБрдЧ рдиреЗрдЯрд┐рдн рд░реВрдкрдорд╛ рдПрдХреАрдХреГрдд рд╣реБрдиреНрдЫред рдХреЛрдб рдЙрдкрд▓рдмреНрдз рдЫ GitHub.

рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди

Prometheus рд░ KEDA рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Kubernetes рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓ рдЧрд░реНрджреИ

рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреНрдиреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрдЦрд╛рдЙрдБрдЫ:

  1. рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдврд╛рдБрдЪрд╛рдорд╛ HTTP рд╣рд┐рдЯ рдЧрдгрдирд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред
  2. рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдпреА рдореЗрдЯреНрд░рд┐рдХрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫред
  3. KEDA рдорд╛ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕реНрдХреЗрд▓рд░ HTTP рд╣рд┐рдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫред

рдЕрдм рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рдмрддрд╛рдЙрдиреЗрдЫреБред

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

Prometheus рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд░рдгрд╛рд▓реА рдЕрдиреБрдЧрдорди рд░ рдЪреЗрддрд╛рд╡рдиреА рдЯреВрд▓рдХрд┐рдЯ, рднрд╛рдЧ рд╣реЛ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рдн рдХрдореНрдкреНрдпреБрдЯрд┐рдВрдЧ рдлрд╛рдЙрдиреНрдбреЗрд╢рдиред рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдореЗрдЯреНрд░рд┐рдХрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрджрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдбреЗрдЯрд╛рдХреЛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреЗ рдбрд╛рдЯрд╛ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрди рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╡рд╛ Kubernetes API рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдиреНрдп рднрд┐рдЬреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдЙрдкрдХрд░рдгрд╣рд░реВред

KEDA рд▓реЗ рд╕реНрдХреЗрд▓рд░рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ - рдпрд╕рд▓реЗ KEDA рд░ рдмрд╛рд╣реНрдп рдкреНрд░рдгрд╛рд▓реА рдмреАрдЪрдХреЛ рдкреБрд▓рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред рд╕реНрдХреЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рддреНрдпреЗрдХ рд▓рдХреНрд╖реНрдп рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЫ рд░ рдпрд╕рдмрд╛рдЯ рдбрд╛рдЯрд╛ рдирд┐рдХрд╛рд▓реНрдЫред KEDA рд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рдкрди рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рд╕реНрдХреЗрд▓рд░рд╣рд░реВрд▓реЗ рдзреЗрд░реИ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╕рдорд░реНрдерди рдЧрд░реНрдЫрдиреН, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХрд╛рдлреНрдХрд╛, рд░реЗрдбрд┐рд╕, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ред рдЕрд░реНрдерд╛рддреН, KEDA рдорд╛рдкрджрдгреНрдбрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Kubernetes рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди

Golang рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ 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) Redis рдорд╛ред рдпреЛ HTTP рд╣реНрдпрд╛рдиреНрдбрд▓рд░рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рд░ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ рд╣реЛред рдореЗрдЯреНрд░рд┐рдХ рдорд╛рди рдорд╛рди рдЬрд╕реНрддреИ рд╣реБрдиреБрдкрд░реНрдЫ 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, рдпрд╕рд▓реЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рд░реНрднрд░рд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдпрд╣рд╛рдБ рдЖрд╡реЗрджрдирдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдореЗрдирд┐рдлреЗрд╕реНрдЯ.

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рд░реНрднрд░

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдореЗрдирд┐рдлреЗрд╕реНрдЯрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫ:

  • ConfigMap - рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди;
  • Deployment - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рддреИрдирд╛рдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐;
  • ClusterIP - UI Prometheus рдХреЛ рдкрд╣реБрдБрдЪ рдХреЛ рд▓рд╛рдЧреА рд╕реЗрд╡рд╛;
  • ClusterRole, ClusterRoleBinding ╨╕ ServiceAccount - Kubernetes (рд╕реНрд╡рдд: рдЦреЛрдЬ) рдорд╛ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╕реНрд╡рдд: рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ред

рдпрд╣рд╛рдБ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдХрдЯ.

KEDA Prometheus ScaledObject

рд╕реНрдХреЗрд▓рд░рд▓реЗ рдХреЗрдбрд╛ рд░ рдмрд╛рд╣реНрдп рдкреНрд░рдгрд╛рд▓реА рдмреАрдЪрдХреЛ рдкреБрд▓рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ рдЬрд╕рдмрд╛рдЯ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред ScaledObject рдпреЛ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╕реНрд░реЛрдд рд╣реЛ рдЬреБрди рдШрдЯрдирд╛ рд╕реНрд░реЛрддрд╕рдБрдЧ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрди рддреИрдирд╛рде рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ред

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, рддрд░ рддрдкрд╛рдИрдВ рдХреБрдиреИ рдкрдирд┐ рдЕрд░реНрдХреЛ рд▓рд┐рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рддреНрдпрд╣рд╛рдБ рдЫ рдЧрд╛рдИрдб.

рдореНрдпрд╛рдХрдорд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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 рдХреНрд▓рд╕реНрдЯрд░ рдкрд╣реБрдБрдЪ рдЧрд░реНрдиред

рдореНрдпрд╛рдХрдорд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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ред рд░ рддреНрдпрд╕ рдкрдЫрд┐, рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реНред

рд╣реЗрд▓реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░реЗрдбрд┐рд╕ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рд╣реЗрд▓рдо рд╕реНрдерд╛рдкрдирд╛ рдЫреИрди рднрдиреЗ, рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдиреЗрддреГрддреНрд╡ред рдореНрдпрд╛рдХрдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрджреЗрд╢:

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

helm init рд╕реНрдерд╛рдиреАрдп рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрджрдЫ рд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджрдЫ Tiller Kubernetes рдХреНрд▓рд╕реНрдЯрд░рдорд╛ред

kubectl get pods -n kube-system | grep tiller

рдЯрд┐рд▓рд░ рдкреЛрдб рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреБрд╣реЛрд╕реНред

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

рд╣реЗрд▓рдо рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдкрдЫрд┐, 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_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 рдмрд░рд╛рдмрд░ рез:

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

KEDA рдмрд╛рд╣реНрдп рд╕реНрд░реЛрддрд╕рдБрдЧ рдПрдХреАрдХреГрдд рд╣реБрдиреНрдЫ рд░ Metrics Server рдорд╛рд░реНрдлрдд Horizontal Pod Autoscaler рдорд╛ рдЖрдлреНрдиреЛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред

рд╢реБрднрдХрд╛рдордирд╛!

рдЕрд░реБ рдХреЗ рдкрдвреНрдиреЗ:

  1. рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдХрдиреНрдЯреЗрдирд░ рд░ Kubernetes рдЪрд▓рд╛рдЙрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЙрддреНрддрдо рдЕрднреНрдпрд╛рд╕рд╣рд░реВ рд░ рдЙрддреНрддрдо рдЕрднреНрдпрд╛рд╕рд╣рд░реВ.
  2. Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ 90+ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдгрд╣рд░реВ: рддреИрдирд╛рддреА, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрд╕реБрд░рдХреНрд╖рд╛ рд░ рдердк.
  3. Telegram рдорд╛ Kubernetes рдХреЛ рдЖрд╕рдкрд╛рд╕ рд╣рд╛рдореНрд░реЛ рдЪреНрдпрд╛рдирд▓.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди