Автомасштабирование в Amazon Web Services: EC2 + CloudWatch

в 13:28, , рубрики: Amazon Web Services, AWS, cloud hosting, EC2, load balancing, Блог компании EPAM Systems Ukraine, метки: , , ,

Автомасштабирование в Amazon Web Services: EC2 + CloudWatchДобрый день!

Настройка автомасштабирования на основе Amazon EC2 это очень интересная задача, которуя я когда-то решил и теперь применяю на практике. Существует много возможных вариантов, но я рассмотрю самый простой из них: горизонтальное масштабирование одного сервера под одним балансеровщиком.

В качестве инциатора маштабирования будет выступать Cloud Watch. Метрикой будет наша кастомная метрика Load Average.

Итак, начнём-с. Первое, как тру линуксоид, я советую и рекомендую использовать в настройке автоскейлинга утилиты командной строки (Command Line Tools — CLT) по следующим причинам:

  • из CLT можно сделать всё;
  • удобнее копипастить в консоль, чем кликать мышкой.


Подготовимся к работе и настроим свой терминал, скачав и распаковав следующие тулзы:

Сертификаты pk-***.pem и cert-***.pem положим в /opt/aws/keys.

Теперь сконфигурируем профиль bash, вставив следующие строки в .bash_profile:

.bash_profile

export JAVA_HOME=/usr/java/latest

export EC2_CERT=/opt/aws/cert-***.pem
export EC2_PRIVATE_KEY=/opt/aws/pk-***.pem

export EC2_HOME=/opt/aws/ec2
export PATH=$PATH:$EC2_HOME/bin

export AWS_CLOUDWATCH_HOME=/opt/aws/mon
export PATH=$PATH:$AWS_CLOUDWATCH_HOME/bin

export AWS_ELB_HOME=/opt/aws/elb
export PATH=$PATH:$AWS_ELB_HOME/bin

export AWS_AUTO_SCALING_HOME=/opt/aws/as
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin

Итак, после этого список доступных команд расширится до нужного количества.

1. Начнём с создания балансировщика:

$ elb-create-lb  testlb --headers --listener "lb-port=80,instance-port=8080,protocol=http" --listener "lb-port=443,instance-port=8443,protocol=tcp" --availability-zones us-east-1c
DNS_NAME  DNS_NAME
DNS_NAME  testlb-1678377526.us-east-1.elb.amazonaws.com

Здесь:
testlb — название ЛБ
«lb-port=80,instance-port=8080,protocol=http» — внешний порт ЛБ и внутренний порт сервера. С HTTPS та же ситуация.

2. Будем считать, что у нас есть уже готовый к работе инстанс с ID i-12345678. Установим наш инстанс под ЛБ:

$ elb-register-instances-with-lb testlb --instances i-12345678
INSTANCE_ID  i-12345678

Теперь инстанс доступен по адресу ЛБ.

3. Снимем образ (Amazon Machine Image — AMI) с рабочего инстанса:

$ ec2-create-image i-12345678 --no-reboot -n 'Image Name' -d 'Image Description'
ami-87654321

4. С полученным ami создадим старт-конфиг (Launch Config)

$ as-create-launch-config testlc -i ami-87654321 --key=keypair --group mygroup --instance-type m1.large
OK-Created launch config

Здесь:
keypair — пара ключей, с помощью которой вы логинитесь;
mygroup — секьюрити группа, в которой будут подыматься серверы.

5. Создадим автоскейлинг группу с только что созданным конфигом:

$ as-create-auto-scaling-group testsg -l testlc --availability-zones us-east-1c --min-size 0 --max-size 2 --load-balancers testlb
OK-Created AutoScalingGroup

Здесь:
testlc — нами созданный конфиг;
us-east-1c — зона, в которой будут подыматься инстансы;
0 и 2 — минимальный и максимальный размеры группы соответственно;
testlb — имя вашего балансировщика, под которым будет поднята вся группа.

Итак, готова группа масштабирования и балансировщик.

Теперь нужно настроить CloudWatch алармы. Автомасштабирование, основанное не CloudWatch работает через политикуpolicy, которая задаются. Примером политики является увеличение кол-ва интснсов на 1. Т.е. сначала мы задаём политику, потом мы создаём аларм, который, например, срабатывает при Load Average больше 5 на протяжении минуты.

6. Ну вот политика скейл апа:

$ as-put-scaling-policy ScaleUpPolicy --auto-scaling-group testsg --adjustment=1 --type ChangeInCapacity --cooldown 120
arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleUpPolicy

Здесь:
--adjustment=1 — +1 хост к группе
--cooldown 120 — на протяжении 2 минут все алармы будут игнорироваться и новые инстансы подняты не будут

7. Ну и аларм для скейл апа:

$ mon-put-metric-alarm HighLoadAvAlarm --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --metric-name LoadAverage --namespace CustomMetric --period 60 --statistic Average --threshold 5 --alarm-actions arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleUpPolicy
OK-Created Alarm

Здесь:
--comparison-operator GreaterThanOrEqualToThreshold — оператор >= чем трешхолд.
--evaluation-periods 1 — проврочный интервал в 1 раз
--metric-name LoadAverage --namespace CustomMetric — наша кастомная метрика
--period 60 — минута на срабатывание
--statistic Average — подсчитывается среднее значение
--threshold 5 — Load Average не больше 5, помните?
--alarm-actions — какая политика.

8. Политика скейл дауна:

$ as-put-scaling-policy ScaleDownPolicy --auto-scaling-group testsg --adjustment=-1 --type ChangeInCapacity --cooldown 420
arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleDownPolicy

Здесь кулдаун больше. После даунскейла инстансы группа не даунскейлится ещё минимум 6 минут. Ну и adjustment=-1.

9. Аларм для скейл дауна:

$ mon-put-metric-alarm LoLoadAvAlarm --comparison-operator LessThanThreshold --evaluation-periods 1 --metric-name LoadAverage --namespace CustomMetric --period 120 --statistic Average --threshold 3 --alarm-actions arn:aws:autoscaling:us-east-1:278634951321:scalingPolicy:2f3482d2-ca6c-4653-970c-eb68a593cf26:autoScalingGroupName/testsg:policyName/ScaleDownPolicy
OK-Created Alarm

Здесь аларм срабатывает, если больше 2 минут Load Average был меньше 3.

Ну вот и всё. Итак, теперь в зависимости от нагрузки, наша скейл группа сможет разрастаться до 3х инстансов и 1 всегда будет жив. Здесь рассмотрен простейший пример автоскейлинга. Естественно, можно менять условия и баловаться с цифрами по своему усмотрению.

Автор: korjik

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js