AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

рд▓реЗрдЦрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрджрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рд╣реЛрддрд╛ "рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рдордВрдЪ".

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

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

рдореА рд╣рд╛ рд▓реЗрдЦ AWS рд╕рд╛рдареА Kubernetes рд╕рд╣ рд▓рд┐рд╣рд┐рд▓рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЛ рдЗрддрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдВрд╕рд╛рдареА (рдЬрд╡рд│рдЬрд╡рд│) рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рд▓рд╛рдЧреВ рд╣реЛрдИрд▓. рдореА рдЧреГрд╣реАрдд рдзрд░рдд рдЖрд╣реЗ рдХреА рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЖрдзреАрдЪ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ (рдХреНрд▓рд╕реНрдЯрд░-рдСрдЯреЛрд╕реНрдХреЗрд▓рд░). рд╕рдВрд╕рд╛рдзрдиреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ рдЖрдгрд┐ рддреБрдордЪреА рддреИрдирд╛рддреА рдХрдореА рдХреЗрд▓реНрдпрд╛рдиреЗ рддреБрдордЪреЗ рдкреИрд╕реЗ рд╡рд╛рдЪрддреАрд▓ рдЬрд░ рддреЗ рддреБрдордЪреНрдпрд╛ рдХрд╛рдордЧрд╛рд░ рдиреЛрдбреНрд╕рдЪрд╛ (EC2 рдЙрджрд╛рд╣рд░рдгреЗ) рдлреНрд▓реАрдЯ рджреЗрдЦреАрд▓ рдХрдореА рдХрд░реЗрд▓.

рд╣рд╛ рд▓реЗрдЦ рдХрд╡реНрд╣рд░ рдХрд░реЗрд▓:

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

рди рд╡рд╛рдкрд░рд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рд╕рд╛рдл рдХрд░рдгреЗ

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

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

(рд╣реЗрдирд┐рдВрдЧ рдЬреЗрдХрдмреНрд╕:
рдЭрд┐рдЭрд╛:
(рдХреЛрдЯ) рдХреЛрд░реА рдХреНрд╡рд┐рди:
рдЧреИрд░рд╕рдордЬ: рддреБрдордЪреЗ AWS рдЦрд╛рддреЗ рд╣реЗ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ.
рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА: рддреБрдордЪрд╛ AWS рд╕реНрдХреЛрдЕрд░ рд╣реЗ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ.

рдЗрд╡реНрд╣рд╛рди рдХреБрд░реНрдиреЛрд╕реЛрд╡реНрд╣ (рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд):
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА: рддреБрдордЪрд╛ AWS рд╕реНрдХреЛрдЕрд░ рд╣реЗ рддреБрдореНрд╣реА рдЕрдХреНрд╖рдо/рд╣рдЯрд╡рд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░рд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ.)

рдХреБрдмрд░рдиреЗрдЯреЗрд╕ рд░рдЦрд╡рд╛рд▓рджрд╛рд░ (рдХреБрдмреЗ-рдЬреЕрдирд┐рдЯрд░) рддреБрдордЪреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕ рдорджрдд рдХрд░рддреЗ. рд░рдЦрд╡рд╛рд▓рджрд╛рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЬрд╛рдЧрддрд┐рдХ рдЖрдгрд┐ рд╕реНрдерд╛рдирд┐рдХ рджреЛрдиреНрд╣реА рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рд▓рд╡рдЪрд┐рдХ рдЖрд╣реЗ:

  • рдХреНрд▓рд╕реНрдЯрд░-рд╡реНрдпрд╛рдкреА рдирд┐рдпрдо PR/рдЪрд╛рдЪрдгреА рдЙрдкрдпреЛрдЬрдирд╛рдВрд╕рд╛рдареА рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рд╡реЗрд│-рдЯреВ-рд▓рд╛рдЗрд╡реНрд╣ (TTL) рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддрд╛рдд.
  • рд╡реИрдпрдХреНрддрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЗ janitor/ttl рд╕рд╣ рднрд╛рд╖реНрдп рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде 7 рджрд┐рд╡рд╕рд╛рдВрдирдВрддрд░ рд╕реНрдкрд╛рдЗрдХ/рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдХрд╛рдврдгреНрдпрд╛рд╕рд╛рдареА.

YAML рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд. рддреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдкреЕрд░рд╛рдореАрдЯрд░рдордзреВрди рдЬрд╛рддреЛ --rules-file рдХреБрдмреЗ-рд░рдХреНрд╖рдХ рдордзреНрдпреЗ. рд╕рд░реНрд╡ рдиреЗрдорд╕реНрдкреЗрд╕реЗрд╕ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреНрдпрд╛рд╕рд╛рдареА рдпреЗрдереЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рдпрдо рдЖрд╣реЗ -pr- рджреЛрди рджрд┐рд╡рд╕рд╛рдВрдирдВрддрд░ рдирд╛рд╡рд╛рдиреЗ:

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

