Configuración del escalado automático con PowerShell

La configuración de escalado automático le ayuda a asegurarse de 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 las plantillas de Azure Portal, la CLI de Azure, PowerShell, 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 con los pasos siguientes:

  • Creación de un conjunto de escalado que se pueda escalar automáticamente
  • Creación de reglas para reducir horizontalmente y escalar horizontalmente
  • Crear de un perfil que use sus reglas
  • Aplicación de la configuración de escalado automático
  • Actualización de la configuración de escalado automático 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

#Set the subscription Id, VMSS name, and resource group name
$subscriptionId = (Get-AzContext).Subscription.Id
$resourceGroupName="rg-powershell-autoscale"
$vmssName="vmss-001"

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

Cree un conjunto de escalado con los siguientes cmdlets. Establezca las variables $resourceGroupName y $vmssName para ajustarse a su entorno.

# create a new resource group
New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location "EastUS"

# Create login credentials for the VMSS
$Cred = Get-Credential
$vmCred = New-Object System.Management.Automation.PSCredential($Cred.UserName, $Cred.Password)


New-AzVmss `
 -ResourceGroupName $resourceGroupName `
 -Location "EastUS" `
 -VMScaleSetName $vmssName `
 -Credential $vmCred `
 -VirtualNetworkName "myVnet" `
 -SubnetName "mySubnet" `
 -PublicIpAddressName "myPublicIPAddress" `
 -LoadBalancerName "myLoadBalancer" `
 -OrchestrationMode "Flexible"

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 usando Update-AzAutoscaleSetting

Creación de reglas

Cree reglas de reducción horizontal y escalado horizontal y, después, asócielas a un perfil. Las reglas se crean mediante el New-AzAutoscaleScaleRuleObject.

En el siguiente script de PowerShell se crean dos reglas.

  • Escalar horizontalmente cuando el porcentaje de CPU supere el 70 %
  • Reducir horizontalmente cuando el porcentaje de CPU sea inferior al 30 %

$rule1=New-AzAutoscaleScaleRuleObject `
    -MetricTriggerMetricName "Percentage CPU" `
    -MetricTriggerMetricResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  `
    -MetricTriggerTimeGrain ([System.TimeSpan]::New(0,1,0)) `
    -MetricTriggerStatistic "Average" `
    -MetricTriggerTimeWindow ([System.TimeSpan]::New(0,5,0)) `
    -MetricTriggerTimeAggregation "Average" `
    -MetricTriggerOperator "GreaterThan" `
    -MetricTriggerThreshold 70 `
    -MetricTriggerDividePerInstance $false `
    -ScaleActionDirection "Increase" `
    -ScaleActionType "ChangeCount" `
    -ScaleActionValue 1 `
    -ScaleActionCooldown ([System.TimeSpan]::New(0,5,0))


$rule2=New-AzAutoscaleScaleRuleObject `
    -MetricTriggerMetricName "Percentage CPU" `
    -MetricTriggerMetricResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  `
    -MetricTriggerTimeGrain ([System.TimeSpan]::New(0,1,0)) `
    -MetricTriggerStatistic "Average" `
    -MetricTriggerTimeWindow ([System.TimeSpan]::New(0,5,0)) `
    -MetricTriggerTimeAggregation "Average" `
    -MetricTriggerOperator "LessThan" `
    -MetricTriggerThreshold 30 `
    -MetricTriggerDividePerInstance $false `
    -ScaleActionDirection "Decrease" `
    -ScaleActionType "ChangeCount" `
    -ScaleActionValue 1 `
    -ScaleActionCooldown ([System.TimeSpan]::New(0,5,0))

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 y reducción horizontal. 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 Cantidad mínima de tiempo de espera entre las operaciones de escalado. Esto es para permitir que las métricas se estabilicen y eviten la marcación. Por ejemplo, si ScaleActionCooldown fuera de 10 minutos y se acabase de realizar una operación de escalado, el escalado automático no intentará volver a escalar durante 10 minutos.

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. Utilice el cmdlet New-AzAutoscaleProfileObject para crear un nuevo perfil de escalabilidad automática. Como se trata de un perfil predeterminado, no tiene ningún parámetro de programación. El perfil predeterminado estará activo en las ocasiones en las que ningún otro perfil esté activo

$defaultProfile=New-AzAutoscaleProfileObject `
    -Name "default" `
    -CapacityDefault 1 `
    -CapacityMaximum 10 `
    -CapacityMinimum 1 `
    -Rule $rule1, $rule2

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 Domingo a Sábado. Para obtener más información sobre programaciones recurrentes, consulte Agregar un perfil recurrente usando la CLI
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 minutos en los que se aplica el perfil.
ScheduleTimeZone Zona horaria de las horas del perfil.

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

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

