Prometheus, KEDA เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเดฎเตเดณเตเดณ เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ

Prometheus, KEDA เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเดฎเตเดณเตเดณ เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเดธเดฟเดฎเตเดตเดพเดจเต‹เดธเดฟเดจเตเดฑเต† เดฌเดฒเต‚เตบ เดฎเดพเตป

เด•เตเดฒเต—เดกเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เด†เดตเดถเตเดฏเด•เดคเดฏเดพเดฃเต เดธเตเด•เต‡เดฒเดฌเดฟเดณเดฟเดฑเตเดฑเดฟ. เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด‰เดšเดฟเดคเดฎเดพเดฏ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ ReplicaSet - เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เด’เดฐเต เดฎเดพเดจเตเดตเตฝ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดพเดฃเต.

เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดฏเดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต (เด…เดคเดพเดฏเดคเต เด’เดฐเต เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดฒเต† เดชเต‹เดกเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ ReplicaSet) เดนเตŠเดฑเดฟเดธเต‹เดฃเตเดŸเตฝ เดชเต‹เดกเต เด“เดŸเตเดŸเต‹เดธเตเด•เต†เดฏเดฟเดฒเตผ เดธเตเดชเต†เดธเดฟเดซเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเดฟเด•เตเดฒเดฑเต‡เดฑเตเดฑเต€เดตเต เดฐเต€เดคเดฟเดฏเดฟเตฝ. เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดธเตเด•เต†เดฏเดฟเดฒเดฟเด‚เด—เดฟเดจเตเดฑเต† เดกเดฟเดซเต‹เตพเดŸเตเดŸเต เดฎเดพเดจเดฆเดฃเตเดกเด‚ CPU เด‰เดชเดฏเต‹เด— เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เด†เดฃเต (เดฑเดฟเดธเต‹เดดเตโ€Œเดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต), เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดทเตเดŸเดพเดจเตเดธเตƒเดคเดตเตเด‚ เดฌเดพเดนเตเดฏเดฎเดพเดฏเดฟ เดจเตฝเด•เดฟเดฏเดคเตเดฎเดพเดฏ เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดŸเต€เด‚ Mail.ru-เตฝ เดจเดฟเดจเตเดจเต Kubernetes aaS เด’เดฐเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตเดตเดฏเดฎเต‡เดต เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฌเดพเดนเตเดฏ เด…เดณเดตเตเด•เตพ เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดฒเต‡เด–เดจเด‚ เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดคเต. เดŽเดฒเตเดฒเดพเด‚ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เดพเตป, เดฐเดšเดฏเดฟเดคเดพเดตเต HTTP เด†เด•เตเดธเดธเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฎเต†เดŸเตเดฐเดฟเด•เตเดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดต เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเต‹เดกเตเด•เดณเตเดŸเต† เดคเดฟเดฐเดถเตเดšเต€เดจ เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เดฟเดจเต เดชเด•เดฐเด‚, เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฑเดพเดฏ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด‡เดตเดจเตเดฑเต เดกเตเดฐเตˆเดตเตบ เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เต (เด•เต†เด‡เดกเดฟเดŽ) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เดตเตผเด•เตเด•เต เดฒเต‹เดกเตเด•เตพเด•เตเด•เต เดคเดŸเดธเตเดธเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เต (เดชเต‚เดœเตเดฏเด‚ เด‰เตพเดชเตเดชเต†เดŸเต†/เดฎเตเดคเตฝ) เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต เด‡เดคเต เดนเต‹เดฑเดฟเดธเต‹เดฃเตเดŸเตฝ เดชเต‹เดกเต เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต†เดฏเดฟเดฒเดฑเตเดฎเดพเดฏเดฟ เดจเต‡เดฑเตเดฑเต€เดตเต เด†เดฏเดฟ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต‹เดกเต เด‡เดตเดฟเดŸเต† เดฒเดญเตเดฏเดฎเดพเดฃเต เดธเดพเดฎเต‚เดนเดฟเด•เด‚.

เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดนเตเดฐเดธเตเดต เด…เดตเดฒเต‹เด•เดจเด‚

Prometheus, KEDA เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เตŠเดชเตเดชเดฎเตเดณเตเดณ เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฟเด‚เด—เต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ

เดŽเดฒเตเดฒเดพเด‚ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดนเตเดฐเดธเตเดต เดตเดฟเดตเดฐเดฃเด‚ เดกเดฏเด—เตเดฐเด‚ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต:

  1. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ HTTP เดนเดฟเดฑเตเดฑเต เด•เต—เดฃเตเดŸเต เดฎเต†เดŸเตเดฐเดฟเด•เตเดธเต เดจเตฝเด•เตเดจเตเดจเต.
  2. เดˆ เด…เดณเดตเตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.
  3. HTTP เดนเดฟเดฑเตเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตเดตเดฏเดฎเต‡เดต เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ KEDA-เดฏเดฟเดฒเต† เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดธเตเด•เต†เดฏเดฟเดฒเตผ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เดชเตเดชเต‹เตพ เดžเดพเตป เด“เดฐเต‹ เด˜เดŸเด•เดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฑเดฏเดพเด‚.

