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