AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช•เซ‹เชฐเซเชธเชจเซ€ เชถเชฐเซ‚เช†เชคเชจเซ€ เชชเซ‚เชฐเซเชตเชธเช‚เชงเซเชฏเชพเช เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ "เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ".

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชšเชฎเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชšเชค เช•เชฐเชตเซ€? เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชเช• เชœ เชฏเซ‹เช—เซเชฏ เช‰เช•เซ‡เชฒ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช† เชฒเซ‡เช– เช˜เชฃเชพ เชธเชพเชงเชจเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเชพ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‡ เชตเชงเซ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฒเชพเช‰เชก เช•เชฎเซเชชเซเชฏเซเชŸเชฟเช‚เช— เช–เชฐเซเชšเชจเซ‡ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชฎเซ‡เช‚ เช† เชฒเซ‡เช– AWS เชฎเชพเชŸเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฐเชพเช–เซ€เชจเซ‡ เชฒเช–เซเชฏเซ‹ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เช…เชจเซเชฏ เช•เซเชฒเชพเช‰เชก เชชเซเชฐเชฆเชพเชคเชพเช“เชจเซ‡ (เชฒเช—เชญเช—) เชฌเชฐเชพเชฌเชฐ เช เชœ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เชฅเชถเซ‡. เชนเซเช‚ เชงเชพเชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เช•เซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐ(เช“) เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡ (เช•เซเชฒเชธเซเชŸเชฐ-เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐ). เชธเช‚เชธเชพเชงเชจเซ‹ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เชœเชฎเชพเชตเชŸเชจเซ‡ เช˜เชŸเชพเชกเชตเชพเชฅเซ€ เชคเชฎเชพเชฐเชพ เชชเซˆเชธเชพเชจเซ€ เชฌเชšเชค เชฎเชพเชคเซเชฐ เชคเซเชฏเชพเชฐเซ‡ เชœ เชฅเชถเซ‡ เชœเซ‹ เชคเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฐเซเช•เชฐ เชจเซ‹เชกเซเชธ (EC2 เชฆเชพเช–เชฒเชพเช“) เชจเชพ เช•เชพเชซเชฒเชพเชจเซ‡ เชชเชฃ เช˜เชŸเชพเชกเซ‡ เช›เซ‡.

เช† เชฒเซ‡เช– เช†เชตเชฐเซ€ เชฒเซ‡เชถเซ‡:

เชจ เชตเชชเชฐเชพเชฏเซ‡เชฒ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ€ เชธเชซเชพเชˆ

เชเชกเชชเซ€ เช—เชคเชฟเชถเซ€เชฒ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช เชฎเชนเชพเชจ เช›เซ‡. เช…เชฎเชจเซ‡ เชŸเซ‡เช• เชธเช‚เชธเซเชฅเชพเช“ เชœเซ‹เชˆเช เช›เซ‡ เชเชกเชชเซ€. เชเชกเชชเซ€ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ‹ เช…เชฐเซเชฅ เชตเชงเซ PR เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ, เชชเซ‚เชฐเซเชตเชพเชตเชฒเซ‹เช•เชจ เชตเชพเชคเชพเชตเชฐเชฃ, เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชชเซเชธ เช…เชจเซ‡ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เชชเชฃ เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชฌเชงเซเช‚ เชœ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡. เชŸเซ‡เชธเซเชŸ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเซเชธเชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เชธเชพเชซ เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช•เซ‹เชจเซ€ เชชเชพเชธเซ‡ เช›เซ‡? เช…เช เชตเชพเชกเชฟเชฏเชพ เชœเซ‚เชจเชพ เชชเซเชฐเชฏเซ‹เช—เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพ เชตเชฟเชถเซ‡ เชญเซ‚เชฒเซ€ เชœเชตเซเช‚ เชธเชฐเชณ เช›เซ‡. เช…เชฎเซ‡ เชฌเช‚เชง เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเชพ เช›เซ€เช เชคเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เช•เซเชฒเชพเช‰เชก เชฌเชฟเชฒ เชตเชงเชถเซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