เด•เต†เด‡เดกเดฟเดŽเดฏเตเด‚ เดชเตเดฐเตŠเดฎเดฟเดคเตเดฏเต‚เดธเตเด‚

เดชเตเดฐเตŠเดฎเดฟเดคเตเดฏเต‚เดธเต เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเดฟเด‚เด—เต เด†เตปเดกเต เด…เดฒเต‡เตผเดŸเตเดŸเดฟเด‚เด—เต เดŸเต‚เตพเด•เดฟเดฑเตเดฑเต เด†เดฃเต, เดญเดพเด—เด‚ เด•เตเดฒเต—เดกเต เดจเต‡เดฑเตเดฑเต€เดตเต เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฟเด‚เด—เต เดซ .เดฃเตเดŸเต‡เดทเตป. เดตเดฟเดตเดฟเดง เดธเตเดฐเต‹เดคเดธเตเดธเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดณเดตเตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดตเดฏเต† เดธเดฎเดฏ เดถเตเดฐเต‡เดฃเดฟ เดกเดพเดฑเตเดฑเดฏเดพเดฏเดฟ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดกเดพเดฑเตเดฑ เดฆเตƒเดถเตเดฏเดตเตฝเด•เตเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ เด—เตเดฐเดพเดซเดพเดจ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ Kubernetes API-เดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดฎเดฑเตเดฑเต เดตเดฟเดทเตเดตเดฒเตˆเดธเต‡เดทเตป เดŸเต‚เดณเตเด•เตพ.

KEDA เด’เดฐเต เดธเตเด•เต†เดฏเดฟเดฒเตผ เดŽเดจเตเดจ เด†เดถเดฏเดคเตเดคเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต - เด‡เดคเต KEDA เดฏเตเด•เตเด•เตเด‚ เดฌเดพเดนเตเดฏ เดธเด‚เดตเดฟเดงเดพเดจเดคเตเดคเดฟเดจเตเด‚ เด‡เดŸเดฏเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดชเดพเดฒเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเด•เต†เดฏเดฟเดฒเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ เด“เดฐเต‹ เดŸเดพเตผเด—เต†เดฑเตเดฑเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเด‚ เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฃเต, เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดŽเด•เตโ€Œเดธเตโ€ŒเดŸเตเดฐเดพเด•เตโ€Œเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดธเตเด•เต†เดฏเดฟเดฒเดฟเด‚เด—เต เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเตป KEDA เดชเดฟเดจเตเดจเต€เดŸเต เด…เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เดธเตเด•เต†เดฏเดฟเดฒเดฑเตเด•เตพ เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดกเดพเดฑเตเดฑ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดพเดซเตเด•, เดฑเต†เดกเดฟเดธเต, เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต. เด…เดคเดพเดฏเดคเต, เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดฎเดพเดจเดฆเดฃเตเดกเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ เดธเตเดตเดฏเดฎเต‡เดต เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดฏเดพเตป KEDA เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดŸเต†เดธเตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป

Golang เดŸเต†เดธเตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป HTTP เดตเดดเดฟ เด†เด•เตเดธเดธเต เดจเตฝเด•เตเด•เดฏเตเด‚ เดฐเดฃเตเดŸเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

  1. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เตปเดธเตเดŸเตเดฐเตเดฎเต†เดจเตเดฑเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดนเดฟเดฑเตเดฑเต เด•เต—เดฃเตเดŸเต เด…เดŸเด™เตเด™เตเดจเตเดจ http_requests เดฎเต†เดŸเตเดฐเดฟเด•เต เดจเตฝเด•เดพเดจเตเด‚ Prometheus Go เด•เตเดฒเดฏเดจเตเดฑเต เดฒเตˆเดฌเตเดฐเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดฒเดญเตเดฏเดฎเดพเดฏ เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เดฏเตเด†เตผเดเดฏเดฟเดฒเดพเดฃเต /metrics.
    var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
           Name: "http_requests",
           Help: "number of http requests",
       })
    
  2. เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเด•เตเด•เต เดฎเดฑเตเดชเดŸเดฟเดฏเดพเดฏเดฟ GET เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต€เดฏเตเดŸเต† เดฎเต‚เดฒเตเดฏเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต (access_count) เดฑเต†เดกเดฟเดธเดฟเตฝ. เด’เดฐเต เดŽเดšเตเดšเตเดŸเดฟเดŸเดฟเดชเดฟ เดนเดพเตปเดกเตโ€Œเดฒเดฑเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เดŽเดณเตเดชเตเดชเดตเดดเดฟเดฏเดพเดฃเดฟเดคเต, เด•เต‚เดŸเดพเดคเต† เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•. เดฎเต†เดŸเตเดฐเดฟเด•เต เดฎเต‚เดฒเตเดฏเด‚ เดฎเต‚เดฒเตเดฏเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ 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 - เดฏเตเด เดชเตเดฐเตŠเดฎเดฟเดคเตเดฏเต‚เดธเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเตเดฐเดตเต‡เดถเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เดธเต‡เดตเดจเด‚;
  • ClusterRole, ClusterRoleBinding ะธ ServiceAccount - เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต† เดธเต‡เดตเดจเด™เตเด™เตพ เดธเตเดตเดฏเดฎเต‡เดต เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเต (เด“เดŸเตเดŸเต‹-เด•เดฃเตเดŸเต†เดคเตเดคเตฝ).

