αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž’αžαŸ’αžαž”αž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž“αŸ…αž˜αž»αž“αžαŸ’αž„αŸƒαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ "αžœαŸαž‘αž·αž€αžΆαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αž’αŸ‚αž€αž›αžΎ Kubernetes".

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Kubernetes? αž˜αž·αž“αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αž½αž™αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αžΆαž…αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž“αž’αžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– αž“αž·αž„αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž›αžΎαž–αž–αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™ Kubernetes αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ AWS αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž·αžαŸ’αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž“αžΉαž„αž’αž“αž»αžœαžαŸ’αž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚) αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž–αž–αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžαŸ’αž‰αž»αŸ†αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž…αž„αŸ’αž€αŸ„αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ autoscaling αžšαž½αž…αž αžΎαž™ (cluster-autoscaler) αž€αžΆαžšαžŠαž€αž’αž“αž’αžΆαž“αž…αŸαž‰ αž“αž·αž„αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž“αžΉαž„αž‡αž½αž™αžŸαž“αŸ’αžŸαŸ†αž”αŸ’αžšαžΆαž€αŸ‹αž’αŸ’αž“αž€αž”αžΆαž“ αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αžœαžΆαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžš (αž§αž‘αžΆαž αžšαžŽαŸ EC2)αŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αŸ–

  • αžŸαž˜αŸ’αž’αžΆαžαž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎ (kube-janitor)
  • αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž˜αž·αž“αž’αŸ’αžœαžΎαž€αžΆαžš (kube-downscaler)
  • αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž•αŸ’αžŠαŸαž€ (HPA),
  • αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž€αž€αŸ‹αž’αž“αž’αžΆαž“αž›αžΎαžŸαž›αž”αŸ‹ (kube-resource-report, VPA)
  • αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸ Spot

αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎ

αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αž›αŸ’αž”αžΏαž“αž›αžΏαž“αž‚αžΊαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αžŽαžΆαžŸαŸ‹αŸ” αž™αžΎαž„αž…αž„αŸ‹αž”αžΆαž“αž’αž„αŸ’αž‚αž€αžΆαžšαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“. αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αž€αŸαž˜αžΆαž“αž“αŸαž™αžαžΆ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ PR αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αž”αžšαž·αžŸαŸ’αžαžΆαž“αž˜αžΎαž›αž‡αžΆαž˜αž»αž“ αž‚αŸ†αžšαžΌ αž“αž·αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαž·αž—αžΆαž‚αŸ” αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž›αžΎ Kubernetes αŸ” αžαžΎαž’αŸ’αž“αž€αžŽαžΆαž˜αžΆαž“αž–αŸαž›αžœαŸαž›αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αž’αžΆαžαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αžŠαŸƒ? αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαž€αžΆαžšαž›αž»αž”αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαžŠαŸ‚αž›αž˜αžΆαž“αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαŸ” αžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžšαž›αžΎαž–αž–αž€αž“αžΉαž„αž€αžΎαž“αž‘αžΎαž„αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž™αžΎαž„αž—αŸ’αž›αŸαž…αž”αž·αž‘αŸ–

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

(Henning Jacobs:
αž αŸ’αžŸαžΈαž αŸ’αžŸαžΆαŸ–
(αžŠαž€αžŸαŸ’αžšαž„αŸ‹) Corey QuinnαŸ–
αž‘αŸαžœαž€αžαžΆαŸ– αž‚αžŽαž“αžΈ AWS αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαž“αŸƒαž…αŸ†αž“αž½αž“αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αžΆαž“αŸ”
αž€αžΆαžšαž–αž·αžαŸ– αž–αž·αž“αŸ’αž‘αž» AWS αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαž“αŸƒαž…αŸ†αž“αž½αž“αžœαž·αžŸαŸ’αžœαž€αžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αžΆαž“αŸ”

Ivan Kurnosov (αž†αŸ’αž›αžΎαž™αžαž”)αŸ–
αž€αžΆαžšαž–αž·αžαŸ– αž–αž·αž“αŸ’αž‘αž» AWS αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαž“αŸƒαž…αŸ†αž“αž½αž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž—αŸ’αž›αŸαž…αž”αž·αž‘/αž›αž»αž”αŸ”)

