ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ื– ื’ืขื•ื•ืขืŸ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืื•ื™ืฃ ื“ื™ ืขืจืขื•ื• ืคื•ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ืงื•ืจืก "Infrastructure ืคึผืœืึทื˜ืคืึธืจืžืข ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Kubernetes".

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

ื•ื•ื™ ืฆื• ืฉืคึผืึธืจืŸ ืื•ื™ืฃ ื•ื•ืึธืœืงืŸ ืงืึธืก ื•ื•ืขืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ Kubernetes? ืขืก ืื™ื– ืงื™ื™ืŸ ืื™ื™ืŸ ืจืขื›ื˜ ืœื™ื™ื–ื•ื ื’, ืึธื‘ืขืจ ื“ืขืจ ืึทืจื˜ื™ืงืœ ื‘ืืฉืจื™ื™ื‘ื˜ ืขื˜ืœืขื›ืข ืžื›ืฉื™ืจื™ื ื•ื•ืึธืก ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ืื™ืจ ืคื™ืจืŸ ื“ื™ื™ืŸ ืจืขืกื•ืจืกืŸ ืžืขืจ ื™ืคืขืงื˜ื™ื•ื•ืœื™ ืื•ืŸ ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ื™ืŸ ื•ื•ืึธืœืงืŸ ืงืึทืžืคึผื™ื•ื˜ื™ื ื’ ืงืึธืก.

ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ื˜ Kubernetes ืคึฟืึทืจ AWS ืื™ืŸ ื–ื™ื ืขืŸ, ืึธื‘ืขืจ ืขืก ื•ื•ืขื˜ ืึทืคึผืœื™ื™ื– (ื›ึผืžืขื˜) ืคึผื•ื ืงื˜ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขื’ ืฆื• ืื ื“ืขืจืข ื•ื•ืึธืœืงืŸ ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื–. ืื™ืš ื™ื‘ืขืจื ืขืžืขืŸ ื“ื™ื™ืŸ ืงื ื•ื™ืœ (s) ืฉื•ื™ืŸ ื”ืึธื‘ืŸ ืึทื•ื˜ืึธืกืงืึทืœื™ื ื’ ืงืึทื ืคื™ื’ื™ืขืจื“ (cluster-autoscaler). ืจื™ืžื•ื•ื•ื™ื ื’ ืจืขืกื•ืจืกืŸ ืื•ืŸ ืกืงื™ื™ืœื™ื ื’ ืึทืจืึธืคึผ ื“ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื•ื•ืขื˜ ื ืึธืจ ืฉืคึผืึธืจืŸ ืื™ืจ ื’ืขืœื˜ ืื•ื™ื‘ ืขืก ืื•ื™ืš ืจืึทื“ื•ืกืึทื– ื“ื™ื™ืŸ ืคืœื™ื˜ ืคื•ืŸ ืึทืจื‘ืขื˜ ื ืึธื•ื“ื– (EC2 ื™ื ืกื˜ืึทื ืกื™ื–).

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื“ืขืงืŸ:

  • ืจื™ื™ื ื™ืงื•ื ื’ ืึทื ื™ื•ื–ื“ ืจืขืกื•ืจืกืŸ (ืงื•ื‘ืข-ืกื˜ืจื•ื–ืฉ)
  • ืจืขื“ื•ืฆื™ืจืŸ ืกืงื™ื™ืœื™ื ื’ ื‘ืขืฉืึทืก ื ื™ื˜-ืืจื‘ืขื˜ืŸ ืฉืขื” (kube-downscaler)
  • ื ื™ืฆืŸ ื”ืึธืจื™ื–ืึธื ื˜ืึทืœ ืึทื•ื˜ืึธืกืงืึทืœื™ื ื’ (HPA),
  • ืจืขื“ื•ืงืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื™ื‘ืขืจื™ืง ืžื™ื˜ืœ ืจืขื–ืขืจื•ื•ืึทืฆื™ืข (kube-resource-report, ื•ื•ืคึผืึท)
  • ื ื™ืฆืŸ ืกืคึผืึธื˜ ื™ื ืกื˜ืึทื ืกื™ื–

ืจื™ื™ื ื™ืงื•ื ื’ ืึทื ื™ื•ื–ื“ ืจืขืกื•ืจืกืŸ

ืืจื‘ืขื˜ืŸ ืื™ืŸ ืึท ืฉื ืขืœ-ืคึผื™ื™ืกื˜ ืกื•ื•ื™ื•ื•ืข ืื™ื– ื’ืจื•ื™ืก. ืžื™ืจ ื•ื•ื™ืœืŸ ื˜ืขืง ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืขืก ืึทืงืกืขืœืขืจื™ื™ื˜ื™ื“. ืคืึทืกื˜ืขืจ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืขืงืกืคึผืจืขืก ืื•ื™ืš ืžื™ื˜ืœ ืžืขืจ ืคึผืจ ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ, ืคืึธืจื•ื™ืกื™ืงืข ื•ื•ื™ื™ึทื–ื•ื ื’ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ, ืคึผืจืึธื•ื˜ืึทื˜ื™ื™ืคึผืก ืื•ืŸ ืึทื ืึทืœื™ื˜ื™ืงืก ืกืึทืœื•ืฉืึทื ื–. ืึทืœืฅ ืื™ื– ื“ื™ืคึผืœื•ื™ื“ ืื•ื™ืฃ Kubernetes. ื•ื•ืขืจ ื”ืื˜ ื“ื™ ืฆื™ื™ื˜ ืฆื• ืžืึทื ื™ื•ืึทืœื™ ืจื™ื™ืŸ ืึทืจื•ื™ืฃ ืคึผืจื•ื‘ื™ืจืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ? ืขืก ืื™ื– ื’ืจื™ื ื’ ืฆื• ืคืึทืจื’ืขืกืŸ ื•ื•ืขื’ืŸ ื•ื™ืกืžืขืงืŸ ืึท ื•ื•ืึธืš-ืึทืœื˜ ืขืงืกืคึผืขืจื™ืžืขื ื˜. ื“ื™ ื•ื•ืึธืœืงืŸ ืจืขื›ืขื ื•ื ื’ ื•ื•ืขื˜ ืกื•ืฃ ืึทืจื•ื™ืฃ ืจื™ื™ื–ื™ื ื’ ืจืขื›ื˜ ืฆื• ืขืคึผืขืก ืžื™ืจ ืคืืจื’ืขืกืŸ ืฆื• ืคืึทืจืžืึทื›ืŸ:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ 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

ืืŸ ืื ื“ืขืจ ืžืงื•ืจ ืคื•ืŸ ื™ื ืงืจื™ืกื™ื ื’ ืงืึธืก ืื™ื– ืคึผืขืจืกื™ืกื˜ืขื ื˜ ื•ื•ืึทืœื™ื•ืžื– (AWS EBS). ื“ื™ืœื™ื˜ื™ื ื’ ืึท Kubernetes StatefulSet ื˜ื•ื˜ ื ื™ืฉื˜ ื•ื™ืกืžืขืงืŸ ื“ื™ ืคึผืขืจืกื™ืกื˜ืขื ื˜ ื•ื•ืึทืœื™ื•ืžื– (PVC - PersistentVolumeClaim). ืึทื ื™ื•ื–ื“ EBS ื•ื•ืึทืœื™ื•ืžื– ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ืŸ ืงืึธืก ืคื•ืŸ ื”ื•ื ื“ืขืจื˜ืขืจ ืคื•ืŸ ื“ืึธืœืœืึทืจืก ืคึผืขืจ ื—ื•ื“ืฉ. Kubernetes Janitor ื”ืื˜ ืึท ืฉื˜ืจื™ืš ืฆื• ืจื™ื™ืŸ ืึทืจื•ื™ืฃ ืึทื ื™ื•ื–ื“ ืคึผื•ื•ืงืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืขื ื”ืขืจืฉืŸ ื•ื•ืขื˜ ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ ืึทืœืข ืคึผื•ื•ืงืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืžืึธื•ื ื˜ืขื“ ื“ื•ืจืš ืึท ืžืึธื“ื•ืœืข ืื•ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืจืขืคืขืจืจืขื“ ื“ื•ืจืš ืึท StatefulSet ืึธื“ืขืจ CronJob:

# ัƒะดะฐะปะธั‚ัŒ ะฒัะต PVC, ะบะพั‚ะพั€ั‹ะต ะฝะต ัะผะพะฝั‚ะธั€ะพะฒะฐะฝั‹ ะธ ะฝะฐ ะบะพั‚ะพั€ั‹ะต ะฝะต ััั‹ะปะฐัŽั‚ัั StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

Kubernetes Janitor ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ืื™ืจ ื”ืึทืœื˜ืŸ ื“ื™ื™ืŸ ืงื ื•ื™ืœ ืจื™ื™ืŸ ืื•ืŸ ืคืึทืจืžื™ื™ึทื“ืŸ ื•ื•ืึธืœืงืŸ ืงืึทืžืคึผื™ื•ื˜ื™ื ื’ ืงืึธืก ืคื•ืŸ ืกืœืึธื•ืœื™ ืคึผื™ืœื™ื ื’ ื–ื™ืš. ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื™ื ืกื˜ืจืึทืงืฉืึทื ื–, ื ืึธื›ื’ื™ื™ืŸ README ืงื•ื‘ืข-ืกื˜ืจื•ื–ืฉ.