เด‡เดตเดฟเดŸเต† เดชเตเดฐเตŠเดฎเดฟเดคเตเดฏเต‚เดธเดฟเดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเด•เดŸเดจเดฎเดพเดฃเต.

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, KEDA เด“เดฐเต‹ เดชเดคเดฟเดจเดžเตเดšเต เดธเต†เด•เตเด•เตปเดกเดฟเดฒเตเด‚ เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดŸเดพเตผเด—เต†เดฑเตเดฑเต เด…เดญเตเดฏเตผเดคเตเดฅเดฟเด•เตเด•เตเดจเตเดจเต. เด•เตเดฑเดžเตเดžเดคเต เด’เดฐเต†เดฃเตเดฃเดฎเต†เด™เตเด•เดฟเดฒเตเด‚ (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, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดŽเดŸเตเด•เตเด•เดพเด‚. เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด‰เดฃเตเดŸเต เดจเต‡เดคเตƒเดคเตเดตเด‚.

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/

เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด• เด•เตเดฌเต†เด•เตเดฒเดฟเด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เดพเตป.

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. เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดฎเดพเตปเดกเต:

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

เดŸเดฟเดฒเตเดฒเตผ เดชเต‹เดกเต เดฑเดฃเตเดฃเดฟเด‚เด—เต เด…เดตเดธเตเดฅเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดฐเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•.

เดตเดฟเดตเตผเดคเตเดคเด•เดจเตเดฑเต† เด•เตเดฑเดฟเดชเตเดชเต: เดฐเดšเดฏเดฟเดคเดพเดตเต Helm@2 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเดฟเดจเต เดŸเดฟเดฒเตเดฒเตผ เดธเต†เตผเดตเตผ เด˜เดŸเด•เด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดชเตเดชเต‹เตพ Helm@3 เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฃเต, เด…เดคเดฟเดจเต เด’เดฐเต เดธเต†เตผเดตเตผ เดญเดพเด—เด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ.

Helm เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, Redis เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เด’เดฐเต เด•เดฎเดพเตปเดกเต เดฎเดคเดฟ:

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

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

เดฑเต†เดกเดฟเดธเต เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดฐเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด• 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

เดŽเดจเตเดจเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ เดฒเดฟเดจเด•เตเดธเต เด…เดฅเดตเดพ เดตเดฟเตปเดกเต‡เดพเดธเต.

เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เต‚:

./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 เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเตเดฐเต‹เดฎเดฟเดคเตเดฏเต‚เดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต, เดฑเต†เดกเดฟเดธเดฟเดฒเต† เด•เตเดฏเต‚ เดฆเตˆเตผเด˜เตเดฏเด‚, เด•เดพเดซเตเด• เดตเดฟเดทเดฏเดคเตเดคเดฟเดฒเต† เด‰เดชเดญเต‹เด•เตเดคเตƒ เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดŽเดจเตเดจเดฟเดตเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ.

เด•เต†โ€Œเด‡โ€Œเดกเดฟโ€ŒเดŽ เด’เดฐเต เดฌเดพเดนเตเดฏ เด‰เดฑเดตเดฟเดŸเดตเตเดฎเดพเดฏเดฟ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดฎเต†เดŸเตเดฐเดฟเด•เตโ€Œเดธเต เดธเต†เตผเดตเตผ เดตเดดเดฟ เดนเต‹เดฑเดฟเดธเต‹เดฃเตเดŸเตฝ เดชเต‹เดกเต เด“เดŸเตเดŸเต‹เดธเตโ€Œเด•เต‡เดฒเดฑเดฟเดฒเต‡เด•เตเด•เต เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด—เตเดกเต เดฒเด•เตเด•เต!

เดฎเดฑเตเดฑเต†เดจเตเดคเดพเดฃเต เดตเดพเดฏเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต:

  1. เด‰เตฝเดชเตเดชเดพเดฆเดจ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเตเด‚ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเด•เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เดณเตเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เดณเตเด‚.
  2. 90+ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเด•เตพเด•เตเด•เตเดณเตเดณ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ: เดตเดฟเดจเตเดฏเดพเดธเด‚, เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเต, เดจเดฟเดฐเต€เด•เตเดทเดฃเด‚, เดธเตเดฐเด•เตเดท เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เด…เดคเดฟเดฒเต‡เดฑเต†เดฏเตเด‚.
  3. เดŸเต†เดฒเดฟเด—เตเดฐเดพเดฎเดฟเดฒเต† เดžเด™เตเด™เดณเตเดŸเต† เดšเดพเดจเตฝ เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเต เดšเตเดฑเตเดฑเตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•