Настройка автомасштабирования с помощью Azure PowerShell

Автомасштабирование гарантирует, что у вас имеется достаточное количество ресурсов для обработки изменяющейся нагрузки вашего приложения. Вы можете настроить автомасштабирование с помощью портала Azure, Azure CLI, Azure PowerShell или шаблонов ARM или Bicep.

В этой статье показано, как настроить автомасштабирование для масштабируемого набора виртуальных машин с помощью PowerShell. Конфигурации выполняются в следующих шагах.

  • Создайте группу масштабирования, которую можно автомасштабировать.
  • Создайте правила для уменьшения масштаба и увеличения масштаба.
  • Создайте профиль, использующий ваши правила.
  • Примените параметры автомасштабирования.
  • Обновите параметры автомасштабирования и уведомления.

Требования

Чтобы настроить автомасштабирование с помощью PowerShell, требуется учетная запись Azure с активной подпиской. Вы можете создать учетную запись бесплатно.

Настройка среды

Note

Запустите примеры в одном сеансе PowerShell с выбранной подпиской.

# Set variables
$resourceGroupName = "<ResourceGroupName>"
$vmssName = "<VirtualMachineScaleSetName>"
$autoscaleName = "<AutoscaleSettingName>"
$azureRegion = "<AzureRegion>"
$virtualNetworkName = "<VirtualNetworkName>"
$subnetName = "<SubnetName>"
$publicIpAddressName = "<PublicIpAddressName>"
$loadBalancerName = "<LoadBalancerName>"

# Get the subscription ID from the current Azure PowerShell context
$subscriptionId = (Get-AzContext).Subscription.Id

# Build virtual machine scale set resource ID
$vmssPath = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
$vmssProvider = "Microsoft.Compute/virtualMachineScaleSets/$vmssName"
$vmssResourceId = "$vmssPath/providers/$vmssProvider"

Создайте масштабируемый набор виртуальных машин

В следующем Azure PowerShell примере используются New-AzResourceGroup командлеты и New-AzVmss командлеты.

Note

Используйте выделенную группу ресурсов для этого примера, чтобы удалить ее ресурсы после завершения.

В примере создается общедоступный IP-адрес. Для доступа к управлению используйте Бастион Azure вместо открытия портов RDP или SSH для доступа из Интернета.

# Create the resource group
New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location $azureRegion

# Get credentials for the virtual machine scale set
$vmCredential = Get-Credential

# Define parameters for New-AzVmss
$newAzVmssParams = @{
    ResourceGroupName   = $resourceGroupName
    Location            = $azureRegion
    VMScaleSetName      = $vmssName
    Credential          = $vmCredential
    VirtualNetworkName  = $virtualNetworkName
    SubnetName          = $subnetName
    PublicIpAddressName = $publicIpAddressName
    LoadBalancerName   = $loadBalancerName
    OrchestrationMode  = "Flexible"
}

# Create the virtual machine scale set
New-AzVmss @newAzVmssParams

Создание параметров автомасштабирования

Чтобы создать параметр автомасштабирования с помощью PowerShell, выполните следующую последовательность:

  1. Создавайте правила с помощью New-AzAutoscaleScaleRuleObject.
  2. Создайте профиль с помощью New-AzAutoscaleProfileObject.
  3. Создайте параметры автомасштабирования с помощью New-AzAutoscaleSetting.
  4. Обновите параметры с помощью Update-AzAutoscaleSetting.

Создание правил

Создайте правила уменьшения масштаба и горизонтального масштабирования, а затем свяжите их с профилем.

В следующем примере Azure PowerShell используется командлет New-AzAutoscaleScaleRuleObject.

Note

Создаются два правила:

  • Выполнить горизонтальное масштабирование, если процент ЦП превышает 70 %.
  • Уменьшение масштаба в случае, если процент ЦП меньше 30%.
# Define parameters for New-AzAutoscaleScaleRuleObject
$newAzAutoscaleScaleRuleObjectParams = @{
    MetricTriggerMetricName        = "Percentage CPU"
    MetricTriggerMetricResourceUri  = $vmssResourceId
    MetricTriggerTimeGrain          = New-TimeSpan -Minutes 1
    MetricTriggerStatistic         = "Average"
    MetricTriggerTimeWindow         = New-TimeSpan -Minutes 5
    MetricTriggerTimeAggregation    = "Average"
    MetricTriggerOperator          = "GreaterThan"
    MetricTriggerThreshold         = 70
    MetricTriggerDividePerInstance = $false
    ScaleActionDirection           = "Increase"
    ScaleActionType                = "ChangeCount"
    ScaleActionValue               = "1"
    ScaleActionCooldown            = New-TimeSpan -Minutes 5
}
$scaleOutRule = New-AzAutoscaleScaleRuleObject @newAzAutoscaleScaleRuleObjectParams