Kubernetes Janitor (kube-janitor) αž‡αž½αž™αžŸαž˜αŸ’αž’αžΆαžαž…αž„αŸ’αž€αŸ„αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αžαŸ‚αž‘αžΆαŸ†αž‚αžΊαž’αžΆαž…αž”αžαŸ‹αž”αŸ‚αž“αž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‡αžΆαžŸαž€αž› αž“αž·αž„αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αŸ–

  • αž…αŸ’αž”αžΆαž”αŸ‹αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž‡αžΆαž€αŸ’αžšαž»αž˜αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž’αžαž·αž”αžšαž˜αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαž•αŸ’αž‘αžΆαž›αŸ‹ (TTL) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ PR/test αŸ”
  • αž’αž“αž’αžΆαž“αž”αž»αž‚αŸ’αž‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αž‡αžΆαž˜αž½αž™ janitor/ttl αž§αž‘αžΆαž αžšαžŽαŸαžŠαžΎαž˜αŸ’αž”αžΈαžŠαž€ spike/prototype αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ 7 αžαŸ’αž„αŸƒαŸ”

αž…αŸ’αž”αžΆαž”αŸ‹αž‘αžΌαž‘αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš YAML αŸ” αž•αŸ’αž›αžΌαžœαžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš --rules-file αž“αŸ… kube-janitor αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž…αŸ’αž”αžΆαž”αŸ‹β€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž˜αž½αž™β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž›αž»αž”β€‹αžŠαž€β€‹αžƒαŸ’αž›αžΆβ€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αž…αŸαž‰β€‹αž‡αžΆαž˜αž½αž™ -pr- αž“αŸ…αž€αŸ’αž“αž»αž„αžˆαŸ’αž˜αŸ„αŸ‡αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž–αžΈαžšαžαŸ’αž„αŸƒ:

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

αž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž’αŸ’αžœαžΎαž“αž·αž™αŸαžαž€αž˜αŸ’αž˜αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ’αž›αžΆαž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž›αžΎ Deployment and StatefulSet pods αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Deployments/StatefulSets αžαŸ’αž˜αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 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 αž“αžΆαž‘αžΈαž“αŸ…αž›αžΎαž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš kube-janitorαŸ–

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

αž”αŸ’αžšαž—αž–αž˜αž½αž™αž‘αŸ€αžαž“αŸƒαž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αžαŸ’αž›αŸƒαžŠαžΎαž˜αž‚αžΊαž”αžšαž·αž˜αžΆαžŽαž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹ (AWS EBS)αŸ” αž€αžΆαžšαž›αž»αž” Kubernetes StatefulSet αž˜αž·αž“αž›αž»αž”αž—αžΆαž‚αž”αž“αŸ’αžαžšαž”αžŸαŸ‹αžœαžΆ (PVC - PersistentVolumeClaim) αž‘αŸαŸ” αž”αžšαž·αž˜αžΆαžŽ EBS αžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž”αŸ’αžšαžΎαž’αžΆαž…αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αžšαžΆαž”αŸ‹αžšαž™αžŠαž»αž›αŸ’αž›αžΆαžšαž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” Kubernetes Janitor αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαžŸαž˜αŸ’αž’αžΆαž PVC αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž…αŸ’αž”αžΆαž”αŸ‹αž“αŸαŸ‡αž“αžΉαž„αžŠαž€ PVCs αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž˜αŸ‰αžΌαžŒαž»αž› αž αžΎαž™αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αŸ„αž„αžŠαŸ„αž™ 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 kube-janitor.

αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž˜αž·αž“αž’αŸ’αžœαžΎαž€αžΆαžš

αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ‚αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αž›αž·αžαž€αž˜αŸ’αž˜αž˜αž½αž™αž…αŸ†αž“αž½αž“ αžŠαžΌαž…αž‡αžΆ Back office/admin tools αž€αŸαžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ‚αž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹ αž αžΎαž™αž’αžΆαž…αž”αž·αž‘αž”αžΆαž“αž–αŸαž‰αž˜αž½αž™αž™αž”αŸ‹αŸ”

Kubernetes Downscaler (kube-downscaler) αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž˜αž·αž“αž’αŸ’αžœαžΎαž€αžΆαžšαŸ” αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„ StatefulSets αž’αžΆαž…αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž‘αŸ…αžŸαžΌαž“αŸ’αž™αž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ” 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 αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž•αŸ’αžαŸαž€αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž’αž“αž’αžΆαž“αž˜αž½αž™αŸ” HorizontalPodAutoscaler (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 (kube-metrics-adapter) αž‚αžΊαž‡αžΆαž’αžΆαžŠαžΆαž”αŸ‹αž‘αŸαžšαžšαž„αŸ’αžœαžΆαžŸαŸ‹αž‘αžΌαž‘αŸ…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Kubernetes αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαž˜αžΌαž› αž“αž·αž„αž”αž˜αŸ’αžšαžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αž“αž·αž„αžαžΆαž„αž€αŸ’αžšαŸ…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž•αŸ’αžαŸαž€αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž•αžαŸ” αžœαžΆαž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαž„αŸ’αžœαžΆαžŸαŸ‹ Prometheus αž‡αž½αžš SQS αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αžŠαžΎαž˜αŸ’αž”αžΈαž–αž„αŸ’αžšαžΈαž€αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ…αž˜αŸ‰αŸ‚αžαŸ’αžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžŠαŸ‚αž›αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αž›αž½αž“αžœαžΆαžαžΆαž‡αžΆ JSON αž€αŸ’αž“αž»αž„ /metrics αž”αŸ’αžšαžΎαŸ–

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/memory αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžαžΆαž˜αžšαž™αŸˆ "αžŸαŸ†αžŽαžΎαž’αž“αž’αžΆαž“" αŸ” αž’αž“αž’αžΆαž“αžŸαŸŠαžΈαž—αžΈαž™αžΌαžαŸ’αžšαžΌαžœαž”αžΆαž“αžœαžΆαžŸαŸ‹αž‡αžΆαžŸαŸ’αž“αžΌαž›αž“αž·αž˜αŸ’αž˜αž·αž αž¬αž‡αžΆαž‘αžΌαž‘αŸ…αž“αŸ…αž€αŸ’αž“αž»αž„ "αž˜αžΈαž›αžΈαž‚αŸαžš" αž§αž‘αžΆαž αžšαžŽαŸ 500m αž”αž„αŸ’αž€αž”αŸ‹αž“αŸαž™ 50% vCPU αŸ” αž’αž“αž’αžΆαž“αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αžœαžΆαžŸαŸ‹αž‡αžΆαž”αŸƒ αž αžΎαž™αž”αž…αŸ’αž…αŸαž™αž‘αžΌαž‘αŸ…αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΌαž…αž‡αžΆ 500Mi αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆ 500 αž˜αŸαž€αžΆαž”αŸƒαŸ” αž’αž“αž’αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αžŸαž˜αžαŸ’αžαž—αžΆαž– "αž…αžΆαž€αŸ‹αžŸαŸ„" αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž€αž˜αŸ’αž˜αž€αžš αž˜αžΆαž“αž“αŸαž™αžαžΆ αž•αžαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ†αžŽαžΎαžŸαŸŠαžΈαž—αžΈαž™αžΌ 1000 ម αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž˜αžΆαž“ vCPU αž…αŸ†αž“αž½αž“ 4 αž“αžΉαž„αž‘αž»αž€αžαŸ‚ vCPU 3 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αžαž•αžαž•αžαžαž›αŸ” [1]

Slack (αž”αž˜αŸ’αžšαž»αž„αž›αžΎαžŸ) αž‚αžΊαž‡αžΆαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ† αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž•αžαžŠαŸ‚αž›αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† 2 GiB αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžΎαžαŸ‚ 200 MiB αž˜αžΆαž“αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† "αž›αžΎαžŸ" ~ 1,8 GiB αŸ” αž›αžΎαžŸαžαŸ’αžšαžΌαžœαž…αŸ†αžŽαžΆαž™αž”αŸ’αžšαžΆαž€αŸ‹αŸ” αž˜αž“αž»αžŸαŸ’αžŸαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž”αŸ‰αžΆαž“αŸ‹αžŸαŸ’αž˜αžΆαž“αž”αžΆαž“αžαžΆ 1 GiB αž“αŸƒαž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŠαŸ‚αž›αž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ„αŸ‡αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒ ~ $10 αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚αŸ” [2]

αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž’αž“αž’αžΆαž“ Kubernetes (kube-resource-report) αž”αž„αŸ’αž αžΆαž‰αž‘αž»αž“αž”αž˜αŸ’αžšαž»αž„αž›αžΎαžŸ αž αžΎαž™αž’αžΆαž…αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αžŸαž€αŸ’αžαžΆαž“αž»αž–αž›αž“αŸƒαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αŸ–

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž’αž“αž’αžΆαž“ Kubernetes αž”αž„αŸ’αž αžΆαž‰αž…αŸ†αž“αž½αž“αž›αžΎαžŸαžŠαŸ‚αž›αžŸαžšαž»αž”αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž’αž“αž’αžΆαž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αŸ” αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ HTML αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžšαžΌαž”αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž“αž’αžΆαž“αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž˜αžΎαž›αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ CPU/memory αž›αžΎαžŸαž˜αŸ‰αŸ„αž„αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžŸαŸ†αžŽαžΎαž’αž“αž’αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžαžΆαžšαžΆαž„ Grafana αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŸαŸŠαžΈαž—αžΈαž™αžΌ "αž’αž˜αŸ’αž˜αžαžΆ"αŸ– αž•αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαž·αž…αž‡αžΆαž„αžŸαŸ’αž“αžΌαž›αžŸαŸŠαžΈαž—αžΈαž™αžΌ 3 αžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ–

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ† CPU αž–αžΈ 3000m αž‘αŸ… ~400m αž”αž„αŸ’αž€αžΎαž“αž’αž“αž’αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αž„αŸ’αž€αŸ„αž˜αžαžΌαž…αž‡αžΆαž„αŸ”

"αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸŠαžΈαž—αžΈαž™αžΌαž‡αžΆαž˜αž’αŸ’αž™αž˜αž“αŸƒαžœαžαŸ’αžαž» EC2 αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž‡αž½αžšαž—αžΆαž‚αžšαž™αž˜αž½αž™αžαŸ’αž‘αž„αŸ‹" សរសេរ Corey Quinn. αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ EC2 αž€αžΆαžšαž”αŸ‰αžΆαž“αŸ‹αž”αŸ’αžšαž˜αžΆαžŽαž‘αŸ†αž αŸ†αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž’αžΆαž…αž‡αžΆαž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž˜αž·αž“αž›αŸ’αž’αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸ†αžŽαž½αžšαž’αž“αž’αžΆαž“ Kubernetes αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš YAML αž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž› αž αžΎαž™αž’αžΆαž…αž“αžΆαŸ†αž˜αž€αž“αžΌαžœαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αž™αŸ‰αžΆαž„αž…αŸ’αžšαžΎαž“αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž™αžΎαž„αž–αž·αžαž‡αžΆαž…αž„αŸ‹αž±αŸ’αž™αž˜αž“αž»αžŸαŸ’αžŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš YAML αž˜αŸ‚αž“αž‘αŸ? αž‘αŸ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž’αžΆαž…αž’αŸ’αžœαžΎαžœαžΆαž”αžΆαž“αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„! Kubernetes Vertical Pod Autoscaler (VPA) αž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸ„αŸ‡αŸ– αžŸαž˜αŸ’αžšαž”αžŸαŸ†αžŽαžΎαž’αž“αž’αžΆαž“ αž“αž·αž„αž§αž”αžŸαž‚αŸ’αž‚αžŠαŸ„αž™αž™αŸ„αž„αžαžΆαž˜αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŸαŸ†αžŽαžΎαžŸαŸŠαžΈαž—αžΈαž™αžΌ Prometheus (αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžŽαŸŒαžαŸ€αžœαžŸαŸ’αžαžΎαž„) αžŠαŸ‚αž›αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αžŠαŸ„αž™ VPA αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž€αž“αŸ’αž›αž„αž˜αž€αŸ–

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

Zalando αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ VPA αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαžαž»αž•αŸ’αžŸαŸ†αž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹αž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎ VPA αž•αž„αžŠαŸ‚αžšαŸ”

αž αŸ’αž‚αžΈαž›αž αŸ’αž‚αŸ„αž› αž–αžΈ Fairwind αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž VPA αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αžΈαž˜αž½αž™αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„ namespace αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž„αŸ’αž αžΆαž‰αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† VPA αž“αŸ…αž›αžΎαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžšαž”αžŸαŸ‹αžœαžΆαŸ” αžœαžΆαž’αžΆαž…αž‡αž½αž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ†αžŽαžαŸ‹αžŸαŸ†αžŽαžΎ CPU/memory αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ–

αžŸαž“αŸ’αžŸαŸ†αž›αžΎαž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€ Kubernetes αž“αŸ…αž›αžΎ AWS

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαžαžΌαž…αž˜αž½αž™ αž”αŸ’αžšαž€αžΆαžŸαž”αŸ’αž›αž€αŸ‹αž’αŸ†αž–αžΈ VPA αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2019 αž αžΎαž™αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡ αžŸαž αž‚αž˜αž“αŸαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™ CNCF αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž”αž‰αŸ’αž αžΆ VPA.

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ EC2 Spot Instances

αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎ AWS EC2 αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ Spot instances αž‡αžΆαžαŸ’αž“αžΆαŸ†αž„αž€αž˜αŸ’αž˜αž€αžš Kubernetes [3]. Spot instances αž’αžΆαž…β€‹αžšαž€β€‹αž”αžΆαž“β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž…αž»αŸ‡β€‹αžαž˜αŸ’αž›αŸƒβ€‹αžšαž αžΌαžβ€‹αžŠαž›αŸ‹ 90% αž”αžΎβ€‹αž’αŸ€αž”β€‹αž“αžΉαž„β€‹αžαž˜αŸ’αž›αŸƒβ€‹αžαžΆαž˜β€‹αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Kubernetes αž“αŸ…αž›αžΎ EC2 Spot αž‚αžΊαž‡αžΆαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸαž›αŸ’αž’αž˜αž½αž™αŸ– αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž”αŸ’αžšαž—αŸαž‘αžœαžαŸ’αžαž»αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αž–αžŸαŸ‹ αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžαŸ’αž“αžΆαŸ†αž„αž’αŸ†αž‡αžΆαž„αž˜αž»αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αž›αŸƒαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž¬αž‘αžΆαž”αž‡αžΆαž„ αž αžΎαž™αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αžΎαž“αž‘αžΎαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ„αž™αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžš Kubernetes αžŠαŸ‚αž›αž˜αžΆαž“αž•αŸ’αž‘αž»αž€αŸ”

αžαžΎαž’αŸ’αžœαžΎαžŠαžΌαž…αž˜αŸ’αžαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Kubernetes αž“αŸ…αž›αžΎ EC2 Spot? αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ– αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαžŠαžΌαž…αž‡αžΆ SpotInst (αž₯αž‘αžΌαžœαž αŸ…αžαžΆ "Spot" αž€αž»αŸ†αžŸαž½αžšαžαŸ’αž‰αž»αŸ†αž–αžΈαž˜αžΌαž›αž αŸαžαž») αž¬αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž“αŸ’αžαŸ‚αž˜ Spot AutoScalingGroup (ASG) αž‘αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αžŸαž„αŸ’αžαŸαž” CloudFormation αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ "capacity-optimized" Spot 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αŸ–

  • αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž…αž”αŸ‹ Spot αž‡αžΆβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αžŠαŸ„αž™β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αžαŸ’αž“αžΆαŸ†αž„β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžœαžαŸ’αžαž»β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αžˆαž”αŸ‹
  • Zalando αž”αŸ’αžšαžΎ សម αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αžΌαžœαž…αž„αŸ’αž€αŸ„αž˜αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžΆαž‘αž·αž—αžΆαž–αž€αŸ’αžšαž»αž˜αžαŸ’αž“αžΆαŸ†αž„
  • αžαŸ’αž“αžΆαŸ†αž„αž…αŸ†αžŽαž»αž… αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αžαŸ† αž‘αž‘αž½αž›αž™αž€ "αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡" αž“αŸƒαž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Spot

αžŸαž„αŸ’αžαŸαž”

αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αžšαž€αžƒαžΎαž‰αž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžšαž›αžΎαž–αž–αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αžŸαŸ’αžœαŸ‚αž„β€‹αžšαž€β€‹αž˜αžΆαžαž·αž€αžΆβ€‹αž—αžΆαž‚β€‹αž…αŸ’αžšαžΎαž“β€‹αž“αŸƒβ€‹αž’αžαŸ’αžαž”αž‘β€‹αž•αž„β€‹αžŠαŸ‚αžšβ€‹αž“αŸ… αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ… DevOps Gathering 2019 αž“αŸ…αž›αžΎ YouTube αž“αž·αž„αž€αŸ’αž“αž»αž„αžŸαŸ’αž›αžΆαž™.

αžαžΎαž’αŸ’αžœαžΈαž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž›αžΎαž–αž–αž€αž“αŸ…αž›αžΎ Kubernetes? αžŸαžΌαž˜αž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ… Twitter (@try_except_).

[1] αžαžΆαž˜αž–αž·αž vCPU αžαž·αž…αž‡αžΆαž„ 3 αž“αžΉαž„αž“αŸ…αžαŸ‚αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΆαž“ αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžšαž”αžŸαŸ‹αžαŸ’αž“αžΆαŸ†αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžŠαŸ„αž™αž’αž“αž’αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αŸ” Kubernetes αž”αŸ‚αž„αž…αŸ‚αž€αžšαžœαžΆαž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αžαŸ’αž“αžΆαŸ†αž„αžšαžΌαž”αžœαž“αŸ’αž αž“αž·αž„αž’αž“αž’αžΆαž“ "αž•αŸ’αžαž›αŸ‹" (αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ‚αž„αž…αŸ‚αž€αž”αžΆαž“αŸ”).

[2] αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž‚αžŽαž“αžΆαŸ– αž˜αž½αž™ m5.large instance αžŠαŸ‚αž›αž˜αžΆαž“αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† 8 GiB αž‚αžΊ ~ $84 αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚ (eu-central-1, On-Demand), i.e. αž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹ 1/8 node αž‚αžΊαž”αŸ’αžšαž αŸ‚αž› ~ $10/αžαŸ‚αŸ”

[3] αž˜αžΆαž“αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžš EC2 αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαžΌαž…αž‡αžΆαžœαžαŸ’αžαž»αžŠαŸ‚αž›αž”αžΆαž“αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž•αŸ‚αž“αž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αŸ”αž›αŸ”

αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