AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд▓реЗрдЦрдХреЛ рдЕрдиреБрд╡рд╛рдж рдкрд╛рдареНрдпрдХреНрд░рдордХреЛ рд╕реБрд░реБрд╡рд╛рддрдХреЛ рдкреВрд░реНрд╡рд╕рдиреНрдзреНрдпрд╛рдорд╛ рддрдпрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ "рдХреБрдмреЗрд░рдиреЗрдЯрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо".

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

рдореИрд▓реЗ рдпреЛ рд▓реЗрдЦ AWS рдХреЛ рд▓рд╛рдЧрд┐ Kubernetes рдХреЛ рд╕рд╛рде рджрд┐рдорд╛рдЧрдорд╛ рд▓реЗрдЦреЗрдХреЛ рдЫреБ, рддрд░ рдпреЛ (рд▓рдЧрднрдЧ) рдЕрдиреНрдп рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рдпрдХрд╣рд░реВрдорд╛ рдареНрдпрд╛рдХреНрдХреИ рдЙрд╕реНрддреИ рддрд░рд┐рдХрд╛рд▓реЗ рд▓рд╛рдЧреВ рд╣реБрдиреЗрдЫред рдо рддрдкрд╛рдИрдХреЛ рдХреНрд▓рд╕реНрдЯрд░(рд╣рд░реВ) рдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреА рдорд╛рдиреНрджреИ рдЫреБ (рдХреНрд▓рд╕реНрдЯрд░-рдЕрдЯреЛрд╕реНрдХреЗрд▓рд░)ред рд╢реНрд░реЛрддрд╣рд░реВ рд╣рдЯрд╛рдЙрдиреЗ рд░ рддрдкрд╛рдИрдВрдХреЛ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдШрдЯрд╛рдЙрдирд╛рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдкреИрд╕рд╛ рдмрдЪрдд рдЧрд░реНрдЫ рдпрджрд┐ рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбрд╣рд░реВ (EC2 рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ) рдХреЛ рдлреНрд▓реАрдЯ рдкрдирд┐ рдШрдЯрд╛рдЙрдБрдЫ рднрдиреЗред

рдпрд╕ рд▓реЗрдЦрд▓реЗ рдХрднрд░ рдЧрд░реНрдиреЗрдЫ:

  • рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрд░реЛрддрд╣рд░реВ рд╕рдлрд╛ рдЧрд░реНрдиреЗ (рдХреБрдмреЗ- рдЪреМрдХреАрджрд╛рд░)
  • рдЧреИрд░-рдХрд╛рд░реНрдп рдШрдгреНрдЯрд╛рдХреЛ рд╕рдордпрдорд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдШрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН (kube-downscaler)
  • рддреЗрд░реНрд╕реЛ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ (HPA) рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ,
  • рдЕрддреНрдпрд╛рдзрд┐рдХ рд╕реНрд░реЛрдд рдЖрд░рдХреНрд╖рдгрдХреЛ рдХрдореА (kube-рд╕рдВрд╕рд╛рдзрди-рд░рд┐рдкреЛрд░реНрдЯ, VPA)
  • рд╕реНрдкрдЯ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрд░реЛрддрд╣рд░реВ рд╕рдлрд╛ рдЧрд░реНрджреИ

рджреНрд░реБрдд рдЧрддрд┐рдХреЛ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рдЫред рд╣рд╛рдореА рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд╕рдВрдЧрдардирд╣рд░реВ рдЪрд╛рд╣рдиреНрдЫреМрдВ рджреНрд░реБрддред рдЫрд┐рдЯреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рдЕрд░реНрде рдердк PR рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд╣рд░реВ, рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВ, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд╣рд░реВ, рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдкрдирд┐ рд╣реЛред рд╕рдмреИ рдХреБрд░рд╛ Kubernetes рдорд╛ рддреИрдирд╛рдд рдЧрд░рд┐рдПрдХреЛ рдЫред рдЯреЗрд╕реНрдЯ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рдлрд╛ рдЧрд░реНрдиреЗ рд╕рдордп рдХрд╕рд╕рдБрдЧ рдЫ? рдПрдХ рд╣рдкреНрддрд╛ рдкреБрд░рд╛рдиреЛ рдкреНрд░рдпреЛрдЧ рдореЗрдЯрд╛рдЙрдиреЗ рдмрд╛рд░реЗ рдмрд┐рд░реНрд╕рди рд╕рдЬрд┐рд▓реЛ рдЫред рд╣рд╛рдореАрд▓реЗ рдмрдиреНрдж рдЧрд░реНрди рдмрд┐рд░реНрд╕реЗрдХрд╛ рдХрд╛рд░рдгрд▓реЗ рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓ рдмрдвреНрджреИ рдЬрд╛рдиреНрдЫ:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

(рд╣реЗрдирд┐рдЩ рдЬреЗрдХрдмреНрд╕:
Zhiza:
(рдЙрджреНрдзрд░рдгрд╣рд░реВ) рдХреЛрд░реА рдХреНрд╡рд┐рди:
рдорд┐рдердХ: рддрдкрд╛рдИрдХреЛ AWS рдЦрд╛рддрд╛ рддрдкрд╛рдИрд╕рдБрдЧ рднрдПрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рдХрд╛рд░реНрдп рд╣реЛред
рддрдереНрдп: рддрдкрд╛рдИрдВрдХреЛ AWS рд╕реНрдХреЛрд░ рддрдкрд╛рдИрдВрд╕рдБрдЧ рднрдПрдХрд╛ рдЗрдиреНрдЬрд┐рдирд┐рдпрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рдХрд╛рд░реНрдп рд╣реЛред

рдЗрд╡рд╛рди рдХреБрд░реНрдиреЛрд╕реЛрдн (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдорд╛):
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрдереНрдп: рддрдкрд╛рдИрдХреЛ AWS рд╕реНрдХреЛрд░ рддрдкрд╛рдИрд▓реЗ рдЕрд╕рдХреНрд╖рдо/рдореЗрдЯрд╛рдЙрди рдмрд┐рд░реНрд╕рдиреБ рднрдПрдХреЛ рдЪреАрдЬрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛред)

Kubernetes рдЪреМрдХреАрджрд╛рд░ (kube-janitor) рд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдлрд╛ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрджрдЫред рдЪреМрдХреАрджрд╛рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рджреБрдмреИ рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рд░ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд▓рдЪрд┐рд▓реЛ рдЫ:

  • рдХреНрд▓рд╕реНрдЯрд░-рд╡рд╛рдЗрдб рдирд┐рдпрдорд╣рд░реВрд▓реЗ PR/рдкрд░реАрдХреНрд╖рдг рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдордп-рдЯреБ-рд▓рд╛рдЗрдн (TTL) рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди рд╕рдХреНрдЫред
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд░реЛрддрд╣рд░реВ рдЪреМрдХреАрджрд╛рд░/ttl рд╕рдБрдЧ рдПрдиреЛрдЯреЗрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ 7 рджрд┐рди рдкрдЫрд┐ рд╕реНрд╡рддрдГ рд╕реНрдкрд╛рдЗрдХ/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣рдЯрд╛рдЙрдиред

рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдорд╣рд░реВ YAML рдлрд╛рдЗрд▓рдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫрдиреНред рдпрд╕рдХреЛ рдорд╛рд░реНрдЧ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдорд╛рд░реНрдлрдд рдкрд╛рд░рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ --rules-file рдХреБрдмреЗ рдЪреМрдХреАрджрд╛рд░рдорд╛ред рдпрд╣рд╛рдБ рд╕рдмреИ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рд╣рдЯрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдирд┐рдпрдо рдЫ -pr- рджреБрдИ рджрд┐рди рдкрдЫрд┐ рдирд╛рдо рдорд╛:

- id: cleanup-resources-from-pull-requests
  resources:
    - namespaces
  jmespath: "contains(metadata.name, '-pr-')"
  ttl: 2d

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

- id: require-application-label
  # ╤Г╨┤╨░╨╗╨╕╤В╤М deployments ╨╕ statefulsets ╨▒╨╡╨╖ ╨╝╨╡╤В╨║╨╕ "application"
  resources:
    - deployments
    - statefulsets
  # ╤Б╨╝. http://jmespath.org/specification.html
  jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
  ttl: 7d

рдХреБрдмреЗ-рдЬрдирд┐рдЯрд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рейреж рдорд┐рдиреЗрдЯрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдордп-рд╕реАрдорд┐рдд рдбреЗрдореЛ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m

рдмрдвреНрджреЛ рд▓рд╛рдЧрддрдХреЛ рдЕрд░реНрдХреЛ рд╕реНрд░реЛрдд рдирд┐рд░рдиреНрддрд░ рдорд╛рддреНрд░рд╛ (AWS EBS) рд╣реЛред Kubernetes StatefulSet рдореЗрдЯрд╛рдЙрдирд╛рд▓реЗ рдпрд╕рдХреЛ рдирд┐рд░рдиреНрддрд░ рднреЛрд▓реНрдпреБрдорд╣рд░реВ (PVC - PersistentVolumeClaim) рдореЗрдЯрд╛рдЙрдБрджреИрдиред рдЕрдкреНрд░рдпреБрдХреНрдд EBS рднреЛрд▓реНрдпреБрдорд╣рд░реВ рд╕рдЬрд┐рд▓реИ рдкреНрд░рддрд┐ рдорд╣рд┐рдирд╛ рд╕рдпреМрдВ рдбрд▓рд░рдХреЛ рд▓рд╛рдЧрддрдорд╛ рдкрд░рд┐рдгрд╛рдо рд╣реБрди рд╕рдХреНрдЫред Kubernetes Janitor рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧ рдирдЧрд░рд┐рдПрдХрд╛ PVCs рд╕рдлрд╛ рдЧрд░реНрдиреЗ рд╕реБрд╡рд┐рдзрд╛ рдЫред рдЙрджрд╛рд╣рд░рдгрдХреЛ рд▓рд╛рдЧрд┐, рдпреЛ рдирд┐рдпрдорд▓реЗ рд╕рдмреИ PVC рд╣рд░реВ рд╣рдЯрд╛рдЙрдиреЗрдЫ рдЬреБрди рдореЛрдбреНрдпреБрд▓рджреНрд╡рд╛рд░рд╛ рдорд╛рдЙрдиреНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рд░ рдЬреБрди рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯ рд╡рд╛ рдХреНрд░реЛрдирдЬрдмрджреНрд╡рд╛рд░рд╛ рд╕рдиреНрджрд░реНрдн рдЧрд░рд┐рдПрдХреЛ рдЫреИрди:

# ╤Г╨┤╨░╨╗╨╕╤В╤М ╨▓╤Б╨╡ PVC, ╨║╨╛╤В╨╛╤А╤Л╨╡ ╨╜╨╡ ╤Б╨╝╨╛╨╜╤В╨╕╤А╨╛╨▓╨░╨╜╤Л ╨╕ ╨╜╨░ ╨║╨╛╤В╨╛╤А╤Л╨╡ ╨╜╨╡ ╤Б╤Б╤Л╨╗╨░╤О╤В╤Б╤П StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

Kubernetes Janitor рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрдлреНрдиреЛ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдлрд╛ рд░рд╛рдЦреНрди рд░ рдХреНрд▓рд╛рдЙрдб рдХрдореНрдкреНрдпреБрдЯрд┐рдЩ рд▓рд╛рдЧрддрд╣рд░реВ рдмрд┐рд╕реНрддрд╛рд░реИ рдЬрдореНрдорд╛ рд╣реБрдирдмрд╛рдЯ рд░реЛрдХреНрди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫред рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдкрд╛рд▓рдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН README рдХреБрдмреЗ- рдЪреМрдХреАрджрд╛рд░.

рдЧреИрд░-рдХрд╛рд░реНрдп рдШрдгреНрдЯрд╛рдХреЛ рд╕рдордпрдорд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдШрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН

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

Kubernetes Downscaler (kube-downscaler) рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрд▓рд╛рдИ рдЧреИрд░-рдХрд╛рдордХрд╛ рдШрдгреНрдЯрд╛рд╣рд░реВрдорд╛ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛рдИ рдорд╛рдкрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВ рд░ рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯрд╣рд░реВрд▓реЗ рд╢реВрдиреНрдп рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред CronJobs рдирд┐рд▓рдореНрдмрд┐рдд рд╣реБрди рд╕рдХреНрдЫред Kubernetes Downscaler рд╕рдореНрдкреВрд░реНрдг рдХреНрд▓рд╕реНрдЯрд░, рдПрдХ рд╡рд╛ рдмрдвреА рдиреЗрдорд╕реНрдкреЗрд╕, рд╡рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫред рддрдкрд╛рдИрдВ рдпрд╛ рдд "рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдордп" рд╡рд╛, рд╡рд┐рдкрд░рд┐рдд, "рдХрд╛рд░реНрдп рд╕рдордп" рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд░рд╛рдд рд░ рд╕рдкреНрддрд╛рд╣рдиреНрддрдорд╛ рд╕рдХреЗрд╕рдореНрдо рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдо рдЧрд░реНрди:

image: hjacobs/kube-downscaler:20.4.3
args:
  - --interval=30
  # ╨╜╨╡ ╨╛╤В╨║╨╗╤О╤З╨░╤В╤М ╨║╨╛╨╝╨┐╨╛╨╜╨╡╨╜╤В╤Л ╨╕╨╜╤Д╤А╨░╤Б╤В╤А╤Г╨║╤В╤Г╤А╤Л
  - --exclude-namespaces=kube-system,infra
  # ╨╜╨╡ ╨╛╤В╨║╨╗╤О╤З╨░╤В╤М kube-downscaler, ╨░ ╤В╨░╨║╨╢╨╡ ╨╛╤Б╤В╨░╨▓╨╕╤В╤М Postgres Operator, ╤З╤В╨╛╨▒╤Л ╨╕╤Б╨║╨╗╤О╤З╨╡╨╜╨╜╤Л╨╝╨╕ ╨С╨Ф ╨╝╨╛╨╢╨╜╨╛ ╨▒╤Л╨╗╨╛ ╤Г╨┐╤А╨░╨▓╨╗╤П╤В╤М
  - --exclude-deployments=kube-downscaler,postgres-operator
  - --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
  - --include-resources=deployments,statefulsets,stacks,cronjobs
  - --deployment-time-annotation=deployment-time

рдпрд╣рд╛рдБ рд╕рдкреНрддрд╛рд╣рдиреНрддрдорд╛ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбрд╣рд░реВ рд╕реНрдХреЗрд▓ рдЧрд░реНрдиреЗ рдЧреНрд░рд╛рдл рдЫ:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

~ 13 рджреЗрдЦрд┐ 4 рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбрд╣рд░реВ рдорд╛рдкрди рдЧрд░реНрдирд╛рд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рддрдкрд╛рдЗрдБрдХреЛ AWS рдмрд┐рд▓рдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдлрд░рдХ рдкрд╛рд░реНрдЫред

рддрд░ рдХреЗ рдпрджрд┐ рдореИрд▓реЗ рдХреНрд▓рд╕реНрдЯрд░ "рдбрд╛рдЙрдирдЯрд╛рдЗрдо" рдХреЛ рд╕рдордпрдорд╛ рдХрд╛рдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ? рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрдирд╣рд░реВрд▓рд╛рдИ рдбрд╛рдЙрдирд╕реНрдХреЗрд▓рд░/рдмрд╣рд┐рд╖реНрдХрд░рдг: рд╕рд╛рдБрдЪреЛ рдПрдиреЛрдЯреЗрд╕рди рдердкреЗрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧрдмрд╛рдЯ рд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВ рдврд╛рдБрдЪрд╛ YYYY-MM-DD HH:MM (UTC) рдорд╛ рдирд┐рд░рдкреЗрдХреНрд╖ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдкрдХреЛ рд╕рд╛рде рдбрд╛рдЙрдирд╕реНрдХреЗрд▓рд░/exclude-until рдПрдиреЛрдЯреЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ рдмрд╣рд┐рд╖реНрдХреГрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛, рдПрдиреЛрдЯреЗрд╕рдирдХреЛ рд╕рд╛рде рдкреЛрдб рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реЗрд░ рд╕рдореНрдкреВрд░реНрдг рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдорд╛рдкрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ downscaler/force-uptime, рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, nginx рдЦрд╛рд▓реА рд╕реБрд░реБ рдЧрд░реЗрд░:

kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # ╤Г╨┤╨░╨╗╨╕╤В╤М ╤А╨░╨╖╨▓╨╡╤А╤В╤Л╨▓╨░╨╜╨╕╨╡ ╤З╨╡╤А╨╡╨╖ ╤З╨░╤Б
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true

рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН README kube-downscaler, рдпрджрд┐ рддрдкрд╛рдЗрдБ рддреИрдирд╛рддреА рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рд░ рдердк рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗред

рддреЗрд░реНрд╕реЛ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдзреЗрд░реИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ/рд╕реЗрд╡рд╛рд╣рд░реВрд▓реЗ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдЩ рдврд╛рдБрдЪрд╛рд╕рдБрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдЫрдиреН: рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реБрдиреНрдЫрдиреН, рд░ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рддрд┐рдиреАрд╣рд░реВ рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛рдорд╛ рдХрд╛рдо рдЧрд░реНрдЫрдиреНред рдЕрдзрд┐рдХрддрдо рдЪрд░рдо рднрд╛рд░рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрди рдкреЛрдбрд╣рд░реВрдХреЛ рд╕реНрдерд╛рдпреА рдлреНрд▓реАрдЯ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдиреБ рдХрд┐рдлрд╛рдпрддреА рдЫреИрдиред Kubernetes рд▓реЗ рд╕реНрд░реЛрддрдорд╛ рддреЗрд░реНрд╕реЛ рдЕрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ HorizontalPodAutoscaler (HPA)ред CPU рдкреНрд░рдпреЛрдЧ рдкреНрд░рд╛рдпрдГ рд╕реНрдХреЗрд▓рд┐рдВрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рд╕реВрдЪрдХ рд╣реЛ:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 100
        type: Utilization

Zalando рд▓реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдХреВрд▓рди рдореЗрдЯреНрд░рд┐рдХрд╣рд░реВ рд╕рдЬрд┐рд▓реИ рдЬрдбрд╛рди рдЧрд░реНрди рдПрдХ рдШрдЯрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдХреЛ рдЫ: рдХреБрдмреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдбрд╛рдкреНрдЯрд░ (kube-metrics-adapter) Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдбрд╛рдкреНрдЯрд░ рд╣реЛ рдЬрд╕рд▓реЗ рдкреЛрдбрд╣рд░реВрдХреЛ рддреЗрд░реНрд╕реЛ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдХреВрд▓рди рд░ рдмрд╛рд╣реНрдп рдореЗрдЯреНрд░рд┐рдХрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд░ рд╕реЗрд╡рд╛ рдЧрд░реНрди рд╕рдХреНрдЫред рдпрд╕рд▓реЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕, SQS рд▓рд╛рдорд╣рд░реВ, рд░ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, /metrics рдХреЛ рдкреНрд░рдпреЛрдЧ рдорд╛ JSON рдХреЛ рд░реВрдк рдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдореЗрдЯреНрд░рд┐рдХ рдорд╛ рдЖрдлреНрдиреЛ рддреИрдирд╛рддреА рдорд╛рдкрди рдЧрд░реНрди:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
  annotations:
    # metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
    metric-config.pods.requests-per-second.json-path/json-key: "$.http_server.rps"
    metric-config.pods.requests-per-second.json-path/path: /metrics
    metric-config.pods.requests-per-second.json-path/port: "9090"
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests-per-second
      target:
        averageValue: 1k
        type: AverageValue

HPA рд╕рдБрдЧ рддреЗрд░реНрд╕реЛ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБ рд░рд╛рдЬреНрдпрд╡рд┐рд╣реАрди рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рджрдХреНрд╖рддрд╛ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рд╣реБрдиреБрдкрд░реНрдЫред Spotify рд╕рдБрдЧ рдЙрдиреАрд╣рд░реВрдХреЛ рдЕрдиреБрднрд╡ рд░ HPA рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рдлрд╛рд░рд┐рд╕рд╣рд░реВ рд╕рд╣рд┐рдд рдкреНрд░рд╕реНрддреБрддреАрдХрд░рдг рдЫ: рддрдкрд╛рдИрдВрдХреЛ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдорд╛рдкрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддрдкрд╛рдИрдВрдХреЛ рд╡рд╛рд▓реЗрдЯ рд╣реЛрдЗрди.

рд╕реНрд░реЛрдд рдУрднрд░рдмреБрдХрд┐рдЩ рдХрдо рдЧрд░реНрдиреБрд╣реЛрд╕реН

Kubernetes рдХрд╛рд░реНрдпрднрд╛рд░рд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ CPU/рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ "рд╕рдВрд╕рд╛рдзрди рдЕрдиреБрд░реЛрдзрд╣рд░реВ" рдорд╛рд░реНрдлрдд рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрджрдЫред CPU рд╕реНрд░реЛрддрд╣рд░реВ рднрд░реНрдЪреБрдЕрд▓ рдХреЛрд░рд╣рд░реВрдорд╛ рдорд╛рдкрди рдЧрд░рд┐рдиреНрдЫ рд╡рд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ "рдорд┐рд▓реАрдХреЛрд░" рдорд╛ рдорд╛рдкрди рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ 500m рд▓реЗ 50% vCPU рд▓рд╛рдИ рдЬрдирд╛рдЙрдБрдЫред рдореЗрдореЛрд░реА рд╕реНрд░реЛрддрд╣рд░реВ рдмрд╛рдЗрдЯрд╣рд░реВрдорд╛ рдорд╛рдкрди рдЧрд░рд┐рдиреНрдЫ, рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреНрдпрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрд╕реНрддреИ 500Mi, рдЬрд╕рдХреЛ рдЕрд░реНрде 500 рдореЗрдЧрд╛рдмрд╛рдЗрдЯрд╣рд░реВ рдЫрдиреНред рд╕рдВрд╕рд╛рдзрди рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбрд╣рд░реВрдорд╛ "рд▓рдХ" рдХреНрд╖рдорддрд╛, рдЬрд╕рдХреЛ рдЕрд░реНрде 1000 vCPU рд╣рд░реВ рднрдПрдХреЛ рдиреЛрдбрдорд╛ 4m CPU рдЕрдиреБрд░реЛрдз рднрдПрдХреЛ рдкреЛрдбрд▓реЗ рдЕрдиреНрдп рдкреЛрдбрд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз 3 vCPU рд╣рд░реВ рдорд╛рддреНрд░ рдЫреЛрдбреНрдиреЗрдЫред [1]

рдврд┐рд▓реЛ (рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд░рдХреНрд╖рд┐рдд) рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдПрдХреЛ рд╕реНрд░реЛрдд рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдмреАрдЪрдХреЛ рднрд┐рдиреНрдирддрд╛ рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, 2 GiB рдореЗрдореЛрд░реА рдЕрдиреБрд░реЛрдз рдЧрд░реНрдиреЗ рддрд░ 200 MiB рдорд╛рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреЛрдбрдорд╛ ~ 1,8 GiB "рдЕрддрд┐рд░рд┐рдХреНрдд" рдореЗрдореЛрд░реА рд╣реБрдиреНрдЫред рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд╕рд╛ рдЦрд░реНрдЪ рд╣реБрдиреНрдЫред рдПрдХрд▓реЗ рдЕрдиреБрдорд╛рди рдЧрд░реНрди рд╕рдХреНрдЫ рдХрд┐ 1 GiB рдЕрдирд╛рд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реАрдХреЛ рд▓рд╛рдЧрдд рдкреНрд░рддрд┐ рдорд╣рд┐рдирд╛ ~$10 рд╣реБрдиреНрдЫред [2]