рдкреБрдвреАрд▓ рдЙрджрд╛рд╣рд░рдг 2020 рдордзреАрд▓ рд╕рд░реНрд╡ рдирд╡реАрди рдЙрдкрдпреЛрдЬрди/рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯрд╕рд╛рдареА рдЙрдкрдпреЛрдЬрди рдЖрдгрд┐ рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯ рдкреЙрдбреНрд╕рд╡рд░реАрд▓ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдмрд▓рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреЗ рдирд┐рдпрдорди рдХрд░рддреЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рдПрдХрд╛ рдЖрдард╡рдбреНрдпрд╛рд╕рд╛рдареА рдпрд╛ рд▓реЗрдмрд▓рд╢рд┐рд╡рд╛рдп рдЪрд╛рдЪрдгреНрдпрд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ:

- 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

рдХреБрдмреЗ-рдЬреЕрдирд┐рдЯрд░рд╡рд░ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╡рд░ 30 рдорд┐рдирд┐рдЯрд╛рдВрд╕рд╛рдареА рдорд░реНрдпрд╛рджрд┐рдд рдбреЗрдореЛ рдЪрд╛рд▓рд╡рд╛:

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

рд╡рд╛рдврддреНрдпрд╛ рдЦрд░реНрдЪрд╛рдЪрд╛ рдЖрдгрдЦреА рдПрдХ рд╕реНрд░реЛрдд рдореНрд╣рдгрдЬреЗ рдкрд░реНрд╕рд┐рд╕реНрдЯрдВрдЯ рд╡реНрд╣реЙрд▓реНрдпреВрдо (AWS EBS). Kubernetes StatefulSet рд╣рдЯрд╡рд▓реНрдпрд╛рдиреЗ рддреНрдпрд╛рдЪреЗ рдкрд░реНрд╕рд┐рд╕реНрдЯрдВрдЯ рд╡реНрд╣реЙрд▓реНрдпреВрдо (PVC - PersistentVolumeClaim) рд╣рдЯрдд рдирд╛рд╣реАрдд. рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ EBS рд╡реНрд╣реЙрд▓реНрдпреВрдо рд╕рд╣рдЬрдкрдгреЗ рджрд░рдорд╣рд╛ рд╢реЗрдХрдбреЛ рдбреЙрд▓рд░реНрд╕рдЪреНрдпрд╛ рдЦрд░реНрдЪрд╛рд╕ рдХрд╛рд░рдгреАрднреВрдд рдард░реВ рд╢рдХрддреЗ. рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЬреЕрдирд┐рдЯрд░рдордзреНрдпреЗ рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдкреАрд╡реНрд╣реАрд╕реА рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╣рд╛ рдирд┐рдпрдо рд╕рд░реНрд╡ 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 рдХреБрдмреЗ-рд░рдХреНрд╖рдХ.

рдЧреИрд░-рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдореА рдХрд░рд╛

рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рдорд╛рдиреНрдпрдд: рдлрдХреНрдд рд╡реНрдпрд╡рд╕рд╛рдпрд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рдСрдкрд░реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдХрд╛рд╣реА рдЙрддреНрдкрд╛рджрди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕, рдЬрд╕реЗ рдХреА рдмреЕрдХ рдСрдлрд┐рд╕/рдЕреЕрдбрдорд┐рди рдЯреВрд▓реНрд╕, рддреНрдпрд╛рдВрдирд╛ рдлрдХреНрдд рдорд░реНрдпрд╛рджрд┐рдд рдЙрдкрд▓рдмреНрдзрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреА рд░рд╛рддреНрд░рднрд░ рдЕрдХреНрд╖рдо рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд.

рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдбрд╛рдЙрдирд╕реНрдХреЗрд▓рд░ (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) рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдкрд░рд┐рдкреВрд░реНрдг рдЯрд╛рдЗрдорд╕реНрдЯреЕрдореНрдкрд╕рд╣ рдбрд╛рдЙрдирд╕реНрдХреЗрд▓рд░/рд╡рдЧрд│реВ-рдкрд░реНрдпрдВрдд рднрд╛рд╖реНрдп рд╡рд╛рдкрд░реВрди рдЙрдкрдпреЛрдЬрди рддрд╛рддреНрдкреБрд░рддреЗ рд╡рдЧрд│рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рднрд╛рд╖реНрдпрд╛рд╕рд╣ рдкреЙрдб рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░реВрди рд╕рдВрдкреВрд░реНрдг рдХреНрд▓рд╕реНрдЯрд░ рдкрд░рдд рдореЛрдЬрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ 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) рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рд╛рдареА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЕреЕрдбреЙрдкреНрдЯрд░ рдЖрд╣реЗ рдЬреЛ рдкреЙрдбреНрд╕рдЪреНрдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧрд╕рд╛рдареА рдХрд╕реНрдЯрдо рдЖрдгрд┐ рдмрд╛рд╣реНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣ рдХрд░реВ рд╢рдХрддреЛ. рд╣реЗ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕, SQS рд░рд╛рдВрдЧ рдЖрдгрд┐ рдЗрддрд░ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧрдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, /рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рдкрд░рд╛рдд 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 vCPUs рдЙрдкрд▓рдмреНрдз рдареЗрд╡рддреАрд▓. [1]

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