New-AzAutoscaleSetting `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Location eastus `
    -Profile $defaultProfile `
    -Enabled `
    -PropertiesName "vmss-autoscalesetting1" `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"

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

Agregue notificaciones a la configuración de venta para desencadenar un webhook o enviar notificaciones por correo electrónico cuando se produzca un evento de escalado. Para obtener más información sobre las notificaciones de webhook, consulte New-AzAutoscaleWebhookNotificationObject

Establezca un webhook mediante el siguiente cmdlet;


  $webhook1=New-AzAutoscaleWebhookNotificationObject -Property @{} -ServiceUri "http://contoso.com/webhook1"

Configure la notificación mediante el webhook y configure la notificación por correo electrónico mediante el cmdlet New-AzAutoscaleNotificationObject:


    $notification1=New-AzAutoscaleNotificationObject `
    -EmailCustomEmail "jason@contoso.com" `
    -EmailSendToSubscriptionAdministrator $true `
    -EmailSendToSubscriptionCoAdministrator $true `
    -Webhook $webhook1

Actualización de la configuración de escalado automático para aplicar la notificación


Update-AzAutoscaleSetting  `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultProfile `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

Revise la configuración de la escalabilidad automática

Para revisar la configuración de escalabilidad automática, cargue la configuración en una variable mediante Get-AzAutoscaleSetting y, a continuación, envíe la variable tal y como se indica a continuación:

    $autoscaleSetting=Get-AzAutoscaleSetting  -ResourceGroupName $resourceGroupName -Name vmss-autoscalesetting1 
    $autoscaleSetting | Select-Object -Property *

Obtención del historial de escalabilidad automática mediante AzAutoscaleHistory

Get-AzAutoscaleHistory -ResourceId  /subscriptions/<subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName

Perfiles programados y periódicos

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, 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 es posible configurar reglas diferentes para usarlas con el nuevo perfil.

$highDemandDay=New-AzAutoscaleProfileObject `
    -Name "High-demand-day" `
    -CapacityDefault 7 `
    -CapacityMaximum 30 `
    -CapacityMinimum 5 `
    -FixedDateEnd ([System.DateTime]::Parse("2023-12-31T14:00:00Z")) `
    -FixedDateStart ([System.DateTime]::Parse("2023-12-31T13:00:00Z")) `
    -FixedDateTimeZone "UTC" `
    -Rule $rule1, $rule2

Update-AzAutoscaleSetting  `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultProfile, $highDemandDay `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

Agregar perfil de programación periódica

Los perfiles periódicos permiten programar perfiles de escalado que se repetirán cada semana. Por ejemplo, escale a una sola instancia los fines de semana de viernes por la noche a lunes por la mañana.

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.

Por ejemplo, para configurar un perfil de fin de semana que comience los viernes por la noche y termine los 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 la configuración predeterminada que comience el lunes por la mañana.

El siguiente script crea un perfil de fin de semana y un perfil predeterminado adicional para finalizar el perfil de fin de semana.

$fridayProfile=New-AzAutoscaleProfileObject `
    -Name "Weekend" `
    -CapacityDefault 1 `
    -CapacityMaximum 1 `
    -CapacityMinimum 1 `
    -RecurrenceFrequency week  `
    -ScheduleDay "Friday" `
    -ScheduleHour 22  `
    -ScheduleMinute 00  `
    -ScheduleTimeZone  "Pacific Standard Time" `
    -Rule $rule1, $rule2


$defaultRecurringProfile=New-AzAutoscaleProfileObject `
    -Name "default recurring profile" `
    -CapacityDefault 2 `
    -CapacityMaximum 10 `
    -CapacityMinimum 2 `
    -RecurrenceFrequency week  `
    -ScheduleDay "Monday" `
    -ScheduleHour 00  `
    -ScheduleMinute 00  `
    -ScheduleTimeZone  "Pacific Standard Time" `
    -Rule $rule1, $rule2

New-AzAutoscaleSetting  `
    -Location eastus `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultRecurringProfile, $fridayProfile `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

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 escalabilidad automática, consulte el explorador de módulos de PowerShell

Limpieza de recursos

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


Remove-AzResourceGroup -Name $resourceGroupName