ืจืขื“ื•ืฆื™ืจืŸ ืกืงื™ื™ืœื™ื ื’ ื‘ืขืฉืึทืก ื ื™ื˜-ืืจื‘ืขื˜ืŸ ืฉืขื”

ื˜ืขืกื˜ ืื•ืŸ ืกื˜ืึทื’ื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ ื–ืขื ืขืŸ ื˜ื™ืคึผื™ืงืœื™ ืคืืจืœืื ื’ื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ื‘ืœื•ื™ื– ื‘ืขืฉืึทืก ื’ืขืฉืขืคื˜ ืฉืขื”. ืขื˜ืœืขื›ืข ืคึผืจืึธื“ื•ืงืฆื™ืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ืึทื–ืึท ื•ื•ื™ ืฆื•ืจื™ืง ืึธืคื™ืก / ืึทื“ืžื™ืŸ ืžื›ืฉื™ืจื™ื, ืื•ื™ืš ื“ืึทืจืคืŸ ื‘ืœื•ื™ื– ืœื™ืžื™ื˜ืขื“ ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœืึทื˜ื™ ืื•ืŸ ืงืขืŸ ื–ื™ื™ืŸ ืคืึทืจืงืจื™ืคึผืœื˜ ื™ื‘ืขืจื ืึทื›ื˜ื™ืง.

Kubernetes Downscaler (kube-downscaler) ืึทืœืึทื•ื– ื ื™ืฆืขืจืก ืื•ืŸ ืึธืคึผืขืจื™ื™ื˜ืขืจื– ืฆื• ืคืึทืจืงืœืขื ืขืจืŸ ื“ื™ ืกื™ืกื˜ืขื ื‘ืขืฉืึทืก ื ื™ื˜-ืืจื‘ืขื˜ืŸ ืฉืขื”. ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ ืื•ืŸ ืกื˜ืขื™ื˜ืคื•ืœืกืขืฅ ืงืขื ืขืŸ ื•ื•ืึธื’ ืฆื• ื ื•ืœ ืจืขืคึผืœืึทืงืึทื–. CronJobs ืงืขืŸ ื–ื™ื™ืŸ ืกื•ืกืคึผืขื ื“ืขื“. Kubernetes Downscaler ืื™ื– ืงืึทื ืคื™ื’ื™ืขืจื“ ืคึฟืึทืจ ืึท ื’ืึทื ืฅ ืงื ื•ื™ืœ, ืื™ื™ื ืขืจ ืึธื“ืขืจ ืžืขืจ ื ืึธืžืขืŸ ืกืคึผื™ื™ืกืึทื– ืึธื“ืขืจ ื™ื—ื™ื“ ืจืขืกื•ืจืกืŸ. ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขืœืŸ ืึธื“ืขืจ "ืœื™ื™ื“ื™ืง ืฆื™ื™ื˜" ืึธื“ืขืจ, ืคืึทืจืงืขืจื˜, "ืึทืจื‘ืขื˜ ืฆื™ื™ื˜". ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืฆื• ืจืขื“ื•ืฆื™ืจืŸ ืกืงื™ื™ืœื™ื ื’ ื•ื•ื™ ืคื™ืœ ื•ื•ื™ ืžืขื’ืœืขืš ื‘ืขืฉืึทืก ื ืขื›ื˜ ืื•ืŸ ื•ื•ื™ืงืขื ื“ื–:

image: hjacobs/kube-downscaler:20.4.3
args:
  - --interval=30
  # ะฝะต ะพั‚ะบะปัŽั‡ะฐั‚ัŒ ะบะพะผะฟะพะฝะตะฝั‚ั‹ ะธะฝั„ั€ะฐัั‚ั€ัƒะบั‚ัƒั€ั‹
  - --exclude-namespaces=kube-system,infra
  # ะฝะต ะพั‚ะบะปัŽั‡ะฐั‚ัŒ kube-downscaler, ะฐ ั‚ะฐะบะถะต ะพัั‚ะฐะฒะธั‚ัŒ Postgres Operator, ั‡ั‚ะพะฑั‹ ะธัะบะปัŽั‡ะตะฝะฝั‹ะผะธ ะ‘ะ” ะผะพะถะฝะพ ะฑั‹ะปะพ ัƒะฟั€ะฐะฒะปัั‚ัŒ
  - --exclude-deployments=kube-downscaler,postgres-operator
  - --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
  - --include-resources=deployments,statefulsets,stacks,cronjobs
  - --deployment-time-annotation=deployment-time

ื“ืึธ ืื™ื– ืึท ื’ืจืึทืคื™ืง ืคึฟืึทืจ ืกืงื™ื™ืœื™ื ื’ ืงื ื•ื™ืœ ืึทืจื‘ืขื˜ืขืจ ื ืึธื•ื“ื– ืื•ื™ืฃ ื•ื•ื™ืงืขื ื“ื–:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ 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 kube-downscaler, ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืื•ืŸ ื ืึธืš ืึธืคึผืฆื™ืขืก.

ื ื™ืฆืŸ ื”ืึธืจื™ื–ืึธื ื˜ืึทืœ ืึทื•ื˜ืึธืกืงืึทืœื™ื ื’

ืคื™ืœืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– / ื‘ืึทื“ื™ื ื•ื ื’ืก ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ืึท ื“ื™ื ืึทืžื™ืฉ ืœืึธื•ื“ื™ื ื’ ืžื•ืกื˜ืขืจ: ืžืืœ ื–ื™ื™ืขืจ ืžืึทื“ื–ืฉื•ืœื– ื–ืขื ืขืŸ ืœื™ื™ื“ื™ืง, ืื•ืŸ ืžืืœ ื–ื™ื™ ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ืคื•ืœ ืงืึทืคึผืึทืฆื™ื˜ืขื˜. ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืึท ืฉื˜ืขื ื“ื™ืง ืคืœื™ื˜ ืคื•ืŸ ืคึผืึธื“ืก ืฆื• ืงืึธืคึผืข ืžื™ื˜ ืžืึทืงืกื™ืžื•ื ืฉืคึผื™ืฅ ืžืึทืกืข ืื™ื– ื ื™ืฉื˜ ืฉืคึผืึธืจืขื•ื•ื“ื™ืง. Kubernetes ืฉื˜ื™ืฆื˜ ื”ืึธืจื™ื–ืึธื ื˜ืึทืœ ืึทื•ื˜ืึธ-ืกืงื™ื™ืœื™ื ื’ ืึทืจื™ื‘ืขืจ ืึท ืžื™ื˜ืœ ื”ืึธืจื™ื–ืึธื ื˜ืึทืœ ืคึผืึธื“ ืึทื•ื˜ืึธืกืงืึทืœืขืจ (HPA). ืงืคึผื• ื‘ืึทื ื™ืฅ ืื™ื– ืึธืคื˜ ืึท ื’ื•ื˜ ื’ืจืื“ืŸ ืคึฟืึทืจ ืกืงื™ื™ืœื™ื ื’:

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: ื•ื•ืึธื’ ื“ื™ื™ืŸ ื“ื™ืคึผืœื•ื™ืžืึทื ืฅ, ื ื™ืฉื˜ ื“ื™ื™ืŸ ื‘ื™ื™ึทื˜ืœ.

ืจืขื“ื•ืฆื™ืจืŸ ืžื™ื˜ืœ ืึธื•ื•ื•ืขืจื‘ื•ืงื™ื ื’

ืงื•ื‘ืขืจื ืขื˜ืขืก ื•ื•ืขืจืงืœืึธื•ื“ื– ื‘ืึทืฉื˜ื™ืžืขืŸ ื–ื™ื™ืขืจ ืงืคึผื• / ื–ื™ืงืึธืจืŸ ื“ืึทืจืฃ ื“ื•ืจืš "ืจื™ืกืึธืจืก ืจื™ืงื•ื•ืขืก." ืงืคึผื• ืจืขืกื•ืจืกืŸ ื–ืขื ืขืŸ ื’ืขืžืืกื˜ืŸ ืื™ืŸ ื•ื•ื™ืจื˜ื•ืึทืœ ืงืึธืจืขืก ืึธื“ืขืจ ืžืขืจ ืงืึทืžืึทื ืœื™ ืื™ืŸ "ืžื™ืœื™ืงืึธืจืขืก", ืœืžืฉืœ 500 ื ื™ืžืคึผืœื™ื™ื– 50% ื•ื•ืงืคึผื•. ื–ื›ึผืจื•ืŸ ืจืขืกื•ืจืกืŸ ื–ืขื ืขืŸ ื’ืขืžืืกื˜ืŸ ืื™ืŸ ื‘ื™ื˜ืขืก, ืื•ืŸ ืคึผืจืึธืกื˜ ืกืึทืคื™ืงืกื™ื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜, ืึทื–ืึท ื•ื•ื™ 500ืžื™, ื•ื•ืึธืก ืžื™ื˜ืœ 500 ืžืขื’ืื‘ื™ื™ื˜. ืžื™ื˜ืœ ืจื™ืงื•ื•ืขืก "ืฉืœืึธืก" ืงืึทืคึผืึทืฆื™ื˜ืขื˜ ืื•ื™ืฃ ืึทืจื‘ืขื˜ ื ืึธื•ื“ื–, ื˜ื™ื™ึทื˜ืฉ ืึท ืคึผืึธื“ ืžื™ื˜ ืึท 1000 ื ืงืคึผื• ื‘ืขื˜ืŸ ืื•ื™ืฃ ืึท ื ืึธื“ืข ืžื™ื˜ 4 ื•ื•ืงืคึผื•ืก ื•ื•ืขื˜ ืœืึธื–ืŸ ื‘ืœื•ื™ื– 3 ื•ื•ืงืคึผื•ืก ื‘ื ื™ืžืฆื ืฆื• ืื ื“ืขืจืข ืคึผืึธื“ืก. [ืงืกื ื•ืžืงืก]