Kubernetes рд╕рдВрд╕рд╛рдзрди рдЕрд╣рд╡рд╛рд▓ (kube-resource-report) рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдард╛ рджрд╛рдЦрд╡рддреЛ рдЖрдгрд┐ рдмрдЪрдд рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХрддреЛ:

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

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

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

CPU рд╡рд┐рдирдВрддреА 3000m рд╡рд░реВрди ~400m рдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓реНрдпрд╛рдиреЗ рдЗрддрд░ рд╡рд░реНрдХрд▓реЛрдбреНрд╕рд╕рд╛рдареА рд╕рдВрд╕рд╛рдзрдиреЗ рдореБрдХреНрдд рд╣реЛрддрд╛рдд рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рд▓рд╣рд╛рди рд╣реЛрдК рд╢рдХрддрд╛рдд.

"EC2 рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪрд╛ рд╕рд░рд╛рд╕рд░реА CPU рд╡рд╛рдкрд░ рдЕрдиреЗрдХрджрд╛ рдПрдХрд▓-рдЕрдВрдХреА рдЯрдХреНрдХреЗрд╡рд╛рд░реА рд╢реНрд░реЗрдгреАрдордзреНрдпреЗ рдлрд┐рд░рддреЛ," рдХреЛрд░реА рдХреНрд╡рд┐рди рд▓рд┐рд╣рд┐рддрд╛рдд. EC2 рд╕рд╛рдареА рдЕрд╕рддрд╛рдирд╛ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░рд╛рдЪрд╛ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдгреЗ рд╣рд╛ рдЪреБрдХреАрдЪрд╛ рдирд┐рд░реНрдгрдп рдЕрд╕реВ рд╢рдХрддреЛYAML рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдХрд╛рд╣реА рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд░рд┐рд╕реЛрд░реНрд╕ рдХреНрд╡реЗрд░реА рдмрджрд▓рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдмрдЪрдд рдХрд░реВ рд╢рдХрддреЗ.

рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд░реЛрдЦрд░ рд▓реЛрдХрд╛рдВрдиреА YAML рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдореВрд▓реНрдпреЗ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЗрдЪреНрдЫрд╛ рдЖрд╣реЗ рдХрд╛? рдирд╛рд╣реА, рдпрдВрддреНрд░реЗ рддреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░реВ рд╢рдХрддрд╛рдд! рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЕрдиреБрд▓рдВрдм рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЗрд▓рд░ (VPA) рддреЗрдЪ рдХрд░рддреЗ: рд╕рдВрд╕рд╛рдзрди рд╡рд┐рдирдВрддреНрдпрд╛ рдЖрдгрд┐ рд╡рд░реНрдХрд▓реЛрдбрдиреБрд╕рд╛рд░ рдорд░реНрдпрд╛рджрд╛ рд╕реНрд╡реАрдХрд╛рд░рддреЗ. VPA рджреНрд╡рд╛рд░реЗ рдХрд╛рд▓рд╛рдВрддрд░рд╛рдиреЗ рд░реБрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ Prometheus CPU рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪрд╛ (рдкрд╛рддрд│ рдирд┐рд│реА рд░реЗрд╖рд╛) рдЙрджрд╛рд╣рд░рдг рдЖрд▓реЗрдЦ рдпреЗрдереЗ рдЖрд╣реЗ:

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

Zalando рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдХреНрд▓рд╕реНрдЯрд░реНрд╕рдордзреНрдпреЗ VPA рд╡рд╛рдкрд░рддреЗ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреНрдпрд╛ рдШрдЯрдХрд╛рдВрд╕рд╛рдареА. рдиреЙрди-рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рджреЗрдЦреАрд▓ VPA рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛рдд.

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

AWS рд╡рд░ Kubernetes рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд░рд╛

рдореА рдПрдХ рдЫреЛрдЯреЗрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ VPA рдмрджреНрджрд▓ рдмреНрд▓реЙрдЧрдкреЛрд╕реНрдЯ 2019 рдордзреНрдпреЗ рдЖрдгрд┐ рдЕрд▓реАрдХрдбреЗ CNCF рдЕрдВрддрд┐рдо рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕рдореБрджрд╛рдпрд╛рдиреЗ VPA рд╕рдорд╕реНрдпреЗрд╡рд░ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА.