# Define parameters for New-AzAutoscaleScaleRuleObject
$newAzAutoscaleScaleRuleObjectParams = @{
    MetricTriggerMetricName        = "Percentage CPU"
    MetricTriggerMetricResourceUri  = $vmssResourceId
    MetricTriggerTimeGrain          = New-TimeSpan -Minutes 1
    MetricTriggerStatistic         = "Average"
    MetricTriggerTimeWindow         = New-TimeSpan -Minutes 5
    MetricTriggerTimeAggregation    = "Average"
    MetricTriggerOperator          = "LessThan"
    MetricTriggerThreshold         = 30
    MetricTriggerDividePerInstance = $false
    ScaleActionDirection           = "Decrease"
    ScaleActionType                = "ChangeCount"
    ScaleActionValue               = "1"
    ScaleActionCooldown            = New-TimeSpan -Minutes 5
}
$scaleInRule = New-AzAutoscaleScaleRuleObject @newAzAutoscaleScaleRuleObjectParams

В таблице ниже описаны параметры, используемые в командлете New-AzAutoscaleScaleRuleObject .

Параметр Описание
MetricTriggerMetricName Задает метрику триггера автомасштабирования
MetricTriggerMetricResourceUri Указывает ресурс, к которому MetricTriggerMetricName принадлежит метрика. MetricTriggerMetricResourceUri может быть любым ресурсом, а не только масштабируемым ресурсом. Например, можно масштабировать наборы виртуальных машин на основе метрик, которые создаются подсистемой балансировки нагрузки, базой данных или самим набором. Для указанного MetricTriggerMetricName обязательно должно существовать MetricTriggerMetricResourceUri.
MetricTriggerTimeGrain Частота выборки метрики, отслеживаемой правилом. MetricTriggerTimeGrain должно быть одним из предопределенных значений для указанной метрики и должно составлять от 12 часов до 1 минуты. Например, MetricTriggerTimeGrain = PT1M"* означает, что метрики выборки выполняются каждую минуту и агрегируются с помощью метода агрегирования, указанного в MetricTriggerStatistic.
MetricTriggerTimeAggregation Метод агрегирования, используемый в течение периода timeGrain. Например, статистика = "Среднее" и timeGrain = "PT1M" означает, что метрики агрегируются каждые 1 минуты, принимая среднее значение.
MetricTriggerStatistic Метод агрегирования метрик выборки. Например, TimeAggregation = "Среднее" агрегирует образцы метрик, принимая среднее значение.
MetricTriggerTimeWindow Промежуток времени, в течение которого система автомасштабирования анализирует прошлые метрики для их агрегации. Это значение должно быть больше задержки в коллекции метрик, которая зависит от ресурса. Период времени должен составлять от 5 минут до 12 часов. Например, 10 минут означает, что при каждом запуске автомасштабирования он запрашивает метрики за последние 10 минут. Эта функция позволяет метрикам стабилизировать и избегать реагирования на временные пики.
MetricTriggerThreshold Определяет значение метрики, которая активирует событие масштабирования.
MetricTriggerOperator Указывает логическую сопоставительную операцию, используемую при оценке значения метрики.
MetricTriggerDividePerInstance Если указано, true делит метрику триггера на общее количество экземпляров. Например, если число сообщений равно 300, а запущено 5 экземпляров, вычисляемое значение метрики составляет 60 сообщений на экземпляр. Это свойство не применимо ко всем метрикам.
ScaleActionDirection Укажите масштабирование в или вне. Допустимые значения: Increase и Decrease.
ScaleActionType Масштабирование по определенному количеству экземпляров, масштабирование до определенного числа экземпляров или масштабирование по проценту текущего числа экземпляров. Допустимыми значениями являются ChangeCount, ExactCount и PercentChangeCount.
ScaleActionCooldown Минимальный промежуток времени, который должен пройти после операции масштабирования, прежде чем это правило сможет инициировать следующее действие масштабирования. Автомасштабирование проверяет период восстановления для каждого правила независимо. Период ожидания позволяет метрикам стабилизироваться и предотвращает колебания.

Создание профиля автомасштабирования по умолчанию и связывание правил

После определения правил масштабирования создайте профиль. Профиль задает ограничения по умолчанию, верхнему и нижнему числу экземпляров и времени применения связанных правил.

В следующем примере Azure PowerShell используется командлет New-AzAutoscaleProfileObject.

Note

Так как этот профиль является профилем по умолчанию, он не имеет параметров расписания. Профиль по умолчанию активен в то время, когда другие профили не являются активными.

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name            = "default"
    CapacityDefault = "1"
    CapacityMaximum = "10"
    CapacityMinimum = "1"
    Rule            = @($scaleOutRule, $scaleInRule)
}
$defaultProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

