เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เช…เชจเซ‡ KEDA เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช•เชฐเชตเซเช‚

เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เช…เชจเซ‡ KEDA เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช•เชฐเชตเซเช‚เชธเชฟเชฎเซเช†เชจเซ‹เชธ เชฆเซเชตเชพเชฐเชพ เชฌเชฒเซ‚เชจ เชฎเซ‡เชจ

เช•เซเชฒเชพเช‰เชก เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชฎเชพเชชเชจเซ€เชฏเชคเชพ เช เชฎเซเช–เซเชฏ เช†เชตเชถเซเชฏเช•เชคเชพ เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช•เชฐเชตเซเช‚ เช เชฏเซ‹เช—เซเชฏ เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชตเชงเชพเชฐเชตเชพ เชœเซ‡เชŸเชฒเซเช‚ เชธเชฐเชณ เช›เซ‡ เช…เชฅเชตเชพ ReplicaSet - เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡ เชœเชฎเชพเชตเชŸเชฎเชพเช‚ เชชเซ‹เชกเซเชธ เช…เชฅเชตเชพ ReplicaSet) เชนเซ‹เชฐเซ€เชเซ‹เชจเซเชŸเชฒ เชชเซ‹เชก เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช˜เซ‹เชทเชฃเชพเชคเซเชฎเช• เชฐเซ€เชคเซ‡. เช“เชŸเซ‹เชฎเซ‡เชŸเชฟเช• เชธเซเช•เซ‡เชฒเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸ เชฎเชพเชชเชฆเช‚เชก CPU เชตเชชเชฐเชพเชถ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ (เชธเช‚เชธเชพเชงเชจ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ) เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เช•เชธเซเชŸเชฎ เช…เชจเซ‡ เชฌเชพเชนเซเชฏ เชฐเซ€เชคเซ‡ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡เชฒ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชŸเซ€เชฎ Mail.ru เชฎเชพเช‚เชฅเซ€ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชเชเชธ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชพเชนเซเชฏ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡เชจเชพ เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช•เชฐเซเชฏเซ‹. เชฌเชงเซเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชฒเซ‡เช–เช• HTTP เชเช•เซเชธเซ‡เชธ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชชเซ‹เชกเซเชธเชจเชพ เช†เชกเชพ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ‡ เชฌเชฆเชฒเซ‡, เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช‡เชตเซ‡เชจเซเชŸ เชกเซเชฐเชฟเชตเชจ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— (KEDA) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช“เชชเชฐเซ‡เชŸเชฐ เช›เซ‡. เชคเซ‡ เช˜เชŸเชจเชพ-เชธเช‚เชšเชพเชฒเชฟเชค เชตเชฐเซเช•เชฒเซ‹เชก เชฎเชพเชŸเซ‡ เชธเซ€เชฎเชฒเซ‡เชธ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— (เชถเซ‚เชจเซเชฏเชฅเซ€/เชถเซ‚เชจเซเชฏ เชธเชนเชฟเชค) เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชนเซ‹เชฐเชฟเชเซ‹เชจเซเชŸเชฒ เชชเซ‹เชก เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐ เชธเชพเชฅเซ‡ เชฎเซ‚เชณ เชฐเซ€เชคเซ‡ เชธเช‚เช•เชฒเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช•เซ‹เชก GitHub.

เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชเชพเช‚เช–เซ€

เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เช…เชจเซ‡ KEDA เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— เช•เชฐเชตเซเช‚

เช†เช•เซƒเชคเชฟ เชฌเชงเซเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซเช‚ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชตเชฐเซเชฃเชจ เชฌเชคเชพเชตเซ‡ เช›เซ‡:

  1. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ HTTP เชนเชฟเชŸ เช•เชพเช‰เชจเซเชŸ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.
  2. เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เช† เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡.
  3. KEDA เชฎเชพเช‚ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชธเซเช•เซ‡เชฒเชฐ HTTP เชนเชฟเชŸเชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเชพ เช†เชงเชพเชฐเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡.

เชนเชตเซ‡ เชนเซเช‚ เชคเชฎเชจเซ‡ เชฆเชฐเซ‡เช• เชคเชคเซเชต เชตเชฟเชถเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชœเชฃเชพเชตเซ€เชถ.