Kubernetes рд╕рдВрд╕рд╛рдзрди рд░рд┐рдкреЛрд░реНрдЯ (kube-resource-report) рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдЬрд░реНрднрд╣рд░реВ рджреЗрдЦрд╛рдЙрдБрдЫ рд░ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрдЪрдд рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

Kubernetes рд╕рдВрд╕рд╛рдзрди рд░рд┐рдкреЛрд░реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд░ рдХрдорд╛рдгреНрдб рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрдЦрд╛рдЙрдБрдЫред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕реНрдерд╛рдирд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рдЬрд╣рд╛рдБ рд╕реНрд░реЛрдд рдорд╛рдЧрд╣рд░реВ рдХрдо рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЙрддреНрдкрдиреНрди HTML рдкреНрд░рддрд┐рд╡реЗрджрдирд▓реЗ рд╕реНрд░реЛрддрдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рдорд╛рддреНрд░ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд░реЛрдд рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рд╕рдордпрдХреЛ рд╕рд╛рде CPU/рдореЗрдореЛрд░реА рдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рд╣реЗрд░реНрдиреБ рдкрд░реНрдЫред рдпрд╣рд╛рдБ "рд╡рд┐рд╢рд┐рд╖реНрдЯ" CPU-рднрд╛рд░реА рд╕реЗрд╡рд╛рдХреЛ рд▓рд╛рдЧрд┐ Grafana рдЪрд╛рд░реНрдЯ рдЫ: рд╕рдмреИ рдкреЛрдбрд╣рд░реВрд▓реЗ 3 рдЕрдиреБрд░реЛрдзрд┐рдд CPU рдХреЛрд░рд╣рд░реВ рднрдиреНрджрд╛ рдХрдо рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдЫрдиреН:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

CPU рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ 3000m рдмрд╛рдЯ ~ 400m рдорд╛ рдШрдЯрд╛рдЙрдиреБрд▓реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрднрд╛рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрддрд╣рд░реВ рдЦрд╛рд▓реА рдЧрд░реНрдЫ рд░ рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛рдИ рд╕рд╛рдиреЛ рд╣реБрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

"EC2 рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдХреЛ рдФрд╕рдд CPU рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдпрдГ рдПрдХрд▓-рдЕрдЩреНрдХрдХреЛ рдкреНрд░рддрд┐рд╢рдд рджрд╛рдпрд░рд╛рдорд╛ рд╣реЛрд╡рд░ рд╣реБрдиреНрдЫ," рдХреЛрд░реА рдХреНрд╡рд┐рди рд▓реЗрдЦреНрдЫрдиреНред рдЬрдмрдХрд┐ EC2 рдХреЛ рд▓рд╛рдЧреА рд╕рд╣реА рд╕рд╛рдЗрдЬ рдЕрдиреБрдорд╛рди рдЧрд░реНрдиреБ рдЦрд░рд╛рдм рдирд┐рд░реНрдгрдп рд╣реБрди рд╕рдХреНрдЫYAML рдлрд╛рдЗрд▓рдорд╛ рдХреЗрд╣реА Kubernetes рд╕реНрд░реЛрдд рдкреНрд░рд╢реНрдирд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ рд░ рдареВрд▓реЛ рдмрдЪрдд рд▓реНрдпрд╛рдЙрди рд╕рдХреНрдЫред

рддрд░ рдХреЗ рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдореИ рдорд╛рдирд┐рд╕рд╣рд░реВрд▓реЗ YAML рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рдорд╛рдирд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ? рд╣реЛрдЗрди, рдореЗрд╕рд┐рдирд╣рд░реВрд▓реЗ рдпреЛ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЧрд░реНрди рд╕рдХреНрдЫрдиреН! Kubernetes рдард╛рдбреЛ рдкреЛрдб рдЕрдЯреЛрд╕реНрдХреЗрд▓рд░ (VPA) рд▓реЗ рддреНрдпреЛ рдорд╛рддреНрд░ рдЧрд░реНрдЫ: рдХрд╛рдордХреЛ рднрд╛рд░ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрд╕рд╛рдзрди рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд░ рдЕрд╡рд░реЛрдзрд╣рд░реВ рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрджрдЫред рдпрд╣рд╛рдБ Prometheus CPU рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдг рдЧреНрд░рд╛рдл (рдкрд╛рддрд▓реЛ рдиреАрд▓реЛ рд░реЗрдЦрд╛) VPA рджреНрд╡рд╛рд░рд╛ рд╕рдордпрд╕рдБрдЧреИ рдЕрдиреБрдХреВрд▓рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

Zalando рд▓реЗ рдпрд╕рдХреЛ рд╕рдмреИ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдорд╛ VPA рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдШрдЯрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред рдЧреИрд░-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓реЗ рдкрдирд┐ VPA рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред

Goldilocks рдлреЗрдпрд░рд╡рд┐рдиреНрдбрдмрд╛рдЯ рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рд╣реЛ рдЬрд╕рд▓реЗ рдиреЗрдорд╕реНрдкреЗрд╕рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрдирдХреЛ рд▓рд╛рдЧрд┐ VPA рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рдХреЛ рдбреНрдпрд╛рд╕рдмреЛрд░реНрдбрдорд╛ VPA рд╕рд┐рдлрд╛рд░рд┐рд╕ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╣реА CPU/рдореЗрдореЛрд░реА рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ:

AWS рдорд╛ Kubernetes рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрддрд╣рд░реВрдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдореИрд▓реЗ рд╕рд╛рдиреЛ рд▓реЗрдЦреЗрдБ VPA рдмрд╛рд░реЗ рдмреНрд▓рдЧрдкреЛрд╕реНрдЯ 2019 рдорд╛, рд░ рд╣рд╛рд▓реИ рдорд╛ CNCF рдЕрдиреНрддрд┐рдо рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореБрджрд╛рдпрд▓реЗ VPA рдореБрджреНрджрд╛ рдЫрд▓рдлрд▓ рдЧрд░реНрдпреЛ.

EC2 рд╕реНрдкрдЯ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдЕрдиреНрддрд┐рдо рддрд░ рдХрдореНрддрд┐рдорд╛ рд╣реЛрдЗрди, AWS EC2 рд▓рд╛рдЧрддрд╣рд░реВ рд╕реНрдкрдЯ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ Kubernetes рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбрд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдШрдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред [3]ред рдЕрди-рдбрд┐рдорд╛рдВрдб рдореВрд▓реНрдпрд╣рд░реВрдХреЛ рддреБрд▓рдирд╛рдорд╛ рд╕реНрдкрдЯ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ 90% рд╕рдореНрдо рдЫреБрдЯрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред EC2 Spot рдорд╛ Kubernetes рдЪрд▓рд╛рдЙрдиреБ рд░рд╛рдореНрд░реЛ рд╕рдВрдпреЛрдЬрди рд╣реЛ: рддрдкрд╛рдИрдВрд▓реЗ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдзрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдлрд░рдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпрд╕рдХреЛ рдорддрд▓рдм рддрдкрд╛рдИрдВрд▓реЗ рд╕рдорд╛рди рд╡рд╛ рдХрдо рдореВрд▓реНрдпрдорд╛ рдареВрд▓реЛ рдиреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░ рдмрдвреЗрдХреЛ рдХреНрд╖рдорддрд╛ рдХрдиреНрдЯреЗрдирд░рд╛рдЗрдЬреНрдб Kubernetes рдХрд╛рд░реНрдпрднрд╛рд░рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