EC2 рд╕реНрдкреЙрдЯ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рдгреЗ

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

EC2 Spot рд╡рд░ Kubernetes рдХрд╕реЗ рдЪрд╛рд▓рд╡рд╛рдпрдЪреЗ? рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд: SpotInst рд╕рд╛рд░рдЦреА рддреГрддреАрдп рдкрдХреНрд╖ рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рд╛ (рдЖрддрд╛ "рд╕реНрдкреЙрдЯ" рдЕрд╕реЗ рдореНрд╣рдгрддрд╛рдд, рдорд▓рд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░реВ рдирдХрд╛), рдХрд┐рдВрд╡рд╛ рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдлрдХреНрдд рдПрдХ Spot AutoScalingGroup (ASG) рдЬреЛрдбрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдХрд╛рдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░рд╛рдВрд╕рд╣ "рдХреНрд╖рдорддрд╛-рдЕрдиреБрдХреВрд▓рд┐рдд" рд╕реНрдкреЙрдЯ ASG рд╕рд╛рдареА рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рд╕реНрдирд┐рдкреЗрдЯ рдпреЗрдереЗ рдЖрд╣реЗ:

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"

рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рд╕рд╣ рд╕реНрдкреЙрдЯ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╡рд░реАрд▓ рдХрд╛рд╣реА рдЯрд┐рдкрд╛:

  • рддреБрдореНтАНрд╣рд╛рд▓рд╛ Spot рдЯрд░реНрдорд┐рдиреЗрд╢рди рд╣рд╛рддрд╛рд│рдгреНтАНрдпрд╛рдЪреА рдЖрд╡рд╢реНтАНрдпрдХрддрд╛ рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдЗрдВрд╕реНтАНрдЯрдВрд╕ рдерд╛рдВрдмрд╡рд▓реНтАНрдпрд╛рд╡рд░ рдиреЛрдб рд╡рд┐рд▓реАрди рдХрд░реВрди
  • Zalando рд╡рд╛рдкрд░рддреЗ рдХрд╛рдЯрд╛ рдиреЛрдб рдкреВрд▓ рдкреНрд░рд╛рдзрд╛рдиреНрдпрд╛рдВрд╕рд╣ рдЕрдзрд┐рдХреГрдд рдХреНрд▓рд╕реНрдЯрд░ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ
  • рд╕реНрдкреЙрдЯ рдиреЛрдбреНрд╕ рд╕рдХреНрддреА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рд╕реНрдкреЙрдЯрдордзреНрдпреЗ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реНрдХрд▓реЛрдбрдЪреА "рдиреЛрдВрджрдгреА" рд╕реНрд╡реАрдХрд╛рд░рд╛

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

рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рддреБрдордЪреЗ рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реА рдХрд╛рд╣реА рд╕рд╛рдзрдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯрддреАрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЗрдЦрд╛рддреАрд▓ рдмрд╣реБрддрд╛рдВрд╢ рд╕рд╛рдордЧреНрд░реА рдпреЗрдереЗ рджреЗрдЦреАрд▓ рдорд┐рд│реВ рд╢рдХрддреЗ DevOps Gathering 2019 рдордзреАрд▓ рдорд╛рдЭреЗ YouTube рд╡рд░ рдЖрдгрд┐ рд╕реНрд▓рд╛рдИрдбреНрд╕рдордзреНрдпреЗ рдмреЛрд▓рдгреЗ.

Kubernetes рд╡рд░ рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА рдХреЛрдгрддреНрдпрд╛ рдЖрд╣реЗрдд? рдХреГрдкрдпрд╛ рдорд▓рд╛ рдХрд│рд╡рд╛ Twitter (@try_except_).

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

[2] рдЧрдгрдирд╛ рдЙрджрд╛рд╣рд░рдг: 5 GiB рдореЗрдорд░реА рдЕрд╕рд▓реЗрд▓реЗ рдПрдХ m8. рдореЛрдареЗ рдЙрджрд╛рд╣рд░рдг ~$84 тАЛтАЛрдкреНрд░рддрд┐ рдорд╣рд┐рдирд╛ рдЖрд╣реЗ (eu-central-1, рдСрди-рдбрд┐рдорд╛рдВрдб), рдЙрджрд╛. 1/8 рдиреЛрдб рдЕрд╡рд░реЛрдзрд┐рдд рдХрд░рдгреЗ рдЕрдВрджрд╛рдЬреЗ ~$10/рдорд╣рд┐рдирд╛ рдЖрд╣реЗ.

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

рдХреЛрд░реНрд╕рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдЬрд╛рдгреВрди рдШреНрдпрд╛.

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

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