เช•เซ‡เชกเชพ เช…เชจเซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ

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

KEDA เชธเซเช•เซ‡เชฒเชฐเชจเชพ เช–เซเชฏเชพเชฒเชจเซ‡ เชธเชฎเชฐเซเชฅเชจ เช†เชชเซ‡ เช›เซ‡ - เชคเซ‡ KEDA เช…เชจเซ‡ เชฌเชพเชนเซเชฏ เชธเชฟเชธเซเชŸเชฎ เชตเชšเซเชšเซ‡เชจเชพ เชธเซ‡เชคเซ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชธเซเช•เซ‡เชฒเชฐ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฆเชฐเซ‡เช• เชฒเช•เซเชทเซเชฏ เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เช•เชพเชขเซ‡ เช›เซ‡. เชชเช›เซ€ KEDA เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเซเชตเชšเชพเชฒเชฟเชค เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ‡ เช›เซ‡.

เชธเซเช•เซ‡เชฒเชฐเซเชธ เชฌเชนเซเชตเชฟเชง เชกเซ‡เชŸเชพ เชธเซเชคเซเชฐเซ‹เชคเซ‹เชจเซ‡ เชธเชฎเชฐเซเชฅเชจ เช†เชชเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เชพเชซเช•เชพ, เชฐเซ‡เชกเชฟเชธ, เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ. เชเชŸเชฒเซ‡ เช•เซ‡, เชฎเชพเชชเชฆเช‚เชก เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชœเชฎเชพเชตเชŸเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ 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) เชฐเซ‡เชกเชฟเชธเชฎเชพเช‚. HTTP เชนเซ‡เชจเซเชกเชฒเชฐเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เช† เชเช• เชธเชฐเชณ เชฐเซ€เชค เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชชเชฃ เชคเชชเชพเชธเซ‹. เชฎเซ‡เชŸเซเชฐเชฟเช• เชฎเซ‚เชฒเซเชฏ เชฎเซ‚เชฒเซเชฏ เชœเซ‡เชŸเชฒเซเช‚ เชœ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช access_count เชฐเซ‡เชกเชฟเชธเชฎเชพเช‚.
    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 - เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฐเซ‚เชชเชฐเซ‡เช–เชพเชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡;
  • Deployment โ€” เช•เซเชฌเชฐเชจเซ‡เชŸเชธ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธเชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡;
  • ClusterIP โ€” UI เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธเชจเซ€ เชเช•เซเชธเซ‡เชธ เชฎเชพเชŸเซ‡ เชธเซ‡เชตเชพ;
  • ClusterRole, ClusterRoleBinding ะธ ServiceAccount - เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ (เช“เชŸเซ‹-เชกเชฟเชธเซเช•เชตเชฐเซ€) เชฎเชพเช‚ เชธเซ‡เชตเชพเช“เชจเซ€ เชธเซเชตเชคเชƒ-เชถเซ‹เชง เชฎเชพเชŸเซ‡.

เช…เชนเซ€เช‚ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ.

KEDA เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชธเซเช•เซ‡เชฒเซเชก เช‘เชฌเซเชœเซ‡เช•เซเชŸ

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

เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช—เชจเซ€ เช…เช‚เชฆเชฐเชจเซ‹ เชœเชพเชฆเซ

เชฅเซเชฐเซ‡เชถเซ‹เชฒเซเชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชœเชฎเชพเชตเชŸเชจเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เชŸเซเชฐเชฟเช—เชฐ เชคเชฐเซ€เช•เซ‡ เชฅเชพเชฏ เช›เซ‡. เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, PromQL เช•เซเชตเซ‡เชฐเซ€ sum(rate (http_requests [2m])) เช›เซ‡เชฒเซเชฒเชพ เชฌเซ‡ เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชเช•เช‚เชฆเชฐ HTTP เชตเชฟเชจเช‚เชคเซ€ เชฆเชฐ (เชธเซ‡เช•เชจเซเชก เชฆเซ€เช  เชตเชฟเชจเช‚เชคเซ€เช“) เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

