EC2 Autoscaling. Жизненный цикл.

Жизненный цикл инстанции в Autoscaling Group начинается с события «Scale OUT», когда по какому-то триггеру в группу добавляется новая инстанция. Триггеры могут быть совершенно различные – срабатывание Alarm на увеличение загрузки инстанции, увеличение желаемого числа инстанций в группе и т.д. После события «Scale OUT» инстанция попадает в состояние «Pending». Тут инстанция создается и запускается в соответствии тому, что описано «Launch Configuration» — шаблоне, где описано что запускать. «User Data» скрипт тоже исполняется на этом шаге. После того как инстанция запустилась и доступна срабатывает «EC2_INSTANCE_LAUNCHING lifecycle hook» и инстанция переходит в состояние «Pending:Wait» и выходит из этого состояния по завершению работы хука. Аналогичный хук срабатывает при прерывании инстанции и выхода ее из Autoscaling Group. Также инстанция может быть принудительно выведена из Autoscaling Group, добавлена в нее или переведена в состояние «Standby», например для исследования проблем, связанных с инстанцией.

На диаграмме ниже показан жизненный цикл инстанции в Autoscaling Group.

Теперь немного подробнее о том, как это использовать.

Lifecycle Hooks

Хуки помогают контролировать процесс запуска/остановки инстанции. Могут быть использованы для выполнения каких-либо автоматических действий во время запуска/остановки инстанции, например, для установки и конфигурирования ПО, или проверки чего-либо во время запуска; удаления временных файлов и закрытия соединения во время прерывания работы инстанции.

Инстанция может находится в состоянии «Pending: Wait» или «Terminating: Wait» определенное время. Это или время, необходимое для работы хука или определенный timeout, зависит от того, что наступит раньше. Значение timeout по умолчанию равно один час (3600 секунд), однако это можно переопределить или опцией «—heartbeat-timeout» команды «put-lifecycle-hook» или перезапустив таймер командой «record-lifecycle-action-heartbeat». Максимальное время, на которое может быть увеличен timeout 48 часов. Завершение работы хука должно происходить вызовом команды «complete-lifecycle-action», именно так инстанция переводится в следующее состояние.

Создается хук командой «put-lifecycle-hook», например команда ниже создаст хук «hook-name» для Autoscaling Group «asg-group-name»:

$ aws autoscaling put-lifecycle-hook --lifecycle-hook-name hook-name --auto-scaling-group-name asg-group-name --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING 


После того как хук создан, можно посмотреть что получилось:

$ aws --region eu-central-1 autoscaling describe-lifecycle-hooks --auto-scaling-group-name asg-group-name --lifecycle-hook-names hook-name 
{
    "LifecycleHooks": [
        {
            "LifecycleHookName": "hook-name",
            "AutoScalingGroupName": "asg-group-name",
            "LifecycleTransition": "autoscaling:EC2_INSTANCE_LAUNCHING",
            "HeartbeatTimeout": 3600,
            "GlobalTimeout": 172800,
            "DefaultResult": "ABANDON"
        }
    ]
}

Результатом работы хука может быть или ABANDON, или CONTINUE. По умолчанию – ABANDON. CONTINUE показывает, что работа хука завершилась успешно и инстанцию можно переводить в состоянии «InService», инстанция в этом случае начнет получать трафик, например от ELB. ABANDON же показывает, что во время работы хука что-то пошло не так. В этом случае инстанция будет терминирована. Если хук создан на переход из состояния «Terminating:Wait» в состояние «Terminating:Processed», то инстанция будет терминирована все зависимости от результата работы хука. Однако если результат был неуспешным (ABANDON), то также будут прекращены все действия, связанные с этой инстанцией (например работа других хуков).
С помощью хуков можно делать следующие действия:

  1. Определить CloudWatch Event и обрабатывать это событие каким-то образом, например вызвав Lambda функцию. Событие, которое придёт в функцию будет содержать ID инстанции, которая запускается или терминируется, а также специальный токен для управления хуком.
  2. Посылать сообщения в Amazon SNS, Amazon SQS
  3. Создать скрипт, положить его в «User data» и управлять хуком из скрипта.

Еще несколько замечаний по поводу хуков.

  1. Cooldown и Health Check Grace Period начинают действовать после отработки хука
  2. Хуки можно использовать со Spot инстанциями, однако это не защитит от выключения инстанции связанное с ценой на Spot инстанции.

Standby State

Инстанцию, находящуюся в статусе «InService», можно перевести в состояние «Standby». В этом состояние инстанция не покидает в Autoscaling Group, однако перестает получать трафик. Это нужно, например, для ручного апдейта инстанции или устранения каких-то проблем на инстанции.  Инстанция будет находится в состояние «Standby» до выхода из этого состояния, никаких автоматических выходом не предусмотрено.  Если инстанция подключена к балансировщику нагрузок, то во время перехода в состояние «Standby», она удаляется из списка балансировщика и автоматически возвращается в список по выходу из состояния «Standby».

Когда инстанция входит в состояние «Standby», по умолчанию, происходит уменьшение параметра «Desire capacity» — желаемое количество инстанций в группе. Это предотвращает создание еще одной инстанции. При выходе из состояния «Standby» обратно происходит увеличение параметра «Desire capacity». Однако это поведение по умолчанию можно менять в зависимости от потребностей.

Управлять состояниями инстанции можно или из консоли, или с помощью API. Например с помощью командной строки это выглядит следующим образом:
Поместить инстанцию в состояние «Standby»:

$ aws autoscaling enter-standby --instance-ids i-5b73d709 --auto-scaling-group-name my-asg --should-decrement-desired-capacity

Вывести из состояния «Standby»:

$ aws autoscaling exit-standby --instance-ids i-5b73d709 --auto-scaling-group-name my-asg

Также можно вывести (Detach) и вернуть обратно (Attach) инстанцию из Autoscaling Group. Когда инстанция выводится из группы, то она становится независимой и перестает управляться Autoscaling Group. Например, она не будет удалена при удалении группы. Можно таким образом перевести инстанцию из одной группы в другую. Взять инстанцию с другим типом и поместить ее в Autoscaling Group. Вопрос – можно ли таким образом создать группу, состоящую из Spot инстанций и поместить в нее несколько инстанций OnDemand тем самым застраховать себя от момента, когда все Spot инстанции будет терминированы из-за разницы в цене?

Еще одной интересной возможностью управления Autoscaling Group является приостановка процессов. Можно приостанавливать процессы запуска, терминирования, добавления к балансировщику нагрузок и т. д. В консоли это выглядит следующим образом:

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *