เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ…เจคเฉ‡ เจ•เฉ‡เจกเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจ•เจฐเจจเจพ

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ…เจคเฉ‡ เจ•เฉ‡เจกเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจ•เจฐเจจเจพเจธเจฟเจฎเฉเจ†เจจเฉ‹เจธ เจฆเฉเจ†เจฐเจพ เจฌเฉˆเจฒเฉ‚เจจ เจฎเฉˆเจจ

เจ•เจฒเจพเจ‰เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจฎเจพเจชเจฏเฉ‹เจ—เจคเจพ เจ‡เฉฑเจ• เจฎเฉเฉฑเจ– เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจจเจพเจฒ, เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจ•เฉ‡เจฒ เจ•เจฐเจจเจพ เจ‰เจšเจฟเจค เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจงเจพเจ‰เจฃ เจœเจฟเฉฐเจจเจพ เจธเฉŒเจ–เจพ เจนเฉˆ เจœเจพเจ‚ ReplicaSet - เจชเจฐ เจ‡เจน เจ‡เฉฑเจ• เจฆเจธเจคเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจนเฉˆเฅค

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจ•เฉ‡เจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉˆเจจเจพเจคเฉ€ เจตเจฟเฉฑเจš เจชเฉŒเจก เจœเจพเจ‚ ReplicaSet) เจนเจฐเฉ€เจœเจผเจŸเจฒ เจชเฉ‹เจก เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจจเจฟเจฐเจงเจพเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ˜เฉ‹เจธเจผเจฃเจพเจคเจฎเจ• เจขเฉฐเจ— เจจเจพเจฒเฅค เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฒเจˆ เจกเจฟเจซเฉŒเจฒเจŸ เจฎเจพเจชเจฆเฉฐเจก CPU เจตเจฐเจคเฉ‹เจ‚ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ (เจธเจฐเฉ‹เจค เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ) เจนเฉˆ, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจ•เจธเจŸเจฎ เจ…เจคเฉ‡ เจฌเจพเจนเจฐเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ‡ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจจเฉ‚เฉฐ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฆเฉ€ เจŸเฉ€เจฎ Mail.ru เจคเฉ‹เจ‚ Kubernetes aaS เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจฌเจพเจนเจฐเฉ€ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจฌเจพเจฐเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจฆเจพ เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพเฅค เจ‡เจน เจฆเจฟเจ–เจพเจ‰เจฃ เจฒเจˆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจฒเฉ‡เจ–เจ• HTTP เจชเจนเฉเฉฐเจš เจฌเฉ‡เจจเจคเฉ€ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจ•เฉฑเจคเจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค

เจชเฉŒเจกเจพเจ‚ เจฆเฉ€ เจนเจฐเฉ€เจœเฉฑเจŸเจฒ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฆเฉ€ เจฌเจœเจพเจ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เจตเฉˆเจ‚เจŸ เจกเจฐเจพเจˆเจต เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— (เจ•เฉ‡เจˆเจกเฉ€เจ) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‡เฉฑเจ• เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ†เจชเจฐเฉ‡เจŸเจฐเฅค เจ‡เจน เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจตเจฐเจ•เจฒเฉ‹เจกเจพเจ‚ เจฒเจˆ เจธเจนเจฟเจœ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— (เจœเจผเฉ€เจฐเฉ‹ เจคเฉ‹เจ‚/เจœเจผเฉ€เจฐเฉ‹ เจธเจฎเฉ‡เจค) เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจนเจฐเฉ€เจœเจผเฉ‹เจ‚เจŸเจฒ เจชเฉ‹เจก เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจจเจพเจฒ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจนเฉˆเฅค เจ•เฉ‹เจก 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเฉˆ GitHub.

เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃเจ•เจพเจฐเฉ€

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ…เจคเฉ‡ เจ•เฉ‡เจกเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจ•เจฐเจจเจพ