เชฅเซเชฐเซ‡เชถเซ‹เชฒเซเชก เชฎเซ‚เชฒเซเชฏ เชคเซเชฐเชฃ เชนเซ‹เชตเชพเชฅเซ€, เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชฎเซ‚เชฒเซเชฏ เชœเซเชฏเชพเชฐเซ‡ เชจเซ€เชšเซ‡ เชเช• เชนเชถเซ‡ sum(rate (http_requests [2m])) เชคเซเชฐเชฃ เช•เชฐเชคเชพ เช“เช›เชพ. เชœเซ‹ เชฎเซ‚เชฒเซเชฏ เชตเชงเซ‡ เช›เซ‡, เชคเซ‹ เชฆเชฐ เชตเช–เชคเซ‡ เชตเชงเชพเชฐเชพเชจเซ‹ เชชเซ‡เชŸเชพ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ sum(rate (http_requests [2m])) เชคเซเชฐเชฃเชฅเซ€ เชตเชงเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เชฎเซ‚เชฒเซเชฏ 12 เชฅเซ€ 14 เช›เซ‡, เชคเซ‹ เชถเซ€เช‚เช—เซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชšเชพเชฐ เช›เซ‡.

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช!

เชชเซเชฐเซ€เชธเซ‡เชŸเซ€เช‚เช—

เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เช…เชจเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ kubectl. เช† เช‰เชฆเชพเชนเชฐเชฃ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ minikube, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เช•เซ‹เชˆเชชเชฃ เช…เชจเซเชฏ เชฒเชˆ เชถเช•เซ‹ เช›เซ‹. เชคเซเชฏเชพเช‚ เชเช• เช•เซเชฒเชธเซเชŸเชฐ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช›เซ‡ เชจเซ‡เชคเซƒเชคเซเชต.

Mac เชชเชฐ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

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เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡.

Mac เชชเชฐ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

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

KEDA เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ

เชคเชฎเซ‡ KEDA เชจเซ‡ เช˜เชฃเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชคเซ‡เช“ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เช›เซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ. เชนเซเช‚ เชฎเซ‹เชจเซ‹เชฒเชฟเชฅเชฟเช• YAML เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚:

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

KEDA เช…เชจเซ‡ เชคเซ‡เชจเชพ เช˜เชŸเช•เซ‹ เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ เช›เซ‡ keda. เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถ:

kubectl get pods -n keda

KEDA เช“เชชเชฐเซ‡เชŸเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฐเชพเชน เชœเซเช“ เช…เชจเซ‡ เชชเชฐ เชœเชพเช“ Running State. เช…เชจเซ‡ เชคเซ‡ เชชเช›เซ€, เชšเชพเชฒเซ เชฐเชพเช–เซ‹.

เชนเซ‡เชฒเซเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฐเซ‡เชกเชฟเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชนเซ‡เชฒเซเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ เชจเชฅเซ€, เชคเซ‹ เช†เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เชจเซ‡เชคเซƒเชคเซเชต. Mac เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ‹ เช†เชฆเซ‡เชถ:

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

helm init เชธเซเชฅเชพเชจเชฟเช• เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เชชเชฃ เช•เชฐเซ‡ เช›เซ‡ Tiller เช•เซเชฌเชฐเชจเซ‡เชŸเซ€เชธ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚.

kubectl get pods -n kube-system | grep tiller

เชŸเชฟเชฒเชฐ เชชเซ‹เชก เชฐเชจเชฟเช‚เช— เชธเซเชŸเซ‡เชŸเชฎเชพเช‚ เชฆเชพเช–เชฒ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฐเชพเชน เชœเซเช“.

เช…เชจเซเชตเชพเชฆเช•เชจเซ€ เชจเซ‹เช‚เชง: เชฒเซ‡เช–เช• เชนเซ‡เชฒเซเชฎ@2 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชŸเชฟเชฒเชฐ เชธเชฐเซเชตเชฐ เช˜เชŸเช• เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชนเชตเซ‡ Helm@3 เชธเช‚เชฌเช‚เชงเชฟเชค เช›เซ‡, เชคเซ‡เชจเซ‡ เชธเชฐเซเชตเชฐ เชญเชพเช—เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชนเซ‡เชฒเซเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฐเซ‡เชกเชฟเชธ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เช†เชฆเซ‡เชถ เชชเซ‚เชฐเชคเซ‹ เช›เซ‡:

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

