AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ "рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдордВрдЪ".

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

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

рдореИрдВрдиреЗ рдпрд╣ рд▓реЗрдЦ AWS рдХреЗ рд▓рд┐рдП Kubernetes рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ (рд▓рдЧрднрдЧ) рдЕрдиреНрдп рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛рдУрдВ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реИ (рдХреНрд▓рд╕реНрдЯрд░-рдСрдЯреЛрд╕реНрдХреЗрд▓рд░). рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЕрдкрдиреА рддреИрдирд╛рддреА рдХреЛ рдХрдо рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдкреИрд╕реЗ рдмрдЪреЗрдВрдЧреЗ рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдбреНрд╕ (EC2 рдЙрджрд╛рд╣рд░рдг) рдХреЗ рдмреЗрдбрд╝реЗ рдХреЛ рднреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред

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

рдЕрдкреНрд░рдпреБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдлрд╛рдИ

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

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

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

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

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

  • рдХреНрд▓рд╕реНрдЯрд░-рд╡реНрдпрд╛рдкреА рдирд┐рдпрдо рдкреАрдЖрд░/рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдЬреАрд╡рди-рд╕рдордп (рдЯреАрдЯреАрдПрд▓) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬреЗрдирд┐рдЯрд░/рдЯреАрдЯреАрдПрд▓ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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

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

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

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЬреЗрдирд┐рдЯрд░ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╕рд╛рдл рд░рдЦрдиреЗ рдФрд░ рдХреНрд▓рд╛рдЙрдб рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд▓рд╛рдЧрдд рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ README рдХреНрдпреВрдм-рдЪреМрдХреАрджрд╛рд░.

рдЧреИрд░-рдХрд╛рд░реНрдп рдШрдВрдЯреЛрдВ рдХреЗ рджреМрд░рд╛рди рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдо рдХрд░реЗрдВ

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

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

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 рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

~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 рдХреНрдпреВрдм-рдбрд╛рдЙрдирд╕реНрдХреЗрд▓рд░, рдпрджрд┐ рдЖрдк рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рд╕реЗрд╡рд╛рдПрдВ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдкреИрдЯрд░реНрди рд╕реЗ рдирд┐рдкрдЯрддреА рд╣реИрдВ: рдХрднреА-рдХрднреА рдЙрдирдХреЗ рдореЙрдбреНрдпреВрд▓ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рд╡реЗ рдкреВрд░реА рдХреНрд╖рдорддрд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрддрдо рдкреАрдХ рд▓реЛрдб рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдб рдХреЗ рд╕реНрдерд╛рдпреА рдмреЗрдбрд╝реЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдХрд┐рдлрд╛рдпрддреА рдирд╣реАрдВ рд╣реИред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдХреНрд╖реИрддрд┐рдЬрдкреЙрдбрдСрдЯреЛрд╕реНрдХреЗрд▓рд░ (рдПрдЪрдкреАрдП)ред рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреЗрддрдХ рд╣реЛрддрд╛ рд╣реИ:

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

рдЬрд╝рд╛рд▓реИрдВрдбреЛ рдиреЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдмрдирд╛рдпрд╛ рд╣реИ: рдХреНрдпреВрдм рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдбрд╛рдкреНрдЯрд░ (рдХреНрдпреВрдм-рдореЗрдЯреНрд░рд┐рдХреНрд╕-рдПрдбреЗрдкреНрдЯрд░) рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдбрд╛рдкреНрдЯрд░ рд╣реИ рдЬреЛ рдкреЙрдбреНрд╕ рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдФрд░ рдмрд╛рд╣рд░реА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдФрд░ рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдПрд╕рдХреНрдпреВрдПрд╕ рдХрддрд╛рд░ рдФрд░ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рддреИрдирд╛рддреА рдХреЛ рдПрдХ рдХрд╕реНрдЯрдо рдореАрдЯреНрд░рд┐рдХ рдкрд░ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ 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

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

рд╕рдВрд╕рд╛рдзрди рдУрд╡рд░рдмреБрдХрд┐рдВрдЧ рдХрдо рдХрд░реЗрдВ

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

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

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рд░рд┐рдкреЛрд░реНрдЯ (рдХреНрдпреВрдм-рд╕рдВрд╕рд╛рдзрди-рд░рд┐рдкреЛрд░реНрдЯ) рдЕрддрд┐рд░рд┐рдХреНрдд рднрдВрдбрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдЪрдд рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

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

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

рд╕реАрдкреАрдпреВ рдЕрдиреБрд░реЛрдз рдХреЛ 3000 рдореАрдЯрд░ рд╕реЗ рдШрдЯрд╛рдХрд░ ~400 рдореАрдЯрд░ рдХрд░рдиреЗ рд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрднрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рд╕рдЪрдореБрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдорд╛рди рдмрджрд▓реЗрдВ? рдирд╣реАрдВ, рдорд╢реАрдиреЗрдВ рдЗрд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИрдВ! рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╡рд░реНрдЯрд┐рдХрд▓ рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЗрд▓рд░ (рд╡реАрдкреАрдП) рдмрд╕ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ: рдХрд╛рд░реНрдпрднрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрд╕рд╛рдзрди рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдордп рдХреЗ рд╕рд╛рде рд╡реАрдкреАрдП рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реАрдкреАрдпреВ рдЕрдиреБрд░реЛрдзреЛрдВ (рдкрддрд▓реА рдиреАрд▓реА рд░реЗрдЦрд╛) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЧреНрд░рд╛рдл рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

рдЬрд╝рд╛рд▓реИрдВрдбреЛ рдЕрдкрдиреЗ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡реАрдкреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП. рдЧреИрд░-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рд╡реАрдкреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

AWS рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдкрд░ рдмрдЪрдд рдХрд░реЗрдВ

рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд▓рд┐рдЦрд╛ рд╡реАрдкреАрдП рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреНрд▓реЙрдЧрдкреЛрд╕реНрдЯ 2019 рдореЗрдВ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реАрдПрдирд╕реАрдПрдл рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореБрджрд╛рдп рдиреЗ рд╡реАрдкреАрдП рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА.

EC2 рд╕реНрдкреЙрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

EC2 рд╕реНрдкреЙрдЯ рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ? рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: SpotInst (рдЬрд┐рд╕реЗ рдЕрдм "Spot" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭрд╕реЗ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рди рдкреВрдЫреЗрдВ) рдЬреИрд╕реА рддреГрддреАрдп рдкрдХреНрд╖ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдмрд╕ рдЕрдкрдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ Spot AutoScalingGroup (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"

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдкреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ рдиреЛрдЯреНрд╕:

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

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

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

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдХреНрд▓рд╛рдЙрдб рд▓рд╛рдЧрдд рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ рдХреНрдпрд╛ рд╣реИрдВ? рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдмрддрд╛рдПрдВ рдЯреНрд╡рд┐рдЯрд░ (@try_except_).

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

[2] рдЧрдгрдирд╛ рдЙрджрд╛рд╣рд░рдг: 5 GiB рдореЗрдореЛрд░реА рд╡рд╛рд▓рд╛ рдПрдХ m8.рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг ~$84 тАЛтАЛтАЛтАЛрдкреНрд░рддрд┐ рдорд╛рд╣ (рдИрдпреВ-рд╕реЗрдВрдЯреНрд░рд▓-1, рдСрди-рдбрд┐рдорд╛рдВрдб) рд╣реИ, рдпрд╛рдиреАред 1/8 рдиреЛрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд▓рдЧрднрдЧ ~$10/рдорд╛рд╣ рд╣реИред

[3] рдЖрдкрдХреЗ EC2 рдмрд┐рд▓ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдФрд░ рднреА рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдЙрджрд╛рд╣рд░рдг, рдмрдЪрдд рдпреЛрдЬрдирд╛, рдЖрджрд┐ - рдореИрдВ рдЙрди рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдкрд░ рдЧреМрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдХреЛрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдиреЗрдВред

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

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