Configuración del escalado automático con Azure PowerShell

El escalado automático ayuda a garantizar que tiene la cantidad adecuada de recursos en ejecución para administrar las fluctuaciones de carga de la aplicación. Puede configurar el escalado automático mediante el portal de Azure, CLI de Azure, Azure PowerShell o plantillas de ARM o Bicep.

En este artículo, se muestra cómo configurar el escalado automático para un conjunto de escalado de máquinas virtuales con PowerShell. Las configuraciones usan los pasos siguientes:

  • Cree un conjunto de escalado de máquinas virtuales que pueda escalar automáticamente.
  • Cree reglas para reducir y ampliar la escala.
  • Cree un perfil que use sus reglas.
  • Aplique la configuración de escalado automático.
  • Actualice la configuración de autoescalado con notificaciones.

Prerrequisitos

Para configurar el escalado automático mediante PowerShell, necesita una cuenta de Azure con una suscripción activa. También puede crear una cuenta de forma gratuita.

Configurar el entorno

Note

Ejecute los ejemplos en la misma sesión de PowerShell con la suscripción deseada seleccionada.

# 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"

Creación de un conjunto de escalado de máquinas virtuales

En el ejemplo siguiente de Azure PowerShell se usan los cmdlets New-AzResourceGroup y New-AzVmss.

Note

Utilice un grupo de recursos dedicado para este ejemplo, de modo que pueda eliminar sus recursos cuando haya terminado.

En el ejemplo se crea una dirección IP pública. Para el acceso de administración, use Azure Bastion en lugar de exponer puertos RDP o SSH a Internet.

# 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

Crear configuración de escalabilidad automática

Para crear una configuración de escalado automático mediante PowerShell, siga la secuencia siguiente:

  1. Cree reglas mediante New-AzAutoscaleScaleRuleObject.
  2. Cree un perfil mediante New-AzAutoscaleProfileObject.
  3. Cree la configuración de escalado automático mediante New-AzAutoscaleSetting.
  4. Actualice la configuración mediante Update-AzAutoscaleSetting.

Creación de reglas

Crea reglas de reducción y ampliación de escala y, a continuación, asígnalas a un perfil.

En el ejemplo de Azure PowerShell siguiente se usa el New-AzAutoscaleScaleRuleObject cmdlet .

Note

Crea dos reglas:

  • Escalar cuando el porcentaje de CPU supera el 70 %.
  • Reduce la escala cuando el porcentaje de uso de la CPU sea inferior al 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

En la tabla siguiente, se describen los parámetros usados en el cmdlet New-AzAutoscaleScaleRuleObject.

Parámetro Descripción
MetricTriggerMetricName Establece la métrica del desencadenador de escalado automático
MetricTriggerMetricResourceUri Especifica el recurso al que pertenece la métrica MetricTriggerMetricName. MetricTriggerMetricResourceUri puede ser cualquier recurso y no solo el recurso que se está escalando. Por ejemplo, puede escalar Virtual Machine Scale Sets en función de las métricas creadas por un equilibrador de carga, una base de datos o el propio conjunto de escalado. El MetricTriggerMetricName debe existir para el MetricTriggerMetricResourceUri especificado.
MetricTriggerTimeGrain Frecuencia de muestreo de la métrica que supervisa la regla. MetricTriggerTimeGrain debe ser uno de los valores predefinidos para la métrica especificada y deberá estar entre 12 horas y 1 minuto. Por ejemplo, MetricTriggerTimeGrain = PT1M"* significa que las métricas se muestrean cada 1 minuto y que se agregan mediante el método de agregación especificado en MetricTriggerStatistic.
MetricTriggerTimeAggregation El método de agregación del período timeGrain. Por ejemplo, statistic = "Average" y timeGrain = "PT1M" significa que las métricas se agregan cada minuto tomando la media.
MetricTriggerStatistic Método de agregación que se usa para agregar métricas muestreadas. Por ejemplo, TimeAggregation = "Average" agregará las métricas muestreadas teniendo en cuenta la media.
MetricTriggerTimeWindow Cantidad de tiempo que el motor de escalado automático vuelve a considerar para agregar la métrica. Este valor debe ser mayor que el retraso en la colección de métricas, que varía por recurso. Debe estar comprendido entre 5 minutos y 12 horas. Por ejemplo, 10 minutos significa que, cada vez que se ejecute la escalabilidad automática, se consultarán las métricas de los últimos 10 minutos. Esta característica permite que las métricas se estabilicen e impide que reaccionen a picos transitorios.
MetricTriggerThreshold Define el valor de la métrica que desencadena un evento de escala.
MetricTriggerOperator Especifica el funcionamiento comparativo lógico que se vaya a usar al evaluar el valor de la métrica.
MetricTriggerDividePerInstance Cuando se establece para true dividirá la métrica del desencadenador por el número total de instancias. Por ejemplo, si el recuento de mensajes fuera 300 y hubiera cinco instancias en ejecución, el valor de la métrica calculada será de 60 mensajes por instancia. Esta propiedad no es aplicable a todas las métricas.
ScaleActionDirection Especifique el escalado hacia adentro o hacia afuera. Los valores válidos son Increase y Decrease.
ScaleActionType Escale por un número específico de instancias, escale a un recuento de instancias específico o escale por porcentaje del recuento de instancias actual. Los valores válidos son ChangeCount, ExactCount y PercentChangeCount.
ScaleActionCooldown El tiempo mínimo que debe transcurrir tras una operación de escalado para que esta regla pueda iniciar otra acción de escalado. El escalado automático comprueba el tiempo de espera de cada regla de forma independiente. El periodo de enfriamiento permite que las métricas se estabilicen y evita el flapping.

Creación de un perfil de escalado automático predeterminado y asociación de las reglas

Después de definir las reglas de escalado, cree un perfil. El perfil especificará los límites predeterminados, superiores e inferiores de recuento de instancias, y las horas en que se podrán aplicar las reglas asociadas.

En el ejemplo de Azure PowerShell siguiente se usa el New-AzAutoscaleProfileObject cmdlet .

Note

Como este perfil es un perfil predeterminado, no tiene ningún parámetro de programación. El perfil predeterminado está activo cuando ningún otro perfil esté activo.

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

En la tabla siguiente, se describen los parámetros usados en el cmdlet New-AzAutoscaleProfileObject.

Parámetro Descripción
CapacityDefault El número de instancias que serán si las métricas no estuvieran disponibles para la evaluación. El valor predeterminado solo se utiliza si el número de instancias actual es menor que el predeterminado.
CapacityMaximum Número máximo de instancias para el recurso. El número máximo de instancias está limitado por el número de núcleos disponibles en la suscripción.
CapacityMinimum Número mínimo de instancias del recurso.
FixedDateEnd Hora de finalización del perfil en formato ISO 8601.
FixedDateStart Hora de inicio del perfil en formato ISO 8601.
Rule Una colección de reglas que proporcionan los desencadenadores y los parámetros de la acción de escalado cuando el perfil esté activo. Se pueden especificar un máximo de 10 reglas separadas por comas.
RecurrenceFrequency Con qué frecuencia surte efecto el perfil programado. Este valor puede ser week.
ScheduleDay Colección de días en los que el perfil surte efecto al especificar una programación periódica. Los valores posibles son de domingo a sábado. Para obtener más información sobre las programaciones periódicas, consulte Perfiles recurrentes con PowerShell.
ScheduleHour Una colección de horas en las que se aplica el perfil. Los valores admitidos son de 0 a 23.
ScheduleMinute Una colección de momentos exactos en que el perfil entra en vigor.
ScheduleTimeZone Zona horaria de las horas del perfil.

Aplicación de la configuración de escalado automático

Después de definir las reglas y el perfil, aplique la configuración de escalado automático. Para actualizar una configuración de escalado automático existente, use Update-AzAutoscaleSetting.

En el ejemplo de Azure PowerShell siguiente se usa el New-AzAutoscaleSetting cmdlet .

# 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

Adición de notificaciones a la configuración de escalado automático