เชšเช•เชพเชธเซ‹ เช•เซ‡ เชฐเซ‡เชกเชฟเชธ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชถเชฐเซ‚ เชฅเชฏเซเช‚ เช›เซ‡:

kubectl get pods/redis-server-master-0

เชฐเซ‡เชกเชฟเชธ เชฐเชพเชœเซเชฏเชฎเชพเช‚ เชœเชพเชฏ เชคเซ‡เชจเซ€ เชฐเชพเชน เชœเซเช“ 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

KEDA เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฟเช‚เช— เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชœเชฎเชพเชตเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถ ScaledObject:

kubectl apply -f keda-prometheus-scaledobject.yaml

KEDA เช“เชชเชฐเซ‡เชŸเชฐ เชฒเซ‹เช— เชคเชชเชพเชธเซ‹:

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

เชฒเซ‹เชก เชธเชฐเซเชœเชจ

เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ เช…เชฐเซ‡ - เชฒเซ‹เชก เชชเซ‡เชฆเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ:

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

เชคเชฎเซ‡ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชชเชฃ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ Linux เช…เชฅเชตเชพ เชตเชฟเชจเซเชกเซ‹เช.

เชคเซ‡เชจเซ‡ เชšเชฒเชพเชตเซ‹:

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

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ 200 เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡. เชคเชฎเซ‡ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชคเซ‡เชฎเชœ เชฐเซ‡เชกเชฟเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชจเซ‡ เชšเช•เชพเชธเซ€ เชถเช•เซ‹ เช›เซ‹.

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

เชตเชพเชธเซเชคเชตเชฟเช• เชฎเซ‡เชŸเซเชฐเชฟเช•เชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชฎเชพเชจเซเชฏ เช•เชฐเซ‹ (เชชเซเชฐเซ‹เชฎเช•เซเชฏเซเชเชฒ เช•เซเชตเซ‡เชฐเซ€ เชฆเซเชตเชพเชฐเชพ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ):

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

เชจเชฟเชทเซเช•เชฐเซเชท

KEDA เชคเชฎเชจเซ‡ เชฌเชพเชนเซเชฏ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเชพ เชกเซ‡เชŸเชพเชจเชพ เช†เชงเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‡ (เชถเซ‚เชจเซเชฏเชฅเซ€/เชถเซ‚เชจเซเชฏ เชธเซเชงเซ€) เช†เชชเชฎเซ‡เชณเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชชเชฐ เช†เชงเชพเชฐเชฟเชค, เชฐเซ‡เชกเชฟเชธเชฎเชพเช‚ เช•เชคเชพเชฐเชจเซ€ เชฒเช‚เชฌเชพเชˆ, เช•เชพเชซเช•เชพ เชตเชฟเชทเชฏเชฎเชพเช‚ เช—เซเชฐเชพเชนเช• เชฒเซ‡เชŸเชจเซเชธเซ€.

KEDA เชฌเชพเชนเซเชฏ เชธเซเชคเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เชธเช‚เช•เชฒเชจ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เชนเซ‹เชฐเซ€เชเซ‹เชจเซเชŸเชฒ เชชเซ‹เชก เช“เชŸเซ‹เชธเซเช•เซ‡เชฒเชฐเชจเซ‡ เชคเซ‡เชจเชพ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชชเชฃ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.

เชธเชซเชณเชคเชพ!

เชฌเซ€เชœเซเช‚ เชถเซเช‚ เชตเชพเช‚เชšเชตเซเช‚:

  1. เช‰เชคเซเชชเชพเชฆเชจ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐ เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชชเชฆเซเชงเชคเชฟเช“ เช…เชจเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฏเชพเชธเซ‹.
  2. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ 90+ เช‰เชชเชฏเซ‹เช—เซ€ เชธเชพเชงเชจเซ‹: เชœเชฎเชพเชตเชŸ, เชธเช‚เชšเชพเชฒเชจ, เชฆเซ‡เช–เชฐเซ‡เช–, เชธเซเชฐเช•เซเชทเชพ เช…เชจเซ‡ เชตเชงเซ.
  3. เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ€ เช†เชธเชชเชพเชธ เช…เชฎเชพเชฐเซ€ เชšเซ‡เชจเชฒ.

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

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