рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдФрд░ рдХреЗрдИрдбреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдСрдЯреЛрд╕реНрдХреЗрд▓ рдХрд░рдирд╛

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдФрд░ рдХреЗрдИрдбреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдСрдЯреЛрд╕реНрдХреЗрд▓ рдХрд░рдирд╛рд╕рд┐рдореБрдЖрдиреЛрд╕ рджреНрд╡рд╛рд░рд╛ рдмреИрд▓реВрди рдореИрди

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

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

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

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

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

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдФрд░ рдХреЗрдИрдбреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдСрдЯреЛрд╕реНрдХреЗрд▓ рдХрд░рдирд╛

рдЖрд░реЗрдЦ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ HTTP рд╣рд┐рдЯ рдХрд╛рдЙрдВрдЯ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  2. рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рдЗрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рдХреЗрдИрдбреАрдП рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реНрдХреЗрд▓рд░ рдХреЛ HTTP рд╣рд┐рдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ред

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

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕рд┐рд╕реНрдЯрдо рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдФрд░ рдЕрд▓рд░реНрдЯрд┐рдВрдЧ рдЯреВрд▓рдХрд┐рдЯ, рднрд╛рдЧ рд╣реИ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдлрд╛рдЙрдВрдбреЗрд╢рди. рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдпрд╛ рдЕрдиреНрдп рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЙрдкрдХрд░рдг рдЬреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

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

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

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

рдЧреЛрд▓рд╛рдВрдЧ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:

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

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

рдпрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ.

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

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • ConfigMap - рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
  • Deployment - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
  • ClusterIP - рдпреВрдЖрдИ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛;
  • ClusterRole, ClusterRoleBinding ╨╕ ServiceAccount - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ (рдСрдЯреЛ-рдбрд┐рд╕реНрдХрд╡рд░реА) рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╕реНрд╡рдд: рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

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

рдХреЗрдбрд╛ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реНрдХреЗрд▓реНрдбрдСрдмреНрдЬреЗрдХреНрдЯ

рд╕реНрдХреЗрд▓рд░ рдХреЗрдИрдбреАрдП рдФрд░ рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмреАрдЪ рдПрдХ рдкреБрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред ScaledObject рдПрдХ рдХрд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрди рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ред

ScaledObject рдЗрд╕рдореЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдИрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ рдХрдиреЗрдХреНрд╢рди рд░рд╣рд╕реНрдп, рдХрддрд╛рд░ рдирд╛рдо), рдорддрджрд╛рди рдЕрдВрддрд░рд╛рд▓, рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдЕрд╡рдзрд┐ рдФрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреИрдирд╛рддреА рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрди (рдПрдЪрдкреАрдП рдкрд░рд┐рднрд╛рд╖рд╛) рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЬрдм рдХреЛрдИ рд╡рд╕реНрддреБ ScaledObject рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдВрдмрдВрдзрд┐рдд рдПрдЪрдкреАрдП рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рд╛рдлрд╝ рдХрд░ рджреА рдЧрдИ рд╣реИред

рдпрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ 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. рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рд░реНрд╡рд░ рдкрддреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдореАрдЯреНрд░рд┐рдХ рдирд╛рдо, рд╕реАрдорд╛ рдФрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдкреНрд░реЛрдордХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░реЛрдордХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА - sum(rate(http_requests[2m])).
  3. рдХреЗ рдЕрдиреБрд╕рд╛рд░ pollingInterval,KEDA рд╣рд░ рдкрдВрджреНрд░рд╣ рд╕реЗрдХрдВрдб рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдПрдХ рд▓рдХреНрд╖реНрдп рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЗ рдЕрдВрддрд░реНрдЧрдд (minReplicaCount), рдФрд░ рдкреЙрдбреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ maxReplicaCount (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ - рджрд╕).

рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ minReplicaCount рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрдИрдбреАрдП рд╢реВрдиреНрдп-рд╕реЗ-рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдЧреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдЪрдкреАрдП рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдЙрд▓рдЯрд╛ рдХреНрд░рдо рднреА рд╕рдВрднрд╡ рд╣реИ, рдпрд╛рдиреА рдПрдХ рд╕реЗ рд╢реВрдиреНрдп рддрдХ рд╕реНрдХреЗрд▓рд┐рдВрдЧред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╢реВрдиреНрдп рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ HTTP рд╕реЗрд╡рд╛ рд╣реИ рди рдХрд┐ рдСрди-рдбрд┐рдорд╛рдВрдб рдкреНрд░рдгрд╛рд▓реАред

рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдЬрд╛рджреВ

рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрд╢реЛрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, PromQL рдХреНрд╡реЗрд░реА sum(rate (http_requests [2m])) рдкрд┐рдЫрд▓реЗ рджреЛ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдорд╛рдкреА рдЧрдИ рдПрдХрддреНрд░рд┐рдд HTTP рдЕрдиреБрд░реЛрдз рджрд░ (рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз) рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЪреВрдБрдХрд┐ рд╕реАрдорд╛ рдорд╛рди рддреАрди рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдорд╛рди рдХреЗ рдиреАрдЪреЗ рдПрдХ рд╣реЛрдЧрд╛ sum(rate (http_requests [2m])) рддреАрди рд╕реЗ рдХрдо. рдпрджрд┐ рдорд╛рди рдмрдврд╝рддрд╛ рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдк рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ sum(rate (http_requests [2m])) рддреАрди рд╕реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдорд╛рди 12 рд╕реЗ 14 рддрдХ рд╣реИ, рддреЛ рдкреЙрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЪрд╛рд░ рд╣реИред

рдЖрдЗрдП рдЕрдм рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ!

presetting

рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдФрд░ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ 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 рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ рдкреНрд░рд▓реЗрдЦрди. рдореИрдВ рдЕрдЦрдВрдб 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯрд┐рд▓рд░ рд╕рд░реНрд╡рд░ рдШрдЯрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдм рд╣реЗрд▓реНрдо@3 рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд╛рд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣реЗрд▓реНрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд░реЗрдбрд┐рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

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

рд░реЗрдбрд┐рд╕ рдХреЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ 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 рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрд╛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП 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

рдЕрдм рдЖрдк рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЧреЛ рдРрдк рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ 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 рдпрд╛ Windows.

рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

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

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ 200 рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд░реЗрдбрд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдЪрдкреАрдП рддреИрдирд╛рддреА рдХреЛ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирдП рдкреЙрдбреНрд╕ рд▓реЙрдиреНрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдПрдЪрдкреАрдП рдЬрд╛рдВрдЪреЗрдВ:

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

рдирд┐рд╖реНрдХрд░реНрд╖

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

рдХреЗрдИрдбреАрдП рдПрдХ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЙрд░рд┐рдЬреЙрдиреНрдЯрд▓ рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЗрд▓рд░ рдХреЛ рдЕрдкрдиреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп!

рдФрд░ рдХреНрдпрд╛ рдкрдврд╝реЗрдВ:

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