В таблице ниже описаны параметры, используемые в командлете New-AzAutoscaleProfileObject .

Параметр Описание
CapacityDefault Количество экземпляров в случаях, когда метрики недоступны для оценки. Значение по умолчанию используется только в том случае, если текущее число экземпляров меньше, чем значение по умолчанию.
CapacityMaximum Максимальное количество экземпляров ресурса. Максимальное количество экземпляров ограничивается числом ядер, доступных в подписке.
CapacityMinimum Минимальное количество экземпляров ресурса.
FixedDateEnd Время окончания профиля в формате ISO 8601 для.
FixedDateStart Время начала профиля в формате ISO 8601.
Rule Коллекция правил, которые предоставляют триггеры и параметры для действия масштабирования, когда этот профиль активен. Можно указать не более 10 разделяемых запятыми правил.
RecurrenceFrequency Как часто запланированный профиль вступает в силу. Это значение должно быть week.
ScheduleDay Коллекция дней, на которые действует профиль при указании повторяющегося расписания. Возможные значения: от воскресенья до субботы. Дополнительные сведения о повторяющихся расписаниях см. в разделе Повторяющиеся профили с помощью PowerShell.
ScheduleHour Набор часов, на которые распространяется действие профиля. Поддерживаемые значения — от 0 до 23.
ScheduleMinute Коллекция минут, в течение которых профиль вступает в силу.
ScheduleTimeZone Часовой пояс профиля.

Применение параметров автомасштабирования

После определения правил и профиля примените параметры автомасштабирования. Чтобы обновить существующий параметр автомасштабирования, используйте Update-AzAutoscaleSetting.

В следующем примере Azure PowerShell используется командлет New-AzAutoscaleSetting.

# Define parameters for New-AzAutoscaleSetting
$newAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Location          = $azureRegion
    Profile           = @($defaultProfile)
    Enabled           = $true
    PropertiesName    = $autoscaleName
    TargetResourceUri = $vmssResourceId
}

# Create the autoscale setting
New-AzAutoscaleSetting @newAzAutoscaleSettingParams

Добавление уведомлений в параметры автомасштабирования

Добавьте уведомления в параметр автомасштабирования для активации вебхука или отправки уведомлений по электронной почте при возникновении события масштабирования.

В следующем примере Azure PowerShell используется командлет New-AzAutoscaleWebhookNotificationObject.

# Set variables
$webhookUri = "<WebhookUri>"

# Create the webhook notification
$webhook = New-AzAutoscaleWebhookNotificationObject -Property @{} -ServiceUri $webhookUri

В следующем примере Azure PowerShell используется командлет New-AzAutoscaleNotificationObject для настройки уведомлений веб-перехватчика и электронной почты.

Note

Используйте HTTPS-эндпоинт для вебхука.

# Set variables
$notificationEmail = "<NotificationEmail>"

# Define parameters for New-AzAutoscaleNotificationObject
$newAzAutoscaleNotificationObjectParams = @{
    EmailCustomEmail                      = @($notificationEmail)
    EmailSendToSubscriptionAdministrator   = $true
    EmailSendToSubscriptionCoAdministrator = $true
    Webhook                               = @($webhook)
}
$notification = New-AzAutoscaleNotificationObject @newAzAutoscaleNotificationObjectParams

В следующем примере Azure PowerShell используется командлет Update-AzAutoscaleSetting для применения уведомления.

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Notification      = @($notification)
}

# Update the autoscale notification
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Просмотр параметров автомасштабирования

В следующем примере Azure PowerShell используется командлет Get-AzAutoscaleSetting для получения параметра автомасштабирования.

# Define parameters for Get-AzAutoscaleSetting
$getAzAutoscaleSettingParams = @{
    ResourceGroupName = $resourceGroupName
    Name              = $autoscaleName
}
$autoscaleSetting = Get-AzAutoscaleSetting @getAzAutoscaleSettingParams
$autoscaleSetting | Select-Object -Property *

В следующем примере Azure PowerShell используется командлет Get-AzAutoscaleHistory.

Note

Он запрашивает историю параметра автомасштабирования, а не идентификатор ресурса масштабируемого набора.

# Build autoscale setting resource ID
$autoscalePath = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName"
$autoscaleProvider = "Microsoft.Insights/autoscaleSettings/$autoscaleName"
$autoscaleResourceId = "$autoscalePath/providers/$autoscaleProvider"

# Retrieve the autoscale history
Get-AzAutoscaleHistory -ResourceId $autoscaleResourceId

Запланированные и повторяющиеся задачи

Note

При обновлении Profileвключите каждый профиль, который вы хотите сохранить. В следующих примерах профили добавляются в настройку, созданную ранее в этой статье. Оставляйте без изменений любые другие профили при адаптации их к другому параметру автоматического масштабирования.

Добавить запланированный профиль для специального события

Настройте профили автомасштабирования для масштабирования по-разному для определенных событий. Например, в течение дня, когда спрос будет выше обычного, создайте профиль с повышенными максимальными и минимальными ограничениями экземпляров.

В следующем примере Azure PowerShell используются командлеты New-AzAutoscaleProfileObject и Update-AzAutoscaleSetting.

Note

В следующем примере используются те же правила, что и в профиле по умолчанию, определенном ранее, но задаются новые ограничения для экземпляров на определенную дату. Вы также можете настроить различные правила для использования с новым профилем. Начальные и конечные значения используют метки времени ISO 8601 в формате UTC.

# Set variables
$startTime = "<StartTime>"
$endTime = "<EndTime>"

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name              = "High-demand-day"
    CapacityDefault   = "7"
    CapacityMaximum   = "30"
    CapacityMinimum   = "5"
    FixedDateEnd      = [datetime]::Parse($endTime)
    FixedDateStart    = [datetime]::Parse($startTime)
    FixedDateTimeZone = "UTC"
    Rule              = @($scaleOutRule, $scaleInRule)
}
$highDemandDay = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Profile           = @($defaultProfile, $highDemandDay)
}

# Update the autoscale profiles
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Добавление повторяющегося запланированного профиля

Повторяющиеся профили позволяют запланировать профиль масштабирования, повторяющийся каждую неделю.

Хотя запланированные профили имеют дату начала и окончания, повторяющиеся профили не имеют времени окончания. Профиль остается активным до момента начала следующего профиля. Поэтому при создании повторяющегося профиля необходимо создать повторяющийся профиль по умолчанию, который начинается при завершении предыдущего повторяющегося профиля.

В следующем Azure PowerShell примере используются New-AzAutoscaleProfileObject командлеты и Update-AzAutoscaleSetting командлеты.

Note

Например, масштабирование до одного экземпляра в выходные с пятницы вечером до понедельника утром. Чтобы настроить профиль выходных, который начинается в пятницу вечером и заканчивается в понедельник утром, создайте профиль, который начинается в пятницу вечером, а затем создайте повторяющийся профиль с параметрами по умолчанию, который начинается в понедельник утром.

Он создает профиль выходных и повторяющийся профиль по умолчанию для завершения профиля выходных, сохраняя профили по умолчанию и с фиксированной датой из предыдущих шагов.

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name                = "Weekend"
    CapacityDefault     = "1"
    CapacityMaximum     = "1"
    CapacityMinimum     = "1"
    RecurrenceFrequency = "Week"
    ScheduleDay         = @("Friday")
    ScheduleHour        = @(22)
    ScheduleMinute      = @(0)
    ScheduleTimeZone    = "Pacific Standard Time"
    Rule                = @($scaleOutRule, $scaleInRule)
}
$fridayProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for New-AzAutoscaleProfileObject
$newAzAutoscaleProfileObjectParams = @{
    Name                = "default recurring profile"
    CapacityDefault     = "2"
    CapacityMaximum     = "10"
    CapacityMinimum     = "2"
    RecurrenceFrequency = "Week"
    ScheduleDay         = @("Monday")
    ScheduleHour        = @(0)
    ScheduleMinute      = @(0)
    ScheduleTimeZone    = "Pacific Standard Time"
    Rule                = @($scaleOutRule, $scaleInRule)
}
$defaultRecurringProfile = New-AzAutoscaleProfileObject @newAzAutoscaleProfileObjectParams

# Define parameters for Update-AzAutoscaleSetting
$updateAzAutoscaleSettingParams = @{
    Name              = $autoscaleName
    ResourceGroupName = $resourceGroupName
    Profile           = @(
        $defaultProfile
        $highDemandDay
        $defaultRecurringProfile
        $fridayProfile
    )
}

# Update the autoscale profiles
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Дополнительные сведения о запланированных профилях см. в разделе "Автомасштабирование" с несколькими профилями.

Другие команды автомасштабирования

Полный список командлетов PowerShell для автомасштабирования см. в браузере модуля PowerShell.

Очистка ресурсов

Чтобы очистить ресурсы, созданные в этом руководстве, удалите созданную выделенную группу ресурсов. Следующий командлет удаляет группу ресурсов и все ее ресурсы.

В следующем примере Azure PowerShell используется командлет Remove-AzResourceGroup.

# Delete the example resource group
Remove-AzResourceGroup -Name $resourceGroupName