рд▓реЗрдЦрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрджрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рд╣реЛрддрд╛
Kubernetes рд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪрд╛рд╡рд░ рдмрдЪрдд рдХрд╢реА рдХрд░рд╛рд╡реА? рдХреЛрдгрддрд╛рд╣реА рдПрдХрдЪ рдпреЛрдЧреНрдп рдЙрдкрд╛рдп рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╣рд╛ рд▓реЗрдЦ рдЕрдиреЗрдХ рд╕рд╛рдзрдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреА рд╕рдВрд╕рд╛рдзрдиреЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реАрдкрдгреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рддреБрдордЪрд╛ рдХреНрд▓рд╛рдЙрдб рд╕рдВрдЧрдгрди рдЦрд░реНрдЪ рдХрдореА рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХрддрд╛рдд.
рдореА рд╣рд╛ рд▓реЗрдЦ AWS рд╕рд╛рдареА Kubernetes рд╕рд╣ рд▓рд┐рд╣рд┐рд▓рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЛ рдЗрддрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдВрд╕рд╛рдареА (рдЬрд╡рд│рдЬрд╡рд│) рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рд▓рд╛рдЧреВ рд╣реЛрдИрд▓. рдореА рдЧреГрд╣реАрдд рдзрд░рдд рдЖрд╣реЗ рдХреА рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЖрдзреАрдЪ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ (
рд╣рд╛ рд▓реЗрдЦ рдХрд╡реНрд╣рд░ рдХрд░реЗрд▓:
- рди рд╡рд╛рдкрд░рд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рд╕рд╛рдл рдХрд░рдгреЗ (
рдХреБрдмреЗ-рд░рдХреНрд╖рдХ ) - рдЧреИрд░-рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдореА рдХрд░рд╛ (
kube-downscaler ) - рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ (HPA) рд╡рд╛рдкрд░рдгреЗ,
- рдЕрддреНрдпрд╛рдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди рдЖрд░рдХреНрд╖рдг рдХрдореА рдХрд░рдгреЗ (
kube-resource-report , VPA) - рд╕реНрдкреЙрдЯ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рдгреЗ
рди рд╡рд╛рдкрд░рд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рд╕рд╛рдл рдХрд░рдгреЗ
рд╡реЗрдЧрд╡рд╛рди рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдХрд╛рдо рдХрд░рдгреЗ рдЙрддреНрддрдо рдЖрд╣реЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╕рдВрд╕реНрдерд╛ рд╣рд╡реНрдпрд╛ рдЖрд╣реЗрдд
(рд╣реЗрдирд┐рдВрдЧ рдЬреЗрдХрдмреНрд╕:
рдЭрд┐рдЭрд╛:
(рдХреЛрдЯ) рдХреЛрд░реА рдХреНрд╡рд┐рди:
рдЧреИрд░рд╕рдордЬ: рддреБрдордЪреЗ 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 рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪрд╛ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд╡рдЪреНрдЫ рдареЗрд╡рдгреНрдпрд╛рдд рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдб рдХрдВрдкреНрдпреБрдЯрд┐рдВрдЧ рдЦрд░реНрдЪ рд╣рд│реВрд╣рд│реВ рд╡рд╛рдврдгреНрдпрд╛рдкрд╛рд╕реВрди рд░реЛрдЦрдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХрддреЛ. рдЙрдкрдпреЛрдЬрди рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реВрдЪрдирд╛рдВрд╕рд╛рдареА, рдЕрдиреБрд╕рд░рдг рдХрд░рд╛
рдЧреИрд░-рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрдореА рдХрд░рд╛
рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рдорд╛рдиреНрдпрдд: рдлрдХреНрдд рд╡реНрдпрд╡рд╕рд╛рдпрд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рдСрдкрд░реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдХрд╛рд╣реА рдЙрддреНрдкрд╛рджрди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕, рдЬрд╕реЗ рдХреА рдмреЕрдХ рдСрдлрд┐рд╕/рдЕреЕрдбрдорд┐рди рдЯреВрд▓реНрд╕, рддреНрдпрд╛рдВрдирд╛ рдлрдХреНрдд рдорд░реНрдпрд╛рджрд┐рдд рдЙрдкрд▓рдмреНрдзрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреА рд░рд╛рддреНрд░рднрд░ рдЕрдХреНрд╖рдо рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд.
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
рдЖрдард╡рдбреНрдпрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдХреНрд▓рд╕реНрдЯрд░ рд╡рд░реНрдХрд░ рдиреЛрдбреНрд╕ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпреЗрдереЗ рдПрдХ рдЖрд▓реЗрдЦ рдЖрд╣реЗ:
~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
рдкрд╣рд╛
рдХреНрд╖реИрддрд┐рдЬ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╡рд╛рдкрд░рд╛
рдЕрдиреЗрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ/рд╕реЗрд╡рд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдкреЕрдЯрд░реНрдирд╢реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛рдд: рдХрдзреАрдХрдзреА рддреНрдпрд╛рдВрдЪреЗ рдореЙрдбреНрдпреВрд▓ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рддреЗ рдкреВрд░реНрдг рдХреНрд╖рдорддреЗрдиреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд. рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдкреАрдХ рд▓реЛрдбрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╢реЗрдВрдЧрд╛рдВрдЪрд╛ рдХрд╛рдпрдорд╕реНрд╡рд░реВрдкреА рддрд╛рдлрд╛ рдЪрд╛рд▓рд╡рдгреЗ рдХрд┐рдлрд╛рдпрддрд╢реАрд░ рдирд╛рд╣реА. Kubernetes рд╕рдВрд╕рд╛рдзрдирд╛рдордзреНрдпреЗ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрд╡рдпрдВ-рд╕реНрдХреЗрд▓рд┐рдВрдЧрдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ
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 рдиреЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧрд╕рд╛рдареА рдХрд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд╣рдЬрдкрдгреЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдШрдЯрдХ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ:
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 рдЙрдкрд▓рдмреНрдз рдареЗрд╡рддреАрд▓.
рд╕реНрд▓реЕрдХ (рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд╛рдЦреАрд╡) рд╡рд┐рдирдВрддреА рдХреЗрд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рдкрд░ рдпрд╛рддреАрд▓ рдлрд░рдХ рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдХ рдкреЙрдб рдЬреА 2 GiB рдореЗрдорд░реАрдЪреА рд╡рд┐рдирдВрддреА рдХрд░рддреЗ рдкрд░рдВрддреБ рдХреЗрд╡рд│ 200 MiB рд╡рд╛рдкрд░рддреЗ ~ 1,8 GiB "рдЕрддрд┐рд░рд┐рдХреНрдд" рдореЗрдорд░реА рдЕрд╕рддреЗ. рдЬрд╛рджрд╛ рдкреИрд╕рд╛ рдЦрд░реНрдЪ рд╣реЛрддреЛ. рдПрдЦрд╛рджрд╛ рдЕрдВрджрд╛рдЬреЗ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡реВ рд╢рдХрддреЛ рдХреА 1 GiB рдирд┐рд░рд░реНрдердХ рдореЗрдорд░реАрдЪреА рдХрд┐рдВрдордд рджрд░рдорд╣рд╛ ~$10 рдЖрд╣реЗ.
CPU рд╡рд┐рдирдВрддреА 3000m рд╡рд░реВрди ~400m рдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓реНрдпрд╛рдиреЗ рдЗрддрд░ рд╡рд░реНрдХрд▓реЛрдбреНрд╕рд╕рд╛рдареА рд╕рдВрд╕рд╛рдзрдиреЗ рдореБрдХреНрдд рд╣реЛрддрд╛рдд рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рд▓рд╣рд╛рди рд╣реЛрдК рд╢рдХрддрд╛рдд.
"EC2 рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪрд╛ рд╕рд░рд╛рд╕рд░реА CPU рд╡рд╛рдкрд░ рдЕрдиреЗрдХрджрд╛ рдПрдХрд▓-рдЕрдВрдХреА рдЯрдХреНрдХреЗрд╡рд╛рд░реА рд╢реНрд░реЗрдгреАрдордзреНрдпреЗ рдлрд┐рд░рддреЛ,"
рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд░реЛрдЦрд░ рд▓реЛрдХрд╛рдВрдиреА YAML рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рдореВрд▓реНрдпреЗ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЗрдЪреНрдЫрд╛ рдЖрд╣реЗ рдХрд╛? рдирд╛рд╣реА, рдпрдВрддреНрд░реЗ рддреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░реВ рд╢рдХрддрд╛рдд! рдХреБрдмрд░реНрдиреЗрдЯреНрд╕
рдореА рдПрдХ рдЫреЛрдЯреЗрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ
EC2 рд╕реНрдкреЙрдЯ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рдгреЗ
рд╢реЗрд╡рдЯрдЪреЗ рдкрд░рдВрддреБ рдХрд┐рдорд╛рди рдирд╛рд╣реА, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╡рд░реНрдХрд░ рдиреЛрдбреНрд╕ рдореНрд╣рдгреВрди рд╕реНрдкреЙрдЯ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░реВрди AWS EC2 рдЦрд░реНрдЪ рдХрдореА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ
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 рд╡рд╛рдкрд░рддреЗ
рдХрд╛рдЯрд╛ рдиреЛрдб рдкреВрд▓ рдкреНрд░рд╛рдзрд╛рдиреНрдпрд╛рдВрд╕рд╣ рдЕрдзрд┐рдХреГрдд рдХреНрд▓рд╕реНрдЯрд░ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ - рд╕реНрдкреЙрдЯ рдиреЛрдбреНрд╕
рд╕рдХреНрддреА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рд╕реНрдкреЙрдЯрдордзреНрдпреЗ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реНрдХрд▓реЛрдбрдЪреА "рдиреЛрдВрджрдгреА" рд╕реНрд╡реАрдХрд╛рд░рд╛
рд╕рд╛рд░рд╛рдВрд╢
рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рддреБрдордЪреЗ рдХреНрд▓рд╛рдЙрдб рдмрд┐рд▓ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рджрд░ рдХреЗрд▓реЗрд▓реА рдХрд╛рд╣реА рд╕рд╛рдзрдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯрддреАрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЗрдЦрд╛рддреАрд▓ рдмрд╣реБрддрд╛рдВрд╢ рд╕рд╛рдордЧреНрд░реА рдпреЗрдереЗ рджреЗрдЦреАрд▓ рдорд┐рд│реВ рд╢рдХрддреЗ
Kubernetes рд╡рд░ рдХреНрд▓рд╛рдЙрдб рдЦрд░реНрдЪ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА рдХреЛрдгрддреНрдпрд╛ рдЖрд╣реЗрдд? рдХреГрдкрдпрд╛ рдорд▓рд╛ рдХрд│рд╡рд╛
рд╕реНрддреНрд░реЛрдд: www.habr.com