เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡ autoscaler เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบก

เบชเบฐเบšเบฒเบเบ”เบต! เบžเบงเบเป€เบฎเบปเบฒเบเบถเบเบญเบปเบšเบฎเบปเบกเบ„เบปเบ™เปƒเบซเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบเปˆ. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบเบฒเบ™เบชเบถเบเบชเบฒเบเปˆเบฝเบงเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบเปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบเบธเปˆเบกเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เป€เบŠเบดเปˆเบ‡เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™. เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰, เป‚เบ›เบผเปเบเบผเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเป€เบซเบกเบตเบกเบตเบกเบฑเบ™ :) เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเปˆเบงเบ™เบฎเปˆเบงเบกเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบซเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เปเบฅเบฐเบœเบนเป‰เบŠเบฒเบเป‚เบ”เบเบเบปเบ‡เป€เบ›เบตเบ”เบ•เบปเบงเบงเบฝเบ MapReduce เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เปเบฅเบฐเปƒเบŠเป‰ Spark.

เปƒเบ™เบšเบปเบ”เบ‚เบฝเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เบเบธเปˆเบกเบ—เบตเปˆเบšเปเปˆเบชเบฐ เป€เปเบต เบžเบฒเบšเป‚เบ”เบเบเบฒเบ™เบ‚เบฝเบ™เบ•เบปเบงเบ‚เบฐ เปœเบฒเบ” เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰ cloud. Mail.ru Cloud Solutions.

เบšเบฑเบ™เบซเบฒ

เบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เปƒเบ™เบฎเบนเบšเปเบšเบšเบ›เบปเบเบเบฐเบ•เบด. เบเบฒเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบšเปเปˆเบชเบฐเป€เบซเบกเบตเบžเบฒเบšเบชเบนเบ‡. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบตเบซเป‰เบญเบ‡เบฎเบฝเบ™เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบกเบทเปˆเบญเบ—เบฑเบ‡เบซเบกเบปเบ” 30 เบ„เบปเบ™เปเบฅเบฐเบ„เบนเบชเบญเบ™เป„เบ›เบซเบฒเบเบธเปˆเบกเปเบฅเบฐเป€เบฅเบตเปˆเบกเปƒเบŠเป‰เบกเบฑเบ™. เบซเบผเบทเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบกเบตเบกเบทเป‰เบเปˆเบญเบ™เป€เบชเบฑเป‰เบ™เบ•เบฒเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ. เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบเบธเปˆเบกเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ” underload.

เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚ #1 เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบเบธเปˆเบกโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ—เบปเบ™โ€‹เบ—เบฒเบ™โ€‹เบ•เปเปˆโ€‹เบเบฒเบ™โ€‹เป‚เบซเบผเบ”โ€‹เบชเบนเบ‡โ€‹เบชเบธเบ”โ€‹, เปเบ•เปˆโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เป€เบซเบผเบทเบญโ€‹.

เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚ #2 เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบเบธเปˆเบกโ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ™เป‰เบญเบโ€‹, เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เป€เบžเบตเปˆเบกโ€‹เบ‚เปเป‰โ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹เบเปˆเบญเบ™โ€‹เบซเป‰เบญเบ‡โ€‹เบฎเบฝเบ™โ€‹เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบซเบผเบ”โ€‹เบชเบนเบ‡โ€‹เบชเบธเบ”โ€‹.

เบเบฒเบ™เปเบเป‰เป„เบ‚ #3 เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบเบธเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปเบฅเบฐเบ‚เบฝเบ™ autoscaler เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เป‚เบซเบผเบ”เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡ cluster เปเบฅเบฐ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ APIs เบ•เปˆเบฒเบ‡เป†, เป€เบžเบตเปˆเบกเปเบฅเบฐเป€เบญเบปเบฒ nodes เบญเบญเบเบˆเบฒเบ cluster.

เปƒเบ™เบšเบปเบ”เบ‚เบฝเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚ #3. autoscaler เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ›เบฑเบ”เปƒเบˆเบžเบฒเบเบ™เบญเบเบซเบผเบฒเบเบเปˆเบงเบฒเบžเบฒเบเปƒเบ™, เปเบฅเบฐเบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบกเบฑเบเบˆเบฐเบšเปเปˆเบชเบฐเบซเบ™เบญเบ‡เบกเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ„เบฅเบฒเบงเบ‚เบญเบ‡ Mail.ru Cloud Solutions เปเบฅเบฐเบ‚เบฝเบ™เบ•เบปเบงเบ‚เบฐเบซเบเบฒเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ MCS API. เปเบฅเบฐเบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบญเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™ autoscaler เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เบเบฑเบšเบ„เบฅเบฒเบงเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบเปเบฒเบซเบ™เบปเบ”เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบธเปˆเบก Hadoop. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบฒเบ™เปเบˆเบเบขเบฒเบ HDP.