Agregue notificaciones a la configuración de escalado automático para desencadenar un webhook o enviar notificaciones por correo electrónico cuando se produce un evento de escalado.

En el ejemplo de Azure PowerShell siguiente se usa el New-AzAutoscaleWebhookNotificationObject cmdlet .

# Set variables
$webhookUri = "<WebhookUri>"

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

En el ejemplo siguiente Azure PowerShell se usa el New-AzAutoscaleNotificationObject cmdlet para configurar el webhook y las notificaciones por correo electrónico.

Note

Utiliza un punto de conexión HTTPS para el webhook.

# Set variables
$notificationEmail = "<NotificationEmail>"

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

En el ejemplo de Azure PowerShell siguiente se usa el Update-AzAutoscaleSetting cmdlet para aplicar la notificación.

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

# Update the autoscale notification
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Revise la configuración de la escalabilidad automática

En el siguiente Azure PowerShell ejemplo se usa el Get-AzAutoscaleSetting cmdlet para recuperar la configuración de escalado automático.

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

En el ejemplo de Azure PowerShell siguiente se usa el Get-AzAutoscaleHistory cmdlet .

Note

Consulta el historial de la configuración de escalado automático, no el identificador de recurso del conjunto de escalado.

# 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

Perfiles programados y recurrentes

Note

Al actualizar Profile, incluya todos los perfiles que quiera conservar. En los ejemplos siguientes se agregan perfiles a la configuración creada anteriormente en este artículo. Conserve los demás perfiles al adaptarlos a otra configuración de escalado automático.

Agregar un perfil programado para un evento especial

Configure perfiles de escalado automático para escalar de forma diferente para eventos específicos. Por ejemplo, durante un día, cuando la demanda sea mayor de lo habitual, cree un perfil con un aumento máximo y mínimo de los límites de instancia.

En el ejemplo siguiente de Azure PowerShell se usan los cmdlets New-AzAutoscaleProfileObject y Update-AzAutoscaleSetting.

Note

En el ejemplo siguiente se usan las mismas reglas que el perfil predeterminado definido anteriormente, pero se establecen nuevos límites de instancia para una fecha específica. También puede configurar reglas diferentes para usarlas con el nuevo perfil. Los valores de inicio y finalización usan marcas de tiempo ISO 8601 en 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

Agregar un perfil programado recurrente

Los perfiles periódicos permiten programar perfiles de escalado que se repetirán cada semana.

Mientras que los perfiles programados tienen fecha de inicio y de finalización, los perfiles periódicos no tienen hora de finalización. Un perfil permanecerá activo hasta la hora de inicio del perfil siguiente. Por lo tanto, al crear perfiles periódicos, deberá crear un perfil predeterminado periódico que se inicie cuando desee que finalice el perfil periódico anterior.

En el ejemplo siguiente de Azure PowerShell se usan los cmdlets New-AzAutoscaleProfileObject y Update-AzAutoscaleSetting.

Note

Por ejemplo, escale a una sola instancia los fines de semana de viernes por la noche a lunes por la mañana. Para configurar un perfil de fin de semana que comienza el viernes por la noche y termina el lunes por la mañana, cree un perfil que comience el viernes por la noche y, a continuación, cree un perfil periódico con su configuración predeterminada que comienza el lunes por la mañana.

Crea un perfil de fin de semana y un perfil predeterminado periódico para finalizar el perfil de fin de semana, a la vez que conserva los perfiles predeterminados y de fecha fija de los pasos anteriores.

# 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

Para obtener más información sobre los perfiles programados, consulte Escalabilidad automática con varios perfiles.

Otros comandos de escalabilidad automática

Para obtener una lista completa de los cmdlets de PowerShell para el escalado automático, consulte el Explorador de módulos de PowerShell.

Limpieza de recursos

Para limpiar los recursos que creó en este tutorial, elimine el grupo de recursos dedicado que creó. El siguiente cmdlet elimina el grupo de recursos y todos sus recursos.

En el ejemplo de Azure PowerShell siguiente se usa el Remove-AzResourceGroup cmdlet .

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