เจšเจฟเฉฑเจคเจฐ เจ‡เจธ เจ—เฉฑเจฒ เจฆเจพ เจธเฉฐเจ–เฉ‡เจช เจตเจฐเจฃเจจ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ:

  1. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš HTTP เจนเจฟเฉฑเจŸ เจ•เจพเจ‰เจ‚เจŸ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค
  2. เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจจเฉ‚เฉฐ เจ‡เจนเจจเจพเจ‚ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ เจธเฉฐเจฐเจšเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค
  3. เจ•เฉ‡เจกเจพ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจ•เฉ‡เจฒเจฐ เจจเฉ‚เฉฐ HTTP เจนเจฟเฉฑเจŸเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

เจนเฉเจฃ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเจฐเฉ‡เจ• เจคเฉฑเจค เจฌเจพเจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉฑเจธเจพเจ‚เจ—เจพเฅค

เจ•เฉ‡เจกเจพ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ‡เฉฑเจ• เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจธเจฟเจธเจŸเจฎ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ…เจคเฉ‡ เจšเฉ‡เจคเจพเจตเจจเฉ€ เจŸเฉ‚เจฒเจ•เจฟเฉฑเจŸ เจนเฉˆ, เจนเจฟเฉฑเจธเจพ เจ•เจฒเจพเจ‰เจก เจจเฉ‡เจŸเจฟเจต เจ•เฉฐเจชเจฟ CompเจŸเจฟเฉฐเจ— เจซเจพเจ‰เจ‚เจกเฉ‡เจธเจผเจจ. เจตเฉฑเจ–-เจตเฉฑเจ– เจธเจฐเฉ‹เจคเจพเจ‚ เจคเฉ‹เจ‚ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจ‡เจ•เฉฑเจคเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจพเจ‚ เจฒเฉœเฉ€ เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจตเจœเฉ‹เจ‚ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจกเฉ‡เจŸเจพ เจฆเฉ€ เจ•เจฒเจชเจจเจพ เจ•เจฐเจจ เจฒเจˆ เจคเฉเจธเฉ€เจ‚ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ—เฉเจฐเจพเจซเจจเจพ เจœเจพเจ‚ เจนเฉ‹เจฐ เจตเจฟเจœเจผเฉ‚เจ…เจฒเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจŸเฉ‚เจฒ เจœเฉ‹ เจ•เจฟ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ API เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจ•เฉ‡เจกเจพ เจธเจ•เฉ‡เจฒเจฐ เจฆเฉ€ เจงเจพเจฐเจจเจพ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆ - เจ‡เจน เจ•เฉ‡เจกเจพ เจ…เจคเฉ‡ เจฌเจพเจนเจฐเฉ€ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจ‡เฉฑเจ• เจชเฉเจฒ เจฆเจพ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจธเจ•เฉ‡เจฒเจฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเจฐเฉ‡เจ• เจŸเจพเจฐเจ—เฉ‡เจŸ เจธเจฟเจธเจŸเจฎ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจ•เฉฑเจขเจฆเจพ เจนเฉˆเฅค เจ•เฉ‡เจกเจพ เจซเจฟเจฐ เจ‡เจนเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจธเจ•เฉ‡เจฒเจฐ เจ•เจˆ เจกเจพเจŸเจพ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เจพเจซเจ•เจพ, เจฐเฉ‡เจกเจฟเจธ, เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธเฅค เจญเจพเจต, KEDA เจจเฉ‚เฉฐ เจฎเจพเจชเจฆเฉฐเจก เจตเจœเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจŸเฉˆเจธเจŸ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ

เจ—เฉ‹เจฒเฉฐเจ— เจŸเฉˆเจธเจŸ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ HTTP เจฆเฉเจ†เจฐเจพ เจชเจนเฉเฉฐเจš เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจฆเฉ‹ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจซเฉฐเจ•เจธเจผเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆ:

  1. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจฐเฉ‚เจฎเฉˆเจ‚เจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ http_requests เจฎเฉˆเจŸเฉเจฐเจฟเจ• เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ Prometheus Go เจ•เจฒเจพเจ‡เฉฐเจŸ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจนเจฟเฉฑเจŸ เจ—เจฟเจฃเจคเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ…เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ‚ เจœเจฟเฉฑเจฅเฉ‡ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจ‰เจชเจฒเจฌเจง เจนเจจ URI 'เจคเฉ‡ เจธเจฅเจฟเจค เจนเฉˆ /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. เจ‡เฉฑเจ• เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจœเจตเจพเจฌ เจตเจฟเฉฑเจš GET เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เฉเฉฐเจœเฉ€ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ (access_count) Redis เจตเจฟเฉฑเจš. เจ‡เจน เจ‡เฉฑเจ• HTTP เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ€ เจœเจพเจ‚เจš เจตเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฎเฉ€เจŸเฉเจฐเจฟเจ• เจฎเฉเฉฑเจฒ เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ access_count Redis เจตเจฟเฉฑเจš.
    func main() {
           http.Handle("/metrics", promhttp.Handler())
           http.HandleFunc("/test", func(w http.ResponseWriter, r 
    *http.Request) {
               defer httpRequestsCounter.Inc()
               count, err := client.Incr(redisCounterName).Result()
               if err != nil {
                   fmt.Println("Unable to increment redis counter", err)
                   os.Exit(1)
               }
               resp := "Accessed on " + time.Now().String() + "nAccess count " + strconv.Itoa(int(count))
               w.Write([]byte(resp))
           })
           http.ListenAndServe(":8080", nil)
       }
    

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉเจ†เจฐเจพ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ Deployment. เจ‡เฉฑเจ• เจธเฉ‡เจตเจพ เจตเฉ€ เจฌเจฃเจพเจˆ เจ—เจˆ เจนเฉˆ ClusterIP, เจ‡เจน เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจฅเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจˆ เจคเฉˆเจจเจพเจคเฉ€ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ.

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจฐเจตเจฐ

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเจจ:

  • ConfigMap - Prometheus เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจฒเจˆ;
  • Deployment - เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจจเฉ‚เฉฐ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจ เจฒเจˆ;
  • ClusterIP - UI เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฒเจˆ เจธเฉ‡เจตเจพ;
  • ClusterRole, ClusterRoleBinding ะธ ServiceAccount - เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ (เจ†เจŸเฉ‹-เจกเจฟเจธเจ•เจตเจฐเฉ€) เจตเจฟเฉฑเจš เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจธเจตเฉˆ-เจ–เฉ‹เจœ เจฒเจˆเฅค

เจ‡เฉฑเจฅเฉ‡ Prometheus เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจชเฉเจฐเจ—เจŸ.

เจ•เฉ‡เจกเจพ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจ•เฉ‡เจฒเจก เจ†เจฌเจœเฉˆเจ•เจŸ

เจธเจ•เฉ‡เจฒเจฐ เจ•เฉ‡เจกเจพ เจ…เจคเฉ‡ เจฌเจพเจนเจฐเฉ€ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจ‡เฉฑเจ• เจชเฉเจฒ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ เจคเฉ‹เจ‚ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค ScaledObject เจ‡เฉฑเจ• เจ•เจธเจŸเจฎ เจธเจฐเฉ‹เจค เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ เจ‡เจตเฉˆเจ‚เจŸ เจธเจฐเฉ‹เจค เจจเจพเจฒ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจธเจฎเจ•เจพเจฒเฉ€ เจ•เจฐเจจ เจฒเจˆ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธเฅค

ScaledObject เจ‡เจธ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจคเฉ€ เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจœเจพเจฃเจ•เจพเจฐเฉ€, เจ‡เจตเฉˆเจ‚เจŸ เจธเจฐเฉ‹เจค เจฎเฉˆเจŸเจพเจกเฉ‡เจŸเจพ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ•เจจเฉˆเจ•เจธเจผเจจ เจญเฉ‡เจฆ, เจ•เจคเจพเจฐ เจฆเจพ เจจเจพเจฎ), เจชเฉ‹เจฒเจฟเฉฐเจ— เจ…เฉฐเจคเจฐเจพเจฒ, เจฐเจฟเจ•เจตเจฐเฉ€ เจชเฉ€เจฐเฉ€เจ…เจก, เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจกเฉ‡เจŸเจพ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจ…เจจเฉเจธเจพเจฐเฉ€ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจธเจฐเฉ‹เจค (HPA เจชเจฐเจฟเจญเจพเจธเจผเจพ) เจตเจฟเฉฑเจš เจจเจคเฉ€เจœเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ ScaledObject เจฎเจฟเจŸเจพ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจจเฉเจธเจพเจฐเฉ€ HPA เจชเจฐเจฟเจญเจพเจธเจผเจพ เจธเจพเจซเจผ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจ‡เฉฑเจฅเฉ‡ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจนเฉˆ ScaledObject เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจน เจ‡เฉฑเจ• เจธเจ•เฉ‡เจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ Prometheus:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
 name: prometheus-scaledobject
 namespace: default
 labels:
   deploymentName: go-prom-app
spec:
 scaleTargetRef:
   deploymentName: go-prom-app
 pollingInterval: 15
 cooldownPeriod:  30
 minReplicaCount: 1
 maxReplicaCount: 10
 triggers:
 - type: prometheus
   metadata:
     serverAddress: 
http://prometheus-service.default.svc.cluster.local:9090
     metricName: access_frequency
     threshold: '3'
     query: sum(rate(http_requests[2m]))

เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจจเฉเจ•เจคเจฟเจ†เจ‚ 'เจคเฉ‡ เจ—เฉŒเจฐ เจ•เจฐเฉ‹:

  1. เจ‰เจน เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆ Deployment เจจเจพเจฎ เจจเจพเจฒ go-prom-app.
  2. เจŸเจฐเจฟเฉฑเจ—เจฐ เจ•เจฟเจธเจฎ - Prometheus. เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจฐเจตเจฐ เจชเจคเฉ‡ เจฆเจพ เจœเจผเจฟเจ•เจฐ เจฎเฉ€เจŸเฉเจฐเจฟเจ• เจจเจพเจฎ, เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจ…เจคเฉ‡ เจจเจพเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ PromQL เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ›, เจœเจฟเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค PromQL เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› - sum(rate(http_requests[2m])).
  3. เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ pollingInterval, เจ•เฉ‡เจกเจพ เจนเจฐ เจชเฉฐเจฆเจฐเจพเจ‚ เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจŸเฉ€เจšเฉ‡ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ‡เฉฑเจ• เจ…เจงเฉ€เจจ (minReplicaCount), เจ…เจคเฉ‡ เจชเฉŒเจกเจพเจ‚ เจฆเฉ€ เจ…เจงเจฟเจ•เจคเจฎ เจธเฉฐเจ–เจฟเจ† เจตเฉฑเจง เจจเจนเฉ€เจ‚ เจนเฉˆ maxReplicaCount (เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš - เจฆเจธ).

เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจ minReplicaCount เจœเจผเฉ€เจฐเฉ‹ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ•เฉ‡เจกเจพ เจœเจผเฉ€เจฐเฉ‹-เจŸเฉ‚-เจตเจจ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจธเจฐเจ—เจฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ เจ…เฉฑเจ—เฉ‡ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฒเจˆ เจเจšเจชเฉ€เจ เจฆเจพ เจชเจฐเจฆเจพเจซเจพเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‰เจฒเจŸเจพ เจ•เฉเจฐเจฎ เจตเฉ€ เจธเฉฐเจญเจต เจนเฉˆ, เจฏเจพเจจเฉ€ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจœเจผเฉ€เจฐเฉ‹ เจคเฉฑเจ• เจธเจ•เฉ‡เจฒ เจ•เจฐเจจเจพเฅค เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจœเจผเฉ€เจฐเฉ‹ เจฆเฉ€ เจšเฉ‹เจฃ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ‡เฉฑเจ• HTTP เจธเฉ‡เจตเจพ เจนเฉˆ เจจเจพ เจ•เจฟ เจ‡เฉฑเจ• เจ†เจจ-เจกเจฟเจฎเจพเจ‚เจก เจธเจฟเจธเจŸเจฎเฅค

เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจฆเจพ เจœเจพเจฆเฉ‚

เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจŸเจฐเจฟเฉฑเจ—เจฐ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, PromQL เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› sum(rate (http_requests [2m])) เจชเจฟเจ›เจฒเฉ‡ เจฆเฉ‹ เจฎเจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจฎเจพเจชเฉ€ เจ—เจˆ เจธเจฎเฉเฉฑเจšเฉ€ HTTP เจฌเฉ‡เจจเจคเฉ€ เจฆเจฐ (เจชเฉเจฐเจคเฉ€ เจธเจ•เจฟเฉฐเจŸ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚) เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจฎเฉเฉฑเจฒ เจคเจฟเฉฐเจจ เจนเฉˆ, เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจ‡เฉฑเจ• เจนเฉ‹เจตเฉ‡เจ—เจพ sum(rate (http_requests [2m])) เจคเจฟเฉฐเจจ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸเฅค เจœเฉ‡เจ•เจฐ เจฎเฉเฉฑเจฒ เจตเจงเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจนเจฐ เจตเจพเจฐ เจ‡เฉฑเจ• เจตเจพเจงเฉ‚ เจ‰เจช เจœเฉ‹เฉœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ sum(rate (http_requests [2m])) เจคเจฟเฉฐเจจ เจจเจพเจฒ เจตเจงเจฆเจพ เจนเฉˆ. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจฎเฉเฉฑเจฒ 12 เจคเฉ‹เจ‚ 14 เจคเฉฑเจ• เจนเฉˆ, เจคเจพเจ‚ เจชเฉŒเจกเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจšเจพเจฐ เจนเฉˆเฅค

เจนเฉเจฃ เจ‡เจธ เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ!

เจชเฉเจฐเฉ€-เจธเฉˆเจŸเจฟเฉฐเจ—

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจฟเจค เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ kubectl. เจ‡เจน เจ‰เจฆเจพเจนเจฐเจจ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ minikube, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‰เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจนเฉˆ เจ…เจ—เจตเจพเจˆ.

เจฎเฉˆเจ• 'เจคเฉ‡ เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹:

curl -Lo minikube 
https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 
&& chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/

เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹ kubectlเจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆเฅค

เจฎเฉˆเจ• 'เจคเฉ‡ เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹:

curl -LO 
"https://storage.googleapis.com/kubernetes-release/release/$(curl -s
https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

เจ•เฉ‡เจกเจพ เจธเจฅเจพเจชเจจเจพ

เจคเฉเจธเฉ€เจ‚ เจ•เฉ‡เจกเจพ เจจเฉ‚เฉฐ เจ•เจˆ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจคเฉˆเจจเจพเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจน เจธเฉ‚เจšเฉ€เจฌเฉฑเจง เจนเจจ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ. เจฎเฉˆเจ‚ เจฎเฉ‹เจจเฉ‹เจฒเจฟเจฅเจฟเจ• YAML เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจฐเจฟเจนเจพ/เจฐเจนเฉ€ เจนเจพเจ‚:

kubectl apply -f
https://raw.githubusercontent.com/kedacore/keda/master/deploy/KedaScaleController.yaml

KEDA เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเจพเจฎ-เจธเจฅเจพเจจ เจตเจฟเฉฑเจš เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ keda. เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจนเฉเจ•เจฎ:

kubectl get pods -n keda

เจ•เฉ‡เจกเจพ เจ†เจชเจฐเฉ‡เจŸเจฐ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจฃ เจ…เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ Running State. เจ…เจคเฉ‡ เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เฉ‹.

เจนเฉˆเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฐเฉˆเจกเจฟเจธ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ

เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเฉˆเจฒเจฎ เจ‡เฉฐเจธเจŸเจพเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ เจฒเฉ€เจกเจฐเจธเจผเจฟเจช. เจฎเฉˆเจ• 'เจคเฉ‡ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจ•เจฎเจพเจ‚เจก:

brew install kubernetes-helm
helm init --history-max 200

helm init เจธเจฅเจพเจจเจ• เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฐเจธเจŸเจพเจฒ เจตเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ Tiller เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐเฅค

kubectl get pods -n kube-system | grep tiller

เจฐเจจเจฟเฉฐเจ— เจธเจŸเฉ‡เจŸ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹เจฃ เจฒเจˆ เจŸเจฟเจฒเจฐ เจชเฉŒเจก เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹เฅค

เจ…เจจเฉเจตเจพเจฆเจ• เจฆเจพ เจจเฉ‹เจŸ: เจฒเฉ‡เจ–เจ• เจนเฉˆเจฒเจฎ@2 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจฒเจˆ เจŸเจฟเจฒเจฐ เจธเจฐเจตเจฐ เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจนเฉเจฃ เจนเฉˆเจฒเจฎ@3 เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจธเจฐเจตเจฐ เจญเจพเจ— เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจนเฉˆเจฒเจฎ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, Redis เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ•เจฎเจพเจ‚เจก เจ•เจพเจซเจผเฉ€ เจนเฉˆ:

helm install --name redis-server --set cluster.enabled=false --set 
usePassword=false stable/redis

เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเฉ‹ เจ•เจฟ Redis เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ:

kubectl get pods/redis-server-master-0

Redis เจฆเฉ‡ เจฐเจพเจœ เจตเจฟเฉฑเจš เจœเจพเจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ Running.

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเฉˆเจจเจพเจคเฉ€

เจคเฉˆเจจเจพเจคเฉ€ เจนเฉเจ•เจฎ:

kubectl apply -f go-app.yaml

//output
deployment.apps/go-prom-app created
service/go-prom-app-service created

เจœเจพเจ‚เจš เจ•เจฐเฉ‹ เจ•เจฟ เจธเจญ เจ•เฉเจ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ:

kubectl get pods -l=app=go-prom-app

Redis เจฆเฉ‡ เจฐเจพเจœ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹เจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ Running.

เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจฐเจตเจฐ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฐเจคเจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฒเจˆ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเจฐเจตเจฟเจธ เจกเจฟเจธเจ•เจตเจฐเฉ€. เจ‡เจน เจธเฉ‡เจตเจพ เจฒเฉ‡เจฌเจฒ เจฆเฉ‡ เจ…เจงเจพเจฐ 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเฉŒเจกเจพเจ‚ เจฆเฉ€ เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจ–เฉ‹เจœ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

kubernetes_sd_configs:
   - role: service
   relabel_configs:
   - source_labels: [__meta_kubernetes_service_label_run]
     regex: go-prom-app-service
     action: keep

เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฒเจˆ:

kubectl apply -f prometheus.yaml

//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created

เจœเจพเจ‚เจš เจ•เจฐเฉ‹ เจ•เจฟ เจธเจญ เจ•เฉเจ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ:

kubectl get pods -l=app=prometheus-server

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฆเฉ‡ เจฐเจพเจœ เจตเจฟเฉฑเจš เจœเจพเจฃ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹ Running.

เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ kubectl port-forward 'เจคเฉ‡ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฏเฉ‚เจœเจผเจฐ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ (เจœเจพเจ‚ API เจธเจฐเจตเจฐ) เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ http://localhost:9090.

kubectl port-forward service/prometheus-service 9090

เจ•เฉ‡เจกเจพ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจนเฉเจ•เจฎ ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

เจ•เฉ‡เจกเจพ เจ†เจชเจฐเฉ‡เจŸเจฐ เจฒเฉŒเจ—เจธ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‹:

KEDA_POD_NAME=$(kubectl get pods -n keda 
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda

เจจเจคเฉ€เจœเจพ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with 
namespace default and name keda-hpa-go-prom-app"

เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจœเจพเจ‚เจš เจ•เจฐเฉ‹เฅค เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจšเฉฑเจฒ เจฐเจนเฉ€ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ minReplicaCount เจฌเจฐเจพเจฌเจฐ 1:

kubectl get pods -l=app=go-prom-app

เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเฉ‹ เจ•เจฟ HPA เจธเจฐเฉ‹เจค เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€:

kubectl get hpa

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจ เจ…เจœเจฟเจนเจพ เจฆเฉ‡เจ–เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ:

NAME                   REFERENCE                TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   0/3 (avg)   1         10        1          45s

เจธเจฟเจนเจค เจœเจพเจ‚เจš: เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเจนเฉเฉฐเจš

เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ REST เจเจ‚เจกเจชเฉเจ†เจ‡เฉฐเจŸ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ, เจšเจฒเจพเจ“:

kubectl port-forward service/go-prom-app-service 8080

เจคเฉเจธเฉ€เจ‚ เจนเฉเจฃ เจชเจคเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเฉ€ Go เจเจช เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ http://localhost:8080. เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ•เจฎเจพเจ‚เจก เจšเจฒเจพเจ“:

curl http://localhost:8080/test

เจจเจคเฉ€เจœเจพ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC 
m=+406004.817901246
Access count 1

เจ‡เจธ เจฎเฉŒเจ•เฉ‡ 'เจคเฉ‡ เจฐเฉˆเจกเจฟเจธ เจจเฉ‚เฉฐ เจตเฉ€ เจšเฉˆเฉฑเจ• เจ•เจฐเฉ‹เฅค เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ–เฉ‹เจ—เฉ‡ เจ•เจฟ เจ•เฉเฉฐเจœเฉ€ access_count 1 เจคเฉฑเจ• เจตเจงเจพเจ‡เจ† เจ—เจฟเจ†:

kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"

เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ“ เจ•เจฟ เจฎเฉ€เจŸเฉเจฐเจฟเจ• เจฎเฉเฉฑเจฒ เจนเฉˆ http_requests เจธเจฎเจพเจจ:

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1

เจฒเฉ‹เจก เจฐเจšเจจเจพ

เจ…เจธเฉ€เจ‚ เจ‡เจธเจคเฉ‡เจฎเจพเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ Hey โ€” เจฒเฉ‹เจก เจชเฉˆเจฆเจพ เจ•เจฐเจจ เจฒเจˆ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ:

curl -o hey https://storage.googleapis.com/hey-release/hey_darwin_amd64 
&& chmod a+x hey

เจฒเจˆ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจตเฉ€ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจฒเฉ€เจจเจ•เจธ เจœ Windows เจจเฉ‚เฉฐ.

เจ‡เจธเจจเฉ‚เฉฐ เจšเจฒเจพเจ“:

./hey http://localhost:8080/test

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ‰เจชเจฏเฉ‹เจ—เจคเจพ 200 เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเจฆเฉ€ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ Prometheus เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ‡ เจจเจพเจฒ เจจเจพเจฒ Redis เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธเจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201

เจ…เจธเจฒ เจฎเฉˆเจŸเฉเจฐเจฟเจ• เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเฉ‹ (PromQL เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉเจ†เจฐเจพ เจตเจพเจชเจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ†):

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'
//output
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1571734214.228,"1.686057971014493"]}]}}

เจ‡เจธ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจ…เจธเจฒ เจจเจคเฉ€เจœเจพ เจนเฉˆ 1,686057971014493 เจ…เจคเฉ‡ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ value. เจ‡เจน เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจกเฉ‡ เจฆเฉเจ†เจฐเจพ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก 3 เจนเฉˆเฅค

เจนเฉ‹เจฐ เจฒเฉ‹เจก!