เป€เบžเบทเปˆเบญเปƒเบซเป‰ nodes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เบทเบเป€เบžเบตเปˆเบกเปเบฅเบฐเป€เบญเบปเบฒเบญเบญเบเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เปเบœเปˆเบเบฐเบˆเบฒเบเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡ nodes.

  1. เปเบกเปˆเบšเบปเบ” node. เบ”เบต, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบžเบดเป€เบชเบ”เบ—เบตเปˆเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰: เป‚เบซเบ™เบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบธเปˆเบก, เป€เบŠเบดเปˆเบ‡, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เป„เบ”เป€เบงเบต Spark เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เป‚เบซเบกเบ”เป‚เบ•เป‰เบ•เบญเบš.
  2. เป‚เบซเบ™เบ”เบงเบฑเบ™เบ—เบต. เบ™เบตเป‰โ€‹เปเบกเปˆเบ™ node เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบš HDFS เปเบฅเบฐโ€‹เบšเปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบ„เบดเบ”โ€‹เป„เบฅเปˆโ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹.
  3. เป‚เบ™เบ”เบ„เบญเบกเบžเบดเบงเป€เบ•เบต. เบ™เบตเป‰เปเบกเปˆเบ™ node เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบšเปเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบซเบเบฑเบ‡เบขเบนเปˆเปƒเบ™ HDFS, เปเบ•เปˆเบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™.

เบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™. Autoscaling เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ nodes เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ—เบตเบชเบฒเบก. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฅเบตเปˆเบกเบเบดเบ™เปเบฅเบฐเป€เบžเบตเปˆเบกเบ‚เปเป‰เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ—เบตเบชเบญเบ‡, เบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบˆเบฐเบ•เปเปˆเบฒเบซเบผเบฒเบ - decommissioning and recommitting will take hours on your cluster . เบ™เบตเป‰, เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบˆเบฒเบ autoscaling. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบชเปเบฒเบœเบฑเบ”เบเบฑเบšเบ‚เปเป‰เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบ—เบตเบชเบญเบ‡. เบžเบงเบเบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบเบธเปˆเบกเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ•เปเปˆเบฒเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบกเบตเบขเบนเปˆเบ•เบฐเบซเบผเบญเบ”เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, autoscaler เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ Python 3, เปƒเบŠเป‰ Ambari API เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบเบธเปˆเบก, เปƒเบŠเป‰ API เบˆเบฒเบ Mail.ru Cloud Solutions (MCS) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบขเบธเบ”เป€เบ„เบทเปˆเบญเบ‡.

เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚

  1. เป‚เบกเบ”เบนเบ™ autoscaler.py. เบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบฒเบกเบŠเบฑเป‰เบ™เบฎเบฝเบ™: 1) เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Ambari, 2) เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MCS, 3) เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡ autoscaler.
  2. เบชเบฐเบ„เบฃเบดเบš observer.py. เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบงเบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™: เป€เบงเบฅเบฒเปƒเบ”เปเบฅเบฐเป€เบงเบฅเบฒเปƒเบ”เบ—เบตเปˆเบˆเบฐเป‚เบ—เบซเบฒเบŸเบฑเบ‡เบŠเบฑเบ™ autoscaler.
  3. เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ config.py. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบฑเบ™เบกเบตเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ nodes เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบชเปเบฒเบฅเบฑเบš autoscaling เปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบš, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเปเบ–เป‰เบฒเบˆเบฒเบเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ node เปƒเบซเบกเปˆเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก. เบ™เบญเบเบ™เบฑเป‰เบ™เบเบฑเบ‡เบกเบตเบเบฒเบ™เบชเบฐเปเบ•เบกเป€เบงเบฅเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเปˆเบญเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบกเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เบชเบนเบ‡เบชเบธเบ”เปเบกเปˆเบ™เป€เบ›เบตเบ”เบ•เบปเบง.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบžเบฒเบเปƒเบ™เบชเบญเบ‡เป„เบŸเบฅเปŒเบ—เปเบฒเบญเบดเบ”.

1. เป‚เบกเบ”เบนเบ™ Autoscaler.py

เบซเป‰เบญเบ‡เบฎเบฝเบ™ Ambari

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบซเป‰เบญเบ‡เบฎเบฝเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเป€เบ›เบฑเบ™ Ambari:

class Ambari:
    def __init__(self, ambari_url, cluster_name, headers, auth):
        self.ambari_url = ambari_url
        self.cluster_name = cluster_name
        self.headers = headers
        self.auth = auth

    def stop_all_services(self, hostname):
        url = self.ambari_url + self.cluster_name + '/hosts/' + hostname + '/host_components/'
        url2 = self.ambari_url + self.cluster_name + '/hosts/' + hostname
        req0 = requests.get(url2, headers=self.headers, auth=self.auth)
        services = req0.json()['host_components']
        services_list = list(map(lambda x: x['HostRoles']['component_name'], services))
        data = {
            "RequestInfo": {
                "context":"Stop All Host Components",
                "operation_level": {
                    "level":"HOST",
                    "cluster_name": self.cluster_name,
                    "host_names": hostname
                },
                "query":"HostRoles/component_name.in({0})".format(",".join(services_list))
            },
            "Body": {
                "HostRoles": {
                    "state":"INSTALLED"
                }
            }
        }
        req = requests.put(url, data=json.dumps(data), headers=self.headers, auth=self.auth)
        if req.status_code in [200, 201, 202]:
            message = 'Request accepted'
        else:
            message = req.status_code
        return message

เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆ stop_all_services, เป€เบŠเบดเปˆเบ‡เบขเบธเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ node cluster เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™.

เบขเบนเปˆเบ—เบฒเบ‡เป€เบ‚เบปเป‰เบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™ Ambari เป€เบˆเบปเป‰เบฒเบœเปˆเบฒเบ™:

  • ambari_url, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ„เบท 'http://localhost:8080/api/v1/clusters/',
  • cluster_name - เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบเบธเปˆเบกโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เปƒเบ™ Ambariโ€‹,
  • headers = {'X-Requested-By': 'ambari'}
  • เปเบฅเบฐเบžเบฒเบเปƒเบ™ auth เบ™เบตเป‰เปเบกเปˆเบ™เบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰ เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบš Ambari: auth = ('login', 'password').

เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบซเบผเบฒเบเบเปˆเบงเบฒเบชเบญเบ‡เบเบฒเบ™เป‚เบ—เบœเปˆเบฒเบ™ REST API เบเบฑเบš Ambari. เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ—เบตเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™, เบžเบงเบเป€เบฎเบปเบฒเบ—เปเบฒเบญเบดเบ”เป„เบ”เป‰เบฎเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™ node, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ–เบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบเบธเปˆเบกเบ—เบตเปˆเปƒเบซเป‰, เปƒเบ™ node เปƒเบ”เบซเบ™เบถเปˆเบ‡, เป€เบžเบทเปˆเบญเป‚เบญเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป„เบ›เบซเบฒเบฅเบฑเบ”. INSTALLED. เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบšเปเบฅเบดเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบญเบ™ nodes เบเบฑเบšเบฅเบฑเบ” Maintenance เปเบฅเบฐเบญเบทเปˆเบ™เป†เป€เบšเบดเปˆเบ‡เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™ - เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบœเปˆเบฒเบ™ API.

เบซเป‰เบญเบ‡เบฎเบฝเบ™ Mcs

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบซเป‰เบญเบ‡เบฎเบฝเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเป€เบ›เบฑเบ™ Mcs:

class Mcs:
    def __init__(self, id1, id2, password):
        self.id1 = id1
        self.id2 = id2
        self.password = password
        self.mcs_host = 'https://infra.mail.ru:8774/v2.1'

    def vm_turn_on(self, hostname):
        self.token = self.get_mcs_token()
        host = self.hostname_to_vmname(hostname)
        vm_id = self.get_vm_id(host)
        mcs_url1 = self.mcs_host + '/servers/' + self.vm_id + '/action'
        headers = {
            'X-Auth-Token': '{0}'.format(self.token),
            'Content-Type': 'application/json'
        }
        data = {'os-start' : 'null'}
        mcs = requests.post(mcs_url1, data=json.dumps(data), headers=headers)
        return mcs.status_code

เบขเบนเปˆเบ—เบฒเบ‡เป€เบ‚เบปเป‰เบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™ Mcs เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™ id เป‚เบ„เบ‡เบเบฒเบ™เบžเบฒเบเปƒเบ™เบ„เบฅเบฒเบงเปเบฅเบฐ id เบœเบนเป‰เปƒเบŠเป‰, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง. เบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ vm_turn_on เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เป€เบ„เบทเปˆเบญเบ‡เบซเบ™เบถเปˆเบ‡. เป€เบซเบ”เบœเบปเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบเบงเปˆเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ. เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เบชเบฒเบกเบซเบ™เป‰เบฒเบ—เบตเปˆเบญเบทเปˆเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒ: 1) เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบš token, 2) เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ›เปˆเบฝเบ™ hostname เป€เบ›เบฑเบ™เบŠเบทเปˆเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปƒเบ™ MCS, 3) เป„เบ”เป‰ id เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบ™เบตเป‰. เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เบญเบšเปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเป€เบ„เบทเปˆเบญเบ‡เบ™เบตเป‰.

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบš token เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ:

