Добрый день!
Настройка автомасштабирования на основе Amazon EC2 это очень интересная задача, которуя я когда-то решил и теперь применяю на практике. Существует много возможных вариантов, но я рассмотрю самый простой из них: горизонтальное масштабирование одного сервера под одним балансеровщиком.
В качестве инциатора маштабирования будет выступать Cloud Watch. Метрикой будет наша кастомная метрика Load Average.
Итак, начнём-с. Первое, как тру линуксоид, я советую и рекомендую использовать в настройке автоскейлинга утилиты командной строки (Command Line Tools — CLT) по следующим причинам:
- из CLT можно сделать всё;
- удобнее копипастить в консоль, чем кликать мышкой.
Подготовимся к работе и настроим свой терминал, скачав и распаковав следующие тулзы:
- ELB CLT -> /opt/aws/elb
- EC2 CLT -> /opt/aws/ec2
- CloudWatch CLT -> /opt/aws/mon
- Auto Scaling CLT -> /opt/aws/as
Сертификаты pk-***.pem и cert-***.pem положим в /opt/aws/keys.
Теперь сконфигурируем профиль bash, вставив следующие строки в .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