เจจเจตเฉ‡เจ‚ เจŸเจฐเจฎเฉ€เจจเจฒ เจตเจฟเฉฑเจš, เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเฉŒเจกเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเฉ‹:

kubectl get pods -l=app=go-prom-app -w

เจ†เจ‰ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเฉ‹เจก เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚:

./hey -n 2000 http://localhost:8080/test

เจ•เฉเจ เจธเจฎเฉ‡เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจธเฉ€เจ‚ HPA เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจธเจ•เฉ‡เจฒ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ…เจคเฉ‡ เจจเจตเฉ‡เจ‚ เจชเฉŒเจก เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฆเฉ‡เจ–เฉ‹เจ—เฉ‡เฅค เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ†เจชเจฃเฉ‡ HPA เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‹:

kubectl get hpa
NAME                   REFERENCE                TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
keda-hpa-go-prom-app   Deployment/go-prom-app   1830m/3 (avg)   1         10        6          4m22s

เจœเฉ‡เจ•เจฐ เจฒเฉ‹เจก เจ…เจธเฉฐเจ—เจค เจนเฉˆ, เจคเจพเจ‚ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจ‰เจธ เจฌเจฟเฉฐเจฆเฉ‚ เจคเฉฑเจ• เจ˜เจŸเจพ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจœเจฟเฉฑเจฅเฉ‡ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจชเฉŒเจก เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ…เจธเจฒ เจฎเฉˆเจŸเฉเจฐเจฟเจ• เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ (เจชเฉเจฐเฉ‹เจฎเจ•เจฟเจฏเฉ‚เจเจฒ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉเจ†เจฐเจพ เจตเจพเจชเจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ†), เจคเจพเจ‚ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹:

curl -g 
'http://localhost:9090/api/v1/query?query=sum(rate(http_requests[2m]))'

เจธเจซเจพเจˆ

//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server

เจธเจฟเฉฑเจŸเจพ

เจ•เฉ‡เจกเจพ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจพเจนเจฐเฉ€ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ (เจœเจผเฉ€เจฐเฉ‹ เจคเฉ‹เจ‚/เจธเจฟเจซเจผเจฐ เจคเฉฑเจ•) เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจ•เฉ‡เจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡, เจฐเฉˆเจกเจฟเจธ เจตเจฟเฉฑเจš เจ•เจคเจพเจฐ เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ, เจ•เจพเจซเจ•เจพ เจตเจฟเจธเจผเฉ‡ เจตเจฟเฉฑเจš เจ–เจชเจคเจ•เจพเจฐ เจฒเฉ‡เจŸเฉˆเจ‚เจธเฉ€เฅค

เจ•เฉ‡เจกเจพ เจ‡เฉฑเจ• เจฌเจพเจนเจฐเฉ€ เจธเจฐเฉ‹เจค เจจเจพเจฒ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจธเจฐเจตเจฐ เจฆเฉเจ†เจฐเจพ เจนเจฐเฉ€เจœเจผเฉ‹เจ‚เจŸเจฒ เจชเฉ‹เจก เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เจพเจฎเจฏเจพเจฌเฉ€เจ†เจ‚!

เจนเฉ‹เจฐ เจ•เฉ€ เจชเฉœเฉเจนเจจเจพ เจนเฉˆ:

  1. เจ‰เจคเจชเจพเจฆเจจ เจฆเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจ…เจคเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธ เจ…เจคเฉ‡ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธ.
  2. เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ 90+ เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจŸเฉ‚เจฒ: เจคเฉˆเจจเจพเจคเฉ€, เจชเฉเจฐเจฌเฉฐเจงเจจ, เจจเจฟเจ—เจฐเจพเจจเฉ€, เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจ.
  3. เจŸเฉˆเจฒเฉ€เจ—เฉเจฐเจพเจฎ เจตเจฟเฉฑเจš เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจ†เจฒเฉ‡-เจฆเฉเจ†เจฒเฉ‡ เจธเจพเจกเจพ เจšเฉˆเจจเจฒ.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