ืกืœืึทืง (ื•ื™ื“ืขืคื“ื™ืง ืจืขื–ืขืจื•ื•) ืื™ื– ื“ืขืจ ื—ื™ืœื•ืง ืฆื•ื•ื™ืฉืŸ ื’ืขื‘ืขื˜ืŸ ืจืขืกื•ืจืกืŸ ืื•ืŸ ืคืึทืงื˜ื™ืฉ ื‘ืึทื ื™ืฅ. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึท ืคึผืึธื“ ื•ื•ืึธืก ืจื™ืงื•ื•ืขืก 2 GiB ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืึธื‘ืขืจ ื‘ืœื•ื™ื– ื ื™ืฆื˜ 200 MiB ื”ืื˜ ~ 1,8 GiB ืคื•ืŸ "ื•ื™ื“ืขืคื“ื™ืง" ื–ื›ึผืจื•ืŸ. ื•ื™ื“ืขืคื“ื™ืง ืงืึธืก ื’ืขืœื˜. ืžืขืŸ ืงืขืŸ ื‘ืขืขืจืขืš ืึธืคึผืฉืึทืฆืŸ ืึทื– 1 GiB ืคื•ืŸ ื™ื‘ืขืจื™ืง ื–ื›ึผืจื•ืŸ ืงืึธืก ~ $ 10 ืคึผืขืจ ื—ื•ื“ืฉ. [ืงืกื ื•ืžืงืก]

Kubernetes ืจื™ืกืึธืจืก ื‘ืืจื™ื›ื˜ (kube-resource-report) ื“ื™ืกืคึผืœื™ื™ื– ื•ื™ื“ืขืคื“ื™ืง ืจื™ื–ืขืจื•ื•ื– ืื•ืŸ ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ืื™ืจ ื‘ืึทืฉืœื™ืกืŸ ืกื™ื™ื•ื•ื™ื ื’ื– ืคึผืึธื˜ืขื ืฆื™ืขืœ:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

Kubernetes ืจื™ืกืึธืจืก ื‘ืืจื™ื›ื˜ ื•ื•ื™ื™ื–ื˜ ื“ื™ ื•ื™ื“ืขืคื“ื™ืง ื’ืขื–ืืžืœื˜ ื“ื•ืจืš ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ื‘ืึทืคึฟืขืœ. ื“ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืขืจื˜ืขืจ ื•ื•ื• ืจื™ืกืึธืจืก ืคืื“ืขืจื•ื ื’ืขืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจื™ื“ื•ืกื˜. ื“ืขืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ HTML ื‘ืึทืจื™ื›ื˜ ื‘ืœื•ื™ื– ื’ื™ื˜ ืึท ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืคื•ืŸ ืžื™ื˜ืœ ื‘ืึทื ื™ืฅ. ืื™ืจ ื–ืึธืœ ืงื•ืงืŸ ืื™ืŸ ืงืคึผื• / ื–ื™ืงืึธืจืŸ ื‘ืึทื ื™ืฅ ืื™ื‘ืขืจ ืฆื™ื™ึทื˜ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ื˜ื•ื™ื’ืŸ ืžื™ื˜ืœ ืจื™ืงื•ื•ืขืก. ื“ืึธ ืื™ื– ืึท ื’ืจืึทืคืึทื ืึท ื˜ืฉืึทืจื˜ ืคึฟืึทืจ ืึท "ื˜ื™ืคึผื™ืฉ" ืงืคึผื•-ืฉื•ื•ืขืจ ื“ื™ื ืกื˜: ืึทืœืข ืคึผืึธื“ืก ื ื•ืฆืŸ ื‘ืื˜ื™ื™ื˜ื™ืง ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ื“ื™ 3 ื’ืขื‘ืขื˜ืŸ ืงืคึผื• ืงืึธืจืขืก:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

ืจื™ื“ื•ืกื™ื ื’ ื“ื™ ืงืคึผื• ื‘ืขื˜ืŸ ืคื•ืŸ 3000 ื ืฆื• ~ 400 ื ืคืจื™ื™ ืจืขืกื•ืจืกืŸ ืคึฟืึทืจ ืื ื“ืขืจืข ื•ื•ืขืจืงืœืึธื•ื“ื– ืื•ืŸ ืึทืœืึทื•ื– ื“ื™ ืงื ื•ื™ืœ ืฆื• ื–ื™ื™ืŸ ืงืœืขื ืขืจืขืจ.

"ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ืงืคึผื• ื‘ืึทื ื™ืฅ ืคื•ืŸ EC2 ื™ื ืกื˜ืึทื ืกื™ื– ืึธืคื˜ ื›ืึทื•ื•ื– ืื™ืŸ ื“ื™ ืื™ื™ืŸ-ืฆื™ืคึฟืขืจ ืคึผืจืึธืฆืขื ื˜ ืงื™ื™ื˜," ืฉืจื™ื™ื‘ื˜ ืงืึธืจื™ ืงื•ื•ื™ืŸ. ื‘ืฉืขืช ืคึฟืึทืจ EC2 ืขืกื˜ื™ืžืึทื˜ืขื“ ื“ื™ ืจืขื›ื˜ ื’ืจื™ื™ืก ืงืขืŸ ื–ื™ื™ืŸ ืึท ืฉืœืขื›ื˜ ื‘ืึทืฉืœื•ืกื˜ืฉืึทื ื’ื™ื ื’ ืขื˜ืœืขื›ืข Kubernetes ืžื™ื˜ืœ ืงื•ื•ื™ืจื™ื– ืื™ืŸ ืึท YAML ื˜ืขืงืข ืื™ื– ื’ืจื™ื ื’ ืื•ืŸ ืงืขื ืขืŸ ื‘ืจืขื ื’ืขืŸ ืจื™ื–ื™ืง ืกื™ื™ื•ื•ื™ื ื’ื–.

ืึธื‘ืขืจ ื˜ืึธืŸ ืžื™ืจ ื˜ืึทืงืข ื•ื•ืขืœืŸ ืึทื– ืžืขื ื˜ืฉืŸ ื˜ืฉืึทื ื’ื™ื ื’ ื•ื•ืึทืœื•ืขืก ืื™ืŸ YAML ื˜ืขืงืขืก? ื ื™ื™ืŸ, ืžืืฉื™ื ืขืŸ ืงืขื ืขืŸ ืขืก ืคื™ืœ ื‘ืขืกืขืจ! Kubernetes ื•ื•ืขืจื˜ื™ืงืึทืœ ืคึผืึธื“ ืึทื•ื˜ืึธืกืงืึทืœืขืจ (VPA) ื˜ื•ื˜ ืคึผื•ื ืงื˜ ื“ืึธืก: ืึทื“ืึทืคึผืฅ ืžื™ื˜ืœ ืจื™ืงื•ื•ืขืก ืื•ืŸ ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืœื•ื™ื˜ ื“ื™ ื•ื•ืขืจืงืœืึธื•ื“. ื“ืึธ ืื™ื– ืึท ื‘ื™ื™ืฉืคึผื™ืœ ื’ืจืึทืคื™ืง ืคื•ืŸ ืคึผืจืึธืžืขื˜ื”ืขื•ืก ืงืคึผื• ืจื™ืงื•ื•ืขืก (ื“ื™ืŸ ื‘ืœื•ื™ ืฉื•ืจื”) ืฆื•ื’ืขืคืืกื˜ ื“ื•ืจืš ื•ื•ืคึผืึท ืื™ื‘ืขืจ ืฆื™ื™ื˜:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

Zalando ื ื™ืฆื˜ VPA ืื™ืŸ ืึทืœืข ื–ื™ื™ืŸ ืงืœืึทืกื˜ืขืจื– ืคึฟืึทืจ ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ. ื ื™ื˜-ืงืจื™ื˜ื™ืฉ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืงืขื ืขืŸ ืื•ื™ืš ื ื•ืฆืŸ ื•ื•ืคึผืึท.

ื’ืึธืœื“ื™ืœืึธืงืงืก ืคึฟื•ืŸ Fairwind ืื™ื– ืึท ื’ืขืฆื™ื™ึทื’ ื•ื•ืึธืก ืงืจื™ื™ื™ืฅ ืึท ื•ื•ืคึผืึท ืคึฟืึทืจ ื™ืขื“ืขืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื™ืŸ ืึท ื ืึทืžืขืกืคึผืึทืกืข ืื•ืŸ ื“ืขืจื ืึธืš ื“ื™ืกืคึผืœื™ื™ื– ืึท VPA ืจืขืงืึธืžืขื ื“ืึทืฆื™ืข ืื•ื™ืฃ ื–ื™ื™ืŸ ื“ืึทืฉื‘ืึธืจื“. ืขืก ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฉื˜ืขืœืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ืงืคึผื• / ื–ื™ืงืึธืจืŸ ืจื™ืงื•ื•ืขืก ืคึฟืึทืจ ื–ื™ื™ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–:

ืฉืคึผืึธืจืŸ ืื•ื™ืฃ Kubernetes ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ AWS

ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืึท ืงืœื™ื™ืŸ ื‘ืœืึธื’ืคึผืึธืกื˜ ื•ื•ืขื’ืŸ ื•ื•ืคึผืึท ืื™ืŸ 2019, ืื•ืŸ ืœืขืฆื˜ื ืก ืื™ืŸ CNCF ืกื•ืฃ ื‘ืึทื ื™ืฆืขืจ ืงืึทืžื™ื•ื ื™ื˜ื™ ื“ื™ืกืงืึทืกื˜ ื“ื™ VPA ืึทืจื•ื™ืกื’ืขื‘ืŸ.

ื ื™ืฆืŸ EC2 ืกืคึผืึธื˜ ื™ื ืกื˜ืึทื ืกื™ื–

ืœืขืฆื˜ืข ืึธื‘ืขืจ ื ื™ื˜ ืงืœืขื ืกื˜ืขืจ, AWS EC2 ืงืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจื™ื“ื•ืกื˜ ื“ื•ืจืš ื ื™ืฆืŸ ืกืคึผืึธื˜ ื™ื ืกื˜ืึทื ืกื™ื– ื•ื•ื™ Kubernetes ืึทืจื‘ืขื˜ ื ืึธื•ื“ื– [ืงืกื ื•ืžืงืก]. ืกืคึผืึธื˜ ื™ื ืกื˜ืึทื ืกื™ื– ื–ืขื ืขืŸ ื‘ื ื™ืžืฆื ืžื™ื˜ ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ ืึทืจื•ื™ืฃ ืฆื• 90% ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ืื•ื™ืฃ-ื“ืขืžืึทื ื“ ืคึผืจื™ื™ืกืึทื–. ืคืœื™ืกื ื“ื™ืง Kubernetes ืื•ื™ืฃ EC2 Spot ืื™ื– ืึท ื’ื•ื˜ืข ืงืึธืžื‘ื™ื ืึทืฆื™ืข: ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืขื˜ืœืขื›ืข ืคืึทืจืฉื™ื“ืขื ืข ื˜ื™ื™ืคึผืก ืคึฟืึทืจ ื”ืขื›ืขืจ ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœืึทื˜ื™, ื“ืึธืก ื”ื™ื™ืกื˜, ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ืึท ื’ืจืขืกืขืจืข ื ืึธื“ืข ืคึฟืึทืจ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืึธื“ืขืจ ื ื™ื“ืขืจื™ืงืขืจ ืคึผืจื™ื™ึทื–, ืื•ืŸ ื“ื™ ื’ืขื•ื•ืืงืกืŸ ืงืึทืคึผืึทืฆื™ื˜ืขื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื“ื•ืจืš ืงืึทื ื˜ื™ื™ื ืขืจื™ื™ื–ื“ Kubernetes ื•ื•ืขืจืงืœืึธื•ื“ื–.

ื•ื•ื™ ืฆื• ืœื•ื™ืคืŸ Kubernetes ืื•ื™ืฃ EC2 Spot? ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ืึธืคึผืฆื™ืขืก: ื ื•ืฆืŸ ืึท ื“ืจื™ื˜ ืคึผืึทืจื˜ื™ื™ ื“ื™ื ืกื˜ ื•ื•ื™ 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 ืžื™ื˜ Kubernetes:

  • ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืขืคึผืŸ ืกืคึผืึธื˜ ื˜ืขืจืžืึทื ื™ื™ืฉืึทื ื–, ืœืžืฉืœ ื“ื•ืจืš ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ื“ื™ ื ืึธื“ืข ื•ื•ืขืŸ ื“ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ืื™ื– ืกื˜ืึทืคึผื˜
  • ื–ืึทืœืึทื ื“ืึธ ื ื™ืฆื˜ ื’ืึธืคึผืœ ื‘ืึทืึทืžื˜ืขืจ ืงื ื•ื™ืœ ืึทื•ื˜ืึธืกืงืึทืœื™ื ื’ ืžื™ื˜ ื ืึธื“ืข ื‘ืขืงืŸ ืคึผืจื™ื™ืึธืจืึทื˜ื™ื–
  • ืึธืจื˜ ื ืึธื•ื“ื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืฆื•ื•ื•ื ื’ืขืŸ ืึธื ื ืขืžืขืŸ "ืจืขื’ื™ืกื˜ืจืึทื˜ื™ืึธื ืก" ืคื•ืŸ ื•ื•ืขืจืงืœืึธื•ื“ื– ืฆื• ืœื•ื™ืคืŸ ืื™ืŸ ืกืคึผืึธื˜

ืงื™ืฆืขืจ

ืื™ืš ื”ืึธืคึฟืŸ ืื™ืจ ื’ืขืคึฟื™ื ืขืŸ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื“ืขืจืœืื ื’ื˜ ืžื›ืฉื™ืจื™ื ื ื•ืฆื™ืง ืื™ืŸ ืจื™ื“ื•ืกื™ื ื’ ื“ื™ื™ืŸ ื•ื•ืึธืœืงืŸ ืจืขื›ืขื ื•ื ื’. ืื™ืจ ืงืขื ื˜ ืื•ื™ืš ื’ืขืคึฟื™ื ืขืŸ ืจื•ื‘ึฟ ืคื•ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืŸ ืžื™ื™ืŸ ืจืขื“ืŸ ื‘ื™ื™ DevOps Gathering 2019 ืื•ื™ืฃ ื™ืึธื•ื˜ื•ื‘ืข ืื•ืŸ ืื™ืŸ ืกืœื™ื™ื“ื–.

ื•ื•ืึธืก ื–ืขื ืขืŸ ื“ื™ื™ืŸ ื‘ืขืกื˜ืขืจ ืคึผืจืึทืงื˜ื™ืกื™ื– ืคึฟืึทืจ ืฉืคึผืึธืจืŸ ื•ื•ืึธืœืงืŸ ืงืึธืก ืื•ื™ืฃ Kubernetes? ื‘ื™ื˜ืข ืœืึธื–ืŸ ืžื™ืจ ื•ื•ื™ืกืŸ ื‘ื™ื™ึท ื˜ื•ื•ื™ื˜ื˜ืขืจ (@try_except_).

[ืงืกื ื•ืžืงืก] ืื™ืŸ ืคืึทืงื˜, ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ 3 ื•ื•ืงืคึผื•ืก ื•ื•ืขื˜ ื‘ืœื™ื™ื‘ืŸ ื ื™ืฆืœืขืš ื•ื•ื™ื™ึทืœ ื“ื™ ื˜ืจื•ืคึผื•ื˜ ืคื•ืŸ ื“ื™ ื ืึธื“ืข ืื™ื– ืจื™ื“ื•ืกื˜ ื“ื•ืจืš ืจืขื–ืขืจื•ื•ื™ืจื˜ ืกื™ืกื˜ืขื ืจืขืกื•ืจืกืŸ. Kubernetes ื“ื™ืกื˜ื™ื ื’ื’ื•ื•ื™ืฉื™ื– ืฆื•ื•ื™ืฉืŸ ื’ืฉืžื™ื•ืช ื ืึธื“ืข ืงืึทืคึผืึทืฆื™ื˜ืขื˜ ืื•ืŸ "ืคึผืจืึทื•ื•ื™ื–ืฉืึทื ื“" ืจืขืกื•ืจืกืŸ (ื ืึธื“ืข ืึทืœืึทืงืึทื˜ืึทื‘ืึทืœ).

[ืงืกื ื•ืžืงืก] ื—ืฉื‘ื•ืŸ ื‘ื™ื™ืฉืคึผื™ืœ: ืื™ื™ืŸ m5.large ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ื˜ 8 ื’ื™ื‘ ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืื™ื– ~ $ 84 ืคึผืขืจ ื—ื•ื“ืฉ (ื™ื•-ืกืขื ื˜ืจืึทืœ-1, ืื•ื™ืฃ-ื“ืขืžืึทื ื“), ื“.ื”. ื‘ืœืึทืงื™ื ื’ 1/8 ื ืึธื“ืข ืื™ื– ื‘ืขืขืจืขืš ~ $ 10 / ื—ื•ื“ืฉ.

[ืงืกื ื•ืžืงืก] ืขืก ื–ืขื ืขืŸ ืคื™ืœืข ืžืขืจ ื•ื•ืขื’ืŸ ืฆื• ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ื™ืŸ EC2 ืจืขื›ืขื ื•ื ื’, ืึทื–ืึท ื•ื•ื™ ืจืขื–ืขืจื•ื•ื™ืจื˜ ื™ื ืกื˜ืึทื ืกื™ื–, ืกืึทื•ื•ื™ื ื’ืก ืคึผืœืึทืŸ, ืืื–"ื• ื• - ืื™ืš ื•ื•ืขืœ ื ื™ืฉื˜ ื“ืขืงืŸ ื“ื™ ื˜ืขืžืขืก ื“ืึธ, ืึธื‘ืขืจ ืื™ืจ ื–ืึธืœ ื‘ืืฉื˜ื™ืžื˜ ืงื•ืงืŸ ืื™ืŸ ื–ื™ื™!

ืœืขืจื ืขืŸ ืžืขืจ ื•ื•ืขื’ืŸ ื“ืขื ืงื•ืจืก.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’