(เชนเซ‡เชจเชฟเช‚เช— เชœเซ‡เช•เซ‹เชฌเซเชธ:
เชเซ€เชเชพ:
(เช…เชตเชคเชฐเชฃ) เช•เซ‹เชฐเซ€ เช•เซเชตเชฟเชจ:
เชฎเชพเชจเซเชฏเชคเชพ: เชคเชฎเชพเชฐเซเช‚ 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

เชจเซ€เชšเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ 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 เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เชธเซเชตเชšเซเช› เชฐเชพเช–เชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เช•เซเชฒเชพเช‰เชก เช•เชฎเซเชชเซเชฏเซเชŸเชฟเช‚เช— เช–เชฐเซเชšเชจเซ‡ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เชตเชงเชคเชพ เช…เชŸเช•เชพเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชœเชฎเชพเชตเชŸ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเซ‚เชšเชจเชพเช“ เชฎเชพเชŸเซ‡, เช…เชจเซเชธเชฐเซ‹ README เช•เซเชฌเซ‡-เชฆเชฐเชตเชพเชจ.

เชฌเชฟเชจ-เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เช•เชฒเชพเช•เซ‹ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช˜เชŸเชพเชกเซ‹

เชŸเซ‡เชธเซเชŸ เช…เชจเซ‡ เชธเซเชŸเซ‡เชœเซ€เช‚เช— เชธเชฟเชธเซเชŸเชฎเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฎเช•เชพเชœเชจเชพ เช•เชฒเชพเช•เซ‹ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชœ เช“เชชเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เช•เซ‡เชŸเชฒเซ€เช• เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ, เชœเซ‡เชฎ เช•เซ‡ เชฌเซ‡เช• เช“เชซเชฟเชธ/เชเชกเชฎเชฟเชจ เชŸเซ‚เชฒเซเชธเชจเซ‡ เชชเชฃ เชฎเชพเชคเซเชฐ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช‰เชชเชฒเชฌเซเชงเชคเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชฐเชพเชคเซ‹เชฐเชพเชค เช…เช•เซเชทเชฎ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเชพเช‰เชจเชธเซเช•เซ‡เชฒเชฐ (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

เช…เชนเซ€เช‚ เชธเชชเซเชคเชพเชนเชจเชพ เช…เช‚เชคเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชตเชฐเซเช•เชฐ เชจเซ‹เชกเซเชธเชจเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เช—เซเชฐเชพเชซ เช›เซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

~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 เช•เซเชฏเซเชฌ-เชกเชพเช‰เชจเชธเซเช•เซ‡เชฒเชฐ, เชœเซ‹ เชคเชฎเซ‡ เชœเชฎเชพเชตเชŸ เชธเซ‚เชšเชจเชพเช“ เช…เชจเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เชตเชฟเช•เชฒเซเชชเซ‹เชฎเชพเช‚ เชฐเชธ เชงเชฐเชพเชตเซ‹ เช›เซ‹.

เช†เชกเซ€ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

เช˜เชฃเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ/เชธเซ‡เชตเชพเช“ เช—เชคเชฟเชถเซ€เชฒ เชฒเซ‹เชกเชฟเช‚เช— เชชเซ‡เชŸเชฐเซเชจ เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซ‡ เช›เซ‡: เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชคเซ‡เชฎเชจเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชจเชฟเชทเซเช•เซเชฐเชฟเชฏ เชนเซ‹เชฏ เช›เซ‡, เช…เชจเซ‡ เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชคเซ‡เช“ เชธเช‚เชชเซ‚เชฐเซเชฃ เช•เซเชทเชฎเชคเชพ เชชเชฐ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡. เชฎเชนเชคเซเชคเชฎ เชชเซ€เช• เชฒเซ‹เชกเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‹เชกเซเชธเชจเชพ เช•เชพเชฏเชฎเซ€ เช•เชพเชซเชฒเชพเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเซเช‚ เช†เชฐเซเชฅเชฟเช• เชจเชฅเซ€. Kubernetes เชธเชฎเช—เซเชฐ เชธเช‚เชธเชพเชงเชจเชฎเชพเช‚ เช†เชกเซ€ เช“เชŸเซ‹-เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เชนเซ‹เชฐเชฟเชเซ‹เชจเซเชŸเชฒ เชชเซ‹เชก เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐ (HPA). CPU เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช˜เชฃเซ€เชตเชพเชฐ เชธเซเช•เซ‡เชฒเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชธเชพเชฐเซ‹ เชธเซ‚เชšเช• เช›เซ‡:

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

เชธเซเชŸเซ‡เชŸเชฒเซ‡เชธ เชธเซ‡เชตเชพเช“ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเชšเชชเซ€เช เชธเชพเชฅเซ‡ เช†เชกเซ€ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ‡ เช—เซ‹เช เชตเชตเซ€ เช เชกเชฟเชซเซ‹เชฒเซเชŸ เช•เซเชฐเชฟเชฏเชพเช“เชฎเชพเช‚เชจเซ€ เชเช• เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช. Spotify เชชเชพเชธเซ‡ เชคเซ‡เชฎเชจเชพ เช…เชจเซเชญเชต เช…เชจเซ‡ HPA เชฎเชพเชŸเซ‡เชจเซ€ เชญเชฒเชพเชฎเชฃเซ‹ เชธเชพเชฅเซ‡ เชชเซเชฐเชธเซเชคเซเชคเชฟ เช›เซ‡: เชคเชฎเชพเชฐเซ€ เชœเชฎเชพเชตเชŸเชจเซ‡ เชฎเชพเชชเซ‹, เชคเชฎเชพเชฐเชพ เชตเซ‰เชฒเซ‡เชŸเชจเซ‡ เชจเชนเซ€เช‚.

เชธเช‚เชธเชพเชงเชจ เช“เชตเชฐเชฌเซเช•เชฟเช‚เช— เช˜เชŸเชพเชกเซ‹

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชตเชฐเซเช•เชฒเซ‹เชก "เชธเช‚เชธเชพเชงเชจ เชตเชฟเชจเช‚เชคเซ€เช“" เชฆเซเชตเชพเชฐเชพ เชคเซ‡เชฎเชจเซ€ CPU/เชฎเซ‡เชฎเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡. CPU เชธเช‚เชธเชพเชงเชจเซ‹ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เช•เซ‹เชฐเซ‹เชฎเชพเช‚ เช…เชฅเชตเชพ เชตเชงเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ "เชฎเชฟเชฒเซ€เช•เซ‹เชฐ" เชฎเชพเช‚ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ 500m 50% vCPU เชธเซ‚เชšเชตเซ‡ เช›เซ‡. เชฎเซ‡เชฎเชฐเซ€ เชธเช‚เชธเชพเชงเชจเซ‹ เชฌเชพเช‡เชŸเซเชธเชฎเชพเช‚ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชชเซเชฐเชคเซเชฏเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ 500Mi, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เชฅเชพเชฏ เช›เซ‡ 500 เชฎเซ‡เช—เชพเชฌเชพเช‡เชŸเซเชธ. เชธเช‚เชธเชพเชงเชจ เชตเชฟเชจเช‚เชคเซ€เช“ เชตเชฐเซเช•เชฐ เชจเซ‹เชกเซเชธ เชชเชฐ "เชฒเซ‹เช•" เช•เซเชทเชฎเชคเชพ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡ 1000 vCPU เชธเชพเชฅเซ‡ เชจเซ‹เชก เชชเชฐ 4m CPU เชตเชฟเชจเช‚เชคเซ€ เชธเชพเชฅเซ‡เชจเซ‹ เชชเซ‹เชก เช…เชจเซเชฏ เชชเซ‹เชกเซเชธ เชฎเชพเชŸเซ‡ เชฎเชพเชคเซเชฐ 3 vCPUs เช‰เชชเชฒเชฌเซเชง เชฐเชนเซ‡เชถเซ‡. [1]

เชธเซเชฒเซ‡เช• (เชตเชงเชพเชฐเซ‡ เช…เชจเชพเชฎเชค) เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡เชฒ เชธเช‚เชธเชพเชงเชจเซ‹ เช…เชจเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เช‰เชชเชฏเซ‹เช— เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซ‹เชก เช•เซ‡ เชœเซ‡ 2 GiB เชฎเซ‡เชฎเชฐเซ€เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡ เช›เซ‡ เชชเชฐเช‚เชคเซ เชฎเชพเชคเซเชฐ 200 MiB เชตเชพเชชเชฐเซ‡ เช›เซ‡ เชคเซ‡เชฎเชพเช‚ ~1,8 GiB "เชตเชงเชพเชฐเชพเชจเซ€" เชฎเซ‡เชฎเชฐเซ€ เชนเซ‹เชฏ เช›เซ‡. เชตเชงเซ เชชเชกเชคเชพ เชชเซˆเชธเชพ เช–เชฐเซเชš เชฅเชพเชฏ เช›เซ‡. เช•เซ‹เชˆ เช…เช‚เชฆเชพเชœเซ‡ เช…เช‚เชฆเชพเชœ เชฒเช—เชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เซ‡ 1 GiB เชฐเซ€เชกเชจเซเชกเชจเซเชŸ เชฎเซ‡เชฎเชฐเซ€เชจเซ‹ เช–เชฐเซเชš เชฆเชฐ เชฎเชนเชฟเชจเซ‡ ~$10 เช›เซ‡. [2]

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฐเชฟเชธเซ‹เชฐเซเชธ เชฐเชฟเชชเซ‹เชฐเซเชŸ (kube-resource-report) เช…เชงเชฟเช• เช…เชจเชพเชฎเชค เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชจเซ‡ เชฌเชšเชคเชจเซ€ เชธเช‚เชญเชพเชตเชจเชพ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฐเชฟเชธเซ‹เชฐเซเชธ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เช…เชจเซ‡ เช•เชฎเชพเชจเซเชก เชฆเซเชตเชพเชฐเชพ เชเช•เชคเซเชฐ เช•เชฐเซ‡เชฒ เชตเชงเชพเชฐเชพเชจเซ‡ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เช† เชคเชฎเชจเซ‡ เชเชตเชพ เชธเซเชฅเชพเชจเซ‹ เชถเซ‹เชงเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชธเช‚เชธเชพเชงเชจเชจเซ€ เชฎเชพเช‚เช— เช˜เชŸเชพเชกเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒ HTML เชฐเชฟเชชเซ‹เชฐเซเชŸ เชฎเชพเชคเซเชฐ เชธเช‚เชธเชพเชงเชจ เชตเชชเชฐเชพเชถเชจเซ‹ เชธเซเชจเซ‡เชชเชถเซ‹เชŸ เชชเซ‚เชฐเซ‹ เชชเชพเชกเซ‡ เช›เซ‡. เชชเชฐเซเชฏเชพเชชเซเชค เชธเช‚เชธเชพเชงเชจ เชตเชฟเชจเช‚เชคเซ€เช“ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชธเชฎเชฏ เชœเชคเชพเช‚ CPU/เชฎเซ‡เชฎเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชœเซ‹เชตเซ‹ เชœเซ‹เชˆเช. "เชธเชพเชฎเชพเชจเซเชฏ" CPU-เชญเชพเชฐเซ‡ เชธเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เช…เชนเซ€เช‚ เชเช• Grafana เชšเชพเชฐเซเชŸ เช›เซ‡: เชฌเชงเชพ เชชเซ‹เชกเซเชธ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‡เชฒ 3 CPU เช•เซ‹เชฐเซ‹ เช•เชฐเชคเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช“เช›เชพ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

CPU เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ 3000m เชฅเซ€ ~400m เชธเซเชงเซ€ เช˜เชŸเชพเชกเชตเชพเชฅเซ€ เช…เชจเซเชฏ เชตเชฐเซเช•เชฒเซ‹เชก เชฎเชพเชŸเซ‡ เชธเช‚เชธเชพเชงเชจเซ‹ เชฎเซเช•เซเชค เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เชจเชพเชจเซเช‚ เชฅเชตเชพ เชฆเซ‡ เช›เซ‡.

"EC2 เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เชธเชฐเซ‡เชฐเชพเชถ CPU เช‰เชชเชฏเซ‹เช— เช˜เชฃเซ€เชตเชพเชฐ เชธเชฟเช‚เช—เชฒ-เชกเชฟเชœเชฟเชŸ เชŸเช•เชพเชตเชพเชฐเซ€เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เชฐเชนเซ‡ เช›เซ‡," เช•เซ‹เชฐเซ€ เช•เซเชตเชฟเชจ เชฒเช–เซ‡ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ EC2 เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช•เชฆเชจเซ‹ เช…เช‚เชฆเชพเชœ เช•เชพเชขเชตเซ‹ เช เช–เชฐเชพเชฌ เชจเชฟเชฐเซเชฃเชฏ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡YAML เชซเชพเช‡เชฒเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฐเชฟเชธเซ‹เชฐเซเชธ เช•เซเชตเซ‡เชฐเซ€เช เชฌเชฆเชฒเชตเชพเชจเซเช‚ เชธเชฐเชณ เช›เซ‡ เช…เชจเซ‡ เชฎเซ‹เชŸเซ€ เชฌเชšเชค เชฒเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชชเชฐเช‚เชคเซ เชถเซเช‚ เช†เชชเชฃเซ‡ เช–เชฐเซ‡เช–เชฐ เช‡เชšเซเช›เซ€เช เช›เซ€เช เช•เซ‡ เชฒเซ‹เช•เซ‹ YAML เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏเซ‹ เชฌเชฆเชฒเซ‡? เชจเชพ, เชฎเชถเซ€เชจเซ‹ เชคเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡! เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชตเชฐเซเชŸเชฟเช•เชฒ เชชเซ‹เชก เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐ (VPA) เชคเซ‡ เชœ เช•เชฐเซ‡ เช›เซ‡: เชตเชฐเซเช•เชฒเซ‹เชก เช…เชจเซเชธเชพเชฐ เชธเช‚เชธเชพเชงเชจ เชตเชฟเชจเช‚เชคเซ€เช“ เช…เชจเซ‡ เช…เชตเชฐเซ‹เชงเซ‹เชจเซ‡ เช…เชชเชจเชพเชตเซ‡ เช›เซ‡. VPA เชฆเซเชตเชพเชฐเชพ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เช…เชจเซเช•เซ‚เชฒเชฟเชค เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ CPU เชตเชฟเชจเช‚เชคเซ€เช“ (เชชเชพเชคเชณเซ€ เชตเชพเชฆเชณเซ€ เชฐเซ‡เช–เชพ) เชจเซ‹ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช†เชฒเซ‡เช– เช›เซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

Zalando เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เช•เซเชฒเชธเซเชŸเชฐเซ‹เชฎเชพเช‚ VPA เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เช˜เชŸเช•เซ‹ เชฎเชพเชŸเซ‡. เชฌเชฟเชจ-เชจเชฟเชฐเซเชฃเชพเชฏเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชชเชฃ VPA เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช—เซ‹เชฒเซเชกเชฟเชฒocksเช•เซเชธ เชซเซเชฐเซ‹เชฎ เชซเซ‡เชฐเชตเชฟเชจเซเชก เช เชเช• เชธเชพเชงเชจ เช›เซ‡ เชœเซ‡ เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชฆเชฐเซ‡เช• เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ VPA เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเชพ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชชเชฐ VPA เชญเชฒเชพเชฎเชฃ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ CPU/เชฎเซ‡เชฎเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡:

AWS เชชเชฐ Kubernetes เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชชเชฐ เชฌเชšเชค เช•เชฐเซ‹

เชฎเซ‡เช‚ เชเช• เชจเชพเชจเซเช‚ เชฒเช–เซเชฏเซเช‚ VPA เชตเชฟเชถเซ‡ เชฌเซเชฒเซ‹เช—เชชเซ‹เชธเซเชŸ 2019 เชฎเชพเช‚, เช…เชจเซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชฎเชพเช‚ CNCF เช…เช‚เชคเชฟเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชฎเซเชฆเชพเชฏเซ‡ VPA เชฎเซเชฆเซเชฆเชพเชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ€.

EC2 เชธเซเชชเซ‹เชŸ เช‡เชจเซเชธเซเชŸเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡

เช›เซ‡เชฒเซเชฒเซเช‚ เชชเชฐเช‚เชคเซ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซเช‚ เชจเชนเซ€เช‚, AWS EC2 เช–เชฐเซเชšเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชตเชฐเซเช•เชฐ เชจเซ‹เชกเซเชธ เชคเชฐเซ€เช•เซ‡ เชธเซเชชเซ‹เชŸ เช‡เชจเซเชธเซเชŸเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช˜เชŸเชพเชกเซ€ เชถเช•เชพเชฏ เช›เซ‡. [3]. เช‘เชจ-เชกเชฟเชฎเชพเชจเซเชก เช•เชฟเช‚เชฎเชคเซ‹เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚ 90% เชธเซเชงเซ€เชจเชพ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ เชชเชฐ เชธเซเชชเซ‹เชŸ เช‡เชจเซเชธเซเชŸเชจเซเชธ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. EC2 เชธเซเชชเซ‹เชŸ เชชเชฐ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชšเชฒเชพเชตเชตเซเช‚ เช เชเช• เชธเชพเชฐเซเช‚ เชธเช‚เชฏเซ‹เชœเชจ เช›เซ‡: เชคเชฎเชพเชฐเซ‡ เช‰เชšเซเชš เช‰เชชเชฒเชฌเซเชงเชคเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชœเซเชฆเชพ เชœเซเชฆเชพ เชฆเชพเช–เชฒเชพ เชชเซเชฐเช•เชพเชฐเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡ เชคเชฎเซ‡ เชธเชฎเชพเชจ เช…เชฅเชตเชพ เช“เช›เซ€ เช•เชฟเช‚เชฎเชคเซ‡ เชฎเซ‹เชŸเซ‹ เชจเซ‹เชก เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชจเซ‡ เชตเชงเซ‡เชฒเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชจเซเชŸเซ‡เชจเชฐเชพเช‡เชเซเชก เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชตเชฐเซเช•เชฒเซ‹เชก เชฆเซเชตเชพเชฐเชพ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

EC2 เชธเซเชชเซ‹เชŸ เชชเชฐ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเซเช‚? เชคเซเชฏเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เช›เซ‡: 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"

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ เชธเซเชชเซ‹เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชจเซ‹เช‚เชงเซ‹:

  • เชคเชฎเชพเชฐเซ‡ เชธเซเชชเซ‹เชŸ เชŸเชฐเซเชฎเชฟเชจเซ‡เชถเชจเชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เช‡เชจเซเชธเซเชŸเชจเซเชธ เชฌเช‚เชง เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชจเซ‹เชกเชจเซ‡ เชฎเชฐเซเชœ เช•เชฐเซ€เชจเซ‡
  • Zalando เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช•เชพเช‚เชŸเซ‹ เชจเซ‹เชก เชชเซ‚เชฒ เชชเซเชฐเชพเชฅเชฎเชฟเช•เชคเชพเช“ เชธเชพเชฅเซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เช•เซเชฒเชธเซเชŸเชฐ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช—
  • เชธเซเชชเซ‹เชŸ เชจเซ‹เชกเซเชธ เชฆเชฌเชพเชฃ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชธเซเชชเซ‹เชŸเชฎเชพเช‚ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฐเซเช•เชฒเซ‹เชกเชจเซ€ "เชจเซ‹เช‚เชงเชฃเซ€" เชธเซเชตเซ€เช•เชพเชฐเซ‹

เชธเชพเชฐเชพเช‚เชถ

เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฒเชพเช‰เชก เชฌเชฟเชฒเชจเซ‡ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เชชเซเชฐเชธเซเชคเซเชค เช•เซ‡เชŸเชฒเชพเช• เชธเชพเชงเชจเซ‹ เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชพเช—เชถเซ‡. เชคเชฎเซ‡ เชฒเซ‡เช–เชจเซ€ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ เช…เชนเซ€เช‚ เชชเชฃ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชฏเซเชŸเซเชฏเซเชฌ เชชเชฐ เช…เชจเซ‡ เชธเซเชฒเชพเช‡เชกเซเชธเชฎเชพเช‚ DevOps เช—เซ‡เชงเชฐเซ€เช‚เช— 2019 เชชเชฐ เชฎเชพเชฐเซ€ เชšเชฐเซเชšเชพ.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช•เซเชฒเชพเช‰เชก เช–เชฐเซเชš เชฌเชšเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ€ เชถเซเชฐเซ‡เชทเซเช  เชชเชฆเซเชงเชคเชฟเช“ เชถเซเช‚ เช›เซ‡? เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชฎเชจเซ‡ เชœเชฃเชพเชตเซ‹ Twitter (@try_except_).

[1] เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เช†เชฐเช•เซเชทเชฟเชค เชธเชฟเชธเซเชŸเชฎ เชธเช‚เชธเชพเชงเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชจเซ‹เชกเชจเชพ เชฅเซเชฐเซเชชเซเชŸเชฎเชพเช‚ เช˜เชŸเชพเชกเซ‹ เชฅเชตเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ 3 เช•เชฐเชคเชพเช‚ เช“เช›เชพ vCPUs เช‰เชชเชฏเซ‹เช—เซ€ เชฐเชนเซ‡เชถเซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชญเซŒเชคเชฟเช• เชจเซ‹เชก เช•เซเชทเชฎเชคเชพ เช…เชจเซ‡ "เชœเซ‹เช—เชตเชพเชˆ เช•เชฐเซ‡เชฒ" เชธเช‚เชธเชพเชงเชจเซ‹ เชตเชšเซเชšเซ‡ เชคเชซเชพเชตเชค เช•เชฐเซ‡ เช›เซ‡ (เชจเซ‹เชก เชซเชพเชณเชตเชฃเซ€เชฏเซ‹เช—เซเชฏ).

[2] เช—เชฃเชคเชฐเซ€เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ: 5 GiB เชฎเซ‡เชฎเชฐเซ€ เชธเชพเชฅเซ‡เชจเซ‹ เชเช• m8.เชฎเซ‹เชŸเซ‹ เชฆเชพเช–เชฒเซ‹ เชฆเชฐ เชฎเชนเชฟเชจเซ‡ ~$84 โ€‹โ€‹เช›เซ‡ (eu-central-1, On-Demand), เชเชŸเชฒเซ‡ เช•เซ‡. 1/8 เชจเซ‹เชกเชจเซ‡ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เช†เชถเชฐเซ‡ ~$10/เชฎเชนเชฟเชจเซ‡ เช›เซ‡.

[3] เชคเชฎเชพเชฐเชพ EC2 เชฌเชฟเชฒเชจเซ‡ เช˜เชŸเชพเชกเชตเชพเชจเซ€ เช˜เชฃเซ€ เชตเชงเซ เชฐเซ€เชคเซ‹ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช†เชฐเช•เซเชทเชฟเชค เชฆเชพเช–เชฒเชพเช“, เชฌเชšเชค เชฏเซ‹เชœเชจเชพ, เชตเช—เซ‡เชฐเซ‡. - เชนเซเช‚ เชคเซ‡ เชตเชฟเชทเชฏเซ‹เชจเซ‡ เช…เชนเซ€เช‚ เช•เชตเชฐ เช•เชฐเซ€เชถ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฐเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชคเซ‡เชฎเชจเซ‡ เชœเซ‹เชตเซเช‚ เชœเซ‹เชˆเช!

เช•เซ‹เชฐเซเชธ เชตเชฟเชถเซ‡ เชตเชงเซ เชœเชพเชฃเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