EC2 рд╕реНрдкрдЯ рдорд╛ Kubernetes рдХрд╕рд░реА рдЪрд▓рд╛рдЙрдиреЗ? рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдЫрдиреН: рддреЗрд╕реНрд░реЛ рдкрдХреНрд╖ рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЬрд╕реНрддреИ SpotInst (рдЕрд╣рд┐рд▓реЗ "рд╕реНрдкрдЯ" рднрдирд┐рдиреНрдЫ", рдорд▓рд╛рдИ рдХрд┐рди рди рд╕реЛрдзреНрдиреБрд╣реЛрд╕реН), рд╡рд╛ рддрдкрд╛рдЗрдБрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдкрдЯ рдЕрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЧреНрд░реБрдк (ASG) рдердкреНрдиреБрд╣реЛрд╕реНред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рдПрдХ "рдХреНрд╖рдорддрд╛-рдЕрдиреБрдХреВрд▓рд┐рдд" рд╕реНрдкрдЯ ASG рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ CloudFormation рд╕реНрдирд┐рдкреЗрдЯ рдЫ рдзреЗрд░реИ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░рд╣рд░реВ:

MySpotAutoScalingGroup:
 Properties:
   HealthCheckGracePeriod: 300
   HealthCheckType: EC2
   MixedInstancesPolicy:
     InstancesDistribution:
       OnDemandPercentageAboveBaseCapacity: 0
       SpotAllocationStrategy: capacity-optimized
     LaunchTemplate:
       LaunchTemplateSpecification:
         LaunchTemplateId: !Ref LaunchTemplate
         Version: !GetAtt LaunchTemplate.LatestVersionNumber
       Overrides:
         - InstanceType: "m4.2xlarge"
         - InstanceType: "m4.4xlarge"
         - InstanceType: "m5.2xlarge"
         - InstanceType: "m5.4xlarge"
         - InstanceType: "r4.2xlarge"
         - InstanceType: "r4.4xlarge"
   LaunchTemplate:
     LaunchTemplateId: !Ref LaunchTemplate
     Version: !GetAtt LaunchTemplate.LatestVersionNumber
   MinSize: 0
   MaxSize: 100
   Tags:
   - Key: k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot
     PropagateAtLaunch: true
     Value: "true"

Kubernetes рдХреЛ рд╕рд╛рде рд╕реНрдкрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреЗрд╣реА рдиреЛрдЯрд╣рд░реВ:

  • рддрдкрд╛рдИрдВрд▓реЗ рд╕реНрдкрдЯ рд╕рдорд╛рдкреНрддрд┐рд╣рд░реВ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдиреЛрдб рдорд░реНрдЬ рдЧрд░реЗрд░ рдЬрдм рдЙрджрд╛рд╣рд░рдг рд░реЛрдХрд┐рдиреНрдЫ
  • Zalando рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдХрд╛рдБрдЯрд╛ рдиреЛрдб рдкреВрд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рд╣рд░реВрд╕рдБрдЧ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓рд┐рдЩ
  • рд╕реНрдкрдЯ рдиреЛрдбрд╣рд░реВ рдЬрдмрд░рдЬрд╕реНрддреА рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд╕реНрдкрдЯрдорд╛ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдпрднрд╛рд░рд╣рд░реВрдХреЛ "рджрд░реНрддрд╛рд╣рд░реВ" рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╕рд╛рд░рд╛рдВрд╢

рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓ рдШрдЯрд╛рдЙрдирдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХрд╛ рдХреЗрд╣реА рдЙрдкрдХрд░рдгрд╣рд░реВ рдЙрдкрдпреЛрдЧреА рдкрд╛рдЙрдиреБрднрдпреЛред рддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдЬрд╕реЛ рд▓реЗрдЦрдХрд╛ рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ рдкрдирд┐ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпреБрдЯреНрдпреБрдм рд░ рд╕реНрд▓рд╛рдЗрдбрд╣рд░реВрдорд╛ DevOps Gathering 2019 рдорд╛ рдореЗрд░реЛ рдХреБрд░рд╛рдХрд╛рдиреА.

Kubernetes рдорд╛ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдмрдЪрдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рддрдкрд╛рдЗрдБрдХреЛ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрднреНрдпрд╛рд╕рд╣рд░реБ рдХреЗ рд╣реЛ? рдХреГрдкрдпрд╛ рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рджрд┐рдиреБрд╣реЛрд╕реН рдЯреНрд╡рд┐рдЯрд░ (@try_except_).

[1] рд╡рд╛рд╕реНрддрд╡рдорд╛, 3 рднрдиреНрджрд╛ рдХрдо vCPU рд╣рд░реВ рдкреНрд░рдпреЛрдЧрдпреЛрдЧреНрдп рд░рд╣рдиреЗрдЫрдиреН рдХрд┐рдирднрдиреЗ рдиреЛрдбрдХреЛ рдереНрд░реБрдкреБрдЯ рдЖрд░рдХреНрд╖рд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╕реНрд░реЛрддрд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдШрдЯрд╛рдЗрдиреНрдЫред Kubernetes рднреМрддрд┐рдХ рдиреЛрдб рдХреНрд╖рдорддрд╛ рд░ "рдкреНрд░рд╛рд╡рдзрд╛рди" рд╕реНрд░реЛрддрд╣рд░реВ рдмреАрдЪ рднреЗрдж рдЧрд░реНрджрдЫ (рдиреЛрдб рдЖрд╡рдВрдЯрдирдпреЛрдЧреНрдп).

[2] рдЧрдгрдирд╛ рдЙрджрд╛рд╣рд░рдг: 5 GiB рдореЗрдореЛрд░реА рднрдПрдХреЛ рдПрдЙрдЯрд╛ m8.large рдЙрджрд╛рд╣рд░рдг ~$84 тАЛтАЛрдкреНрд░рддрд┐ рдорд╣рд┐рдирд╛ (eu-central-1, On-demand), рдЕрд░реНрдерд╛рддреНред 1/8 рдиреЛрдб рдЕрд╡рд░реБрджреНрдз рд▓рдЧрднрдЧ ~$10/рдорд╣рд┐рдирд╛ рд╣реЛред

[3] рддрдкрд╛рдИрдВрдХреЛ EC2 рдмрд┐рд▓ рдШрдЯрд╛рдЙрдиреЗ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреН, рдЬрд╕реНрддреИ рдЖрд░рдХреНрд╖рд┐рдд рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ, рдмрдЪрдд рдпреЛрдЬрдирд╛, рдЗрддреНрдпрд╛рджрд┐ред - рдо рддреА рд╡рд┐рд╖рдпрд╣рд░реВ рдпрд╣рд╛рдБ рд╕рдореЗрдЯреНрдиреЗ рдЫреИрди, рддрд░ рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░реНрдиреБрдкрд░реНрдЫ!

рдкрд╛рдареНрдпрдХреНрд░рдо рдмрд╛рд░реЗ рдердк рдЬрд╛рдиреНрдиреБрд╣реЛрд╕реНред

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

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