def get_mcs_token(self):
        url = 'https://infra.mail.ru:35357/v3/auth/tokens?nocatalog'
        headers = {'Content-Type': 'application/json'}
        data = {
            'auth': {
                'identity': {
                    'methods': ['password'],
                    'password': {
                        'user': {
                            'id': self.id1,
                            'password': self.password
                        }
                    }
                },
                'scope': {
                    'project': {
                        'id': self.id2
                    }
                }
            }
        }
        params = (('nocatalog', ''),)
        req = requests.post(url, data=json.dumps(data), headers=headers, params=params)
        self.token = req.headers['X-Subject-Token']
        return self.token

เบซเป‰เบญเบ‡เบฎเบฝเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เบกเบตเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš logic เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡.

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ™เบตเป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ:

class Autoscaler:
    def __init__(self, ambari, mcs, scaling_hosts, yarn_ram_per_node, yarn_cpu_per_node):
        self.scaling_hosts = scaling_hosts
        self.ambari = ambari
        self.mcs = mcs
        self.q_ram = deque()
        self.q_cpu = deque()
        self.num = 0
        self.yarn_ram_per_node = yarn_ram_per_node
        self.yarn_cpu_per_node = yarn_cpu_per_node

    def scale_down(self, hostname):
        flag1 = flag2 = flag3 = flag4 = flag5 = False
        if hostname in self.scaling_hosts:
            while True:
                time.sleep(5)
                status1 = self.ambari.decommission_nodemanager(hostname)
                if status1 == 'Request accepted' or status1 == 500:
                    flag1 = True
                    logging.info('Decomission request accepted: {0}'.format(flag1))
                    break
            while True:
                time.sleep(5)
                status3 = self.ambari.check_service(hostname, 'NODEMANAGER')
                if status3 == 'INSTALLED':
                    flag3 = True
                    logging.info('Nodemaneger decommissioned: {0}'.format(flag3))
                    break
            while True:
                time.sleep(5)
                status2 = self.ambari.maintenance_on(hostname)
                if status2 == 'Request accepted' or status2 == 500:
                    flag2 = True
                    logging.info('Maintenance request accepted: {0}'.format(flag2))
                    break
            while True:
                time.sleep(5)
                status4 = self.ambari.check_maintenance(hostname, 'NODEMANAGER')
                if status4 == 'ON' or status4 == 'IMPLIED_FROM_HOST':
                    flag4 = True
                    self.ambari.stop_all_services(hostname)
                    logging.info('Maintenance is on: {0}'.format(flag4))
                    logging.info('Stopping services')
                    break
            time.sleep(90)
            status5 = self.mcs.vm_turn_off(hostname)
            while True:
                time.sleep(5)
                status5 = self.mcs.get_vm_info(hostname)['server']['status']
                if status5 == 'SHUTOFF':
                    flag5 = True
                    logging.info('VM is turned off: {0}'.format(flag5))
                    break
            if flag1 and flag2 and flag3 and flag4 and flag5:
                message = 'Success'
                logging.info('Scale-down finished')
                logging.info('Cooldown period has started. Wait for several minutes')
        return message

เบžเบงเบเป€เบฎเบปเบฒเบเบญเบกเบฎเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒ. Ambari ะธ Mcs, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ nodes เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ‚เบญเบ‡ node: เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐ cpu เบˆเบฑเบ”เบชเบฑเบ™เปƒเบซเป‰เบเบฑเบš node เปƒเบ™ YARN. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบต 2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบžเบฒเบเปƒเบ™ q_ram, q_cpu, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เปเบ–เบง. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบเบฑเบšเบ„เปˆเบฒเบ‚เบญเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เบเบธเปˆเบกเบ›เบฐเบˆเบธเบšเบฑเบ™. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบงเปˆเบฒเปƒเบ™เป„เบฅเบเบฐ 5 เบ™เบฒเบ—เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก +1 node เบเบฑเบšเบเบธเปˆเบก. เบญเบฑเบ™เบ”เบฝเบงเบเบฑเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡ cluster underutilization.

เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเป€เบญเบปเบฒเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบญเบญเบเบˆเบฒเบ cluster เปเบฅเบฐเบขเบธเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ„เบฅเบฒเบง. เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบกเบตเบเบฒเบ™เบเบปเบเป€เบฅเบตเบ YARN Nodemanager, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป‚เบซเบกเบ”เป€เบ›เบตเบ” Maintenance, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบฅเบฐเบ›เบดเบ”เป€เบ„เบทเปˆเบญเบ‡ virtual เปƒเบ™เบ„เบฅเบฒเบง.

2. script observer.py

เบฅเบฐเบซเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™:

if scaler.assert_up(config.scale_up_thresholds) == True:
        hostname = cloud.get_vm_to_up(config.scaling_hosts)
        if hostname != None:
            status1 = scaler.scale_up(hostname)
            if status1 == 'Success':
                text = {"text": "{0} has been successfully scaled-up".format(hostname)}
                post = {"text": "{0}".format(text)}
                json_data = json.dumps(post)
                req = requests.post(webhook, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'})
                time.sleep(config.cooldown_period*60)

เปƒเบ™เบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ•เปˆเบฒเบ‡เป†เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบญเบฒเบ”เบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบเบธเปˆเบกเปเบฅเบฐเบงเปˆเบฒเบกเบตเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเปƒเบ”เป†เบขเบนเปˆเปƒเบ™เบชเบฐเบซเบ‡เบงเบ™, เป€เบญเบปเบฒเบŠเบทเปˆเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™, เป€เบžเบตเปˆเบกเบกเบฑเบ™เปƒเบชเปˆเบเบธเปˆเบกเปเบฅเบฐเป€เบœเบตเบเปเบœเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ Slack เบ‚เบญเบ‡เบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ cooldown_period, เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป€เบžเบตเปˆเบกเบซเบผเบทเป€เบญเบปเบฒเบชเบดเปˆเบ‡เปƒเบ”เบญเบญเบเบˆเบฒเบเบเบธเปˆเบก, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เป‚เบซเบผเบ”. เบ–เป‰เบฒเบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เปเบฅเบฐเบขเบนเปˆเปƒเบ™เปเบฅเบงเป€เบชเบ”เบ–เบฐเบเบดเบ”เบ‚เบญเบ‡เบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เป‚เบซเบผเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบชเบทเบšเบ•เปเปˆเบ•เบดเบ”เบ•เบฒเบก. เบ–เป‰เบฒเบซเบ™เบถเปˆเบ‡ node เบšเปเปˆเบžเบฝเบ‡เบžเป, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡.

เบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบšเบปเบ”เบฎเบฝเบ™เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ, เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เปเบฅเป‰เบงเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡ node เบˆเบฐเบšเปเปˆเบžเบฝเบ‡เบžเป, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ—เบฑเบ™เบ—เบตเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ nodes เบŸเบฃเบตเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบฎเบฑเบเบชเบฒเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบˆเบปเบ™เบเปˆเบงเบฒเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบปเบ”เบฎเบฝเบ™เป„เบ”เป‰. เบญเบฑเบ™เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบฅเบฒเบเบŠเบทเปˆเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบดเบ”เบˆเบฐเบเปเบฒ.

เบชเบฐเบซเบฅเบธเบš

Autoscaler เป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเปเบฅเบฐเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบ›เบฐเบชเบปเบšเบเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เบเบธเปˆเบกเบ—เบตเปˆเบšเปเปˆเบชเบฐเป€เบซเบกเบตเบเบฑเบ™. เบ—เปˆเบฒเบ™เบžเป‰เบญเบกเป†เบเบฑเบ™เบšเบฑเบ™เบฅเบธเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบกเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบชเบนเบ‡เบชเบธเบ”เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบšเปเปˆเบฎเบฑเบเบชเบฒเบเบธเปˆเบกเบ™เบตเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป‚เบซเบผเบ”, เบ›เบฐเบซเบเบฑเบ”เป€เบ‡เบดเบ™. เบ”เบต, เบšเบงเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. autoscaler เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ™เบญเบเป€เบซเบ™เบทเบญเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰ API เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบกเปเบฅเบฐ API เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบŸเบฑเบ‡, เบ‚เบฝเบ™เบ•เบฒเบกเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™. เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบˆเบทเปˆเบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™เปเบกเปˆเบ™เบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบญเบญเบเป€เบ›เบฑเบ™ 3 เบ›เบฐเป€เบžเบ”, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบเปˆเบญเบ™ เปœเป‰เบฒ เบ™เบตเป‰. เปเบฅเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบธเบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™