使用 PowerShell 配置自动缩放

使用自动缩放设置有助于确保运行适当数量的资源来处理应用程序负载的波动。 可以使用 Azure 门户、Azure CLI、PowerShell 或 ARM 或 Bicep 模板配置自动缩放。

本文将介绍如何通过以下步骤,使用 PowerShell 为虚拟机规模集配置自动缩放:

  • 创建可自动缩放的规模集
  • 创建横向缩减和横向扩展的规则
  • 创建使用规则的配置文件
  • 应用自动缩放设置
  • 使用通知更新自动缩放设置

先决条件

若要使用 PowerShell 配置自动缩放,需要一个 Azure 帐户和一个有效的订阅。 可创建试用帐户

设置你的环境

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

创建虚拟机规模集

使用以下 cmdlet 创建规模集。 设置 $resourceGroupName$vmssName 变量以适合你的环境。

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

# 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 "ChinaNorth2" `
 -VMScaleSetName $vmssName `
 -Credential $vmCred `
 -VirtualNetworkName "myVnet" `
 -SubnetName "mySubnet" `
 -PublicIpAddressName "myPublicIPAddress" `
 -LoadBalancerName "myLoadBalancer" `
 -OrchestrationMode "Flexible"

创建自动缩放设置

若要使用 PowerShell 创建自动缩放设置,请遵循以下顺序:

  1. 使用 New-AzAutoscaleScaleRuleObject 创建规则
  2. 使用 New-AzAutoscaleProfileObject 创建配置文件
  3. 使用 New-AzAutoscaleSetting 创建自动缩放设置
  4. 使用 Update-AzAutoscaleSetting 更新设置

创建规则

创建横向缩减和横向扩展规则,然后将其与配置文件相关联。 已使用 New-AzAutoscaleScaleRuleObject 创建规则。

以下 PowerShell 脚本将创建两个规则。

  • 当 CPU 百分比超过 70% 时横向扩展
  • 当 CPU 百分比小于 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))

下表描述了 New-AzAutoscaleScaleRuleObject cmdlet 中使用的参数。

参数 说明
MetricTriggerMetricName 设置自动缩放触发器指标
MetricTriggerMetricResourceUri 指定 MetricTriggerMetricName 指标所属的资源。 MetricTriggerMetricResourceUri 可以是任何资源,而不仅仅是要缩放的资源。 例如,可以根据负载均衡器、数据库或规模集本身创建的指标缩放虚拟机规模集。 对于指定的 MetricTriggerMetricResourceUri,必须存在 MetricTriggerMetricName
MetricTriggerTimeGrain 规则监视的指标的采样频率。 MetricTriggerTimeGrain 必须是指定指标的预定义值之一,并且必须介于 12 小时到 1 分钟之间。 例如,MetricTriggerTimeGrain = PT1M"* 表示每 1 分钟对指标进行采样,并使用 MetricTriggerStatistic 中指定的聚合方法进行聚合。
MetricTriggerTimeAggregation timeGrain 时间段内的聚合方法。 例如,statistic = "Average" 且 timeGrain = "PT1M" 表示每分钟取平均值来聚合指标。
MetricTriggerStatistic 用于聚合已采样指标的聚合方法。 例如,如果 TimeAggregation = "Average",则应取平均值来聚合采样的指标。
MetricTriggerTimeWindow 自动缩放引擎回溯聚合指标的时间量。 此值必须大于指标集合的延迟,这因资源而异。 它必须介于 5 分钟和 12 个小时之间。 例如,如果该时间为 10 分钟,就表示自动缩放每次运行时,都会查询过去 10 分钟的指标。 该功能可以将指标稳定化,避免对暂时性的峰值作出反应。
MetricTriggerThreshold 定义触发缩放事件的指标的值。
MetricTriggerOperator 指定计算指标值时要使用的逻辑比较操作。
MetricTriggerDividePerInstance 设置为 true 时,触发器指标将除以实例总数。 例如,如果消息计数为 300 且有 5 个实例正在运行,则计算的指标值为每个实例 60 条消息。 此属性并不适用于所有指标。
ScaleActionDirection 指定横向缩减或横向扩展。有效值为 IncreaseDecrease
ScaleActionType 按特定实例数缩放、缩放到特定实例计数或按当前实例计数的百分比缩放。 有效值包括 ChangeCountExactCountPercentChangeCount
ScaleActionCooldown 缩放操作之间等待的最短时间。 这是为了让指标保持稳定并避免回摆。 例如,如果 ScaleActionCooldown 为 10 分钟且刚刚发生了缩放操作,则自动缩放不会尝试在 10 分钟内再次缩放。

创建默认的自动缩放配置文件并关联规则

定义缩放规则后,创建配置文件。 配置文件指定默认实例计数、实例计数上限和下限,以及可以应用关联规则的时间。 使用 New-AzAutoscaleProfileObject cmdlet 创建新的自动缩放配置文件。 由于这是默认配置文件,因此它没有任何计划参数。 如果没有任何其他配置文件处于活动状态,默认配置文件将处于活动状态

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

下表描述了 New-AzAutoscaleProfileObject cmdlet 中使用的参数。

参数 说明
CapacityDefault 指标不可用于评估时的实例数。 仅当当前实例计数低于默认值时,才使用默认值。
CapacityMaximum 资源的最大实例数。 最大实例数还受订阅中可用内核数量的限制。
CapacityMinimum 资源的最小实例数。
FixedDateEnd 采用 ISO 8601 格式的配置文件的结束时间。
FixedDateStart 采用 ISO 8601 格式的配置文件的开始时间。
Rule 当此配置文件处于活动状态时,为缩放操作提供触发器和参数的规则的集合。 最多可以指定 10 个以逗号分隔的规则。
RecurrenceFrequency 计划配置文件生效的频率。 此值必须为 week
ScheduleDay 指定定期计划时配置文件生效的天数集合。 可能的值为 Sunday 到 Saturday。 有关定期计划的详细信息,请参阅使用 CLI 添加定期配置文件
ScheduleHour 配置文件生效的时间集合。 支持的值为 0 到 23。
ScheduleMinute 配置文件生效的分钟集合。
ScheduleTimeZone 配置文件小时数的时区。

应用自动缩放设置

调整规则和配置文件后,使用 New-AzAutoscaleSetting 应用自动缩放设置。 若要更新现有的自动缩放设置,请使用 Update-AzAutoscaleSetting

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

向自动缩放设置添加通知

向缩放设置添加通知,以在发生缩放事件时触发 Webhook 或发送电子邮件通知。 有关 Webhook 通知的详细信息,请参阅 New-AzAutoscaleWebhookNotificationObject

使用以下 cmdlet 设置 Webhook;


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

使用 Webhook 配置通知,并使用 New-AzAutoscaleNotificationObject cmdlet 设置电子邮件通知:


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

更新自动缩放设置以应用通知


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

查看自动缩放设置

若要查看自动缩放设置,请使用 Get-AzAutoscaleSetting 将设置加载到变量中,然后输出变量,如下所示:

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

使用 AzAutoscaleHistory 获取自动缩放历史记录

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

计划配置文件和定期配置文件

为特殊事件添加计划配置文件

设置自动缩放配置文件,以便针对具体事件采取不同的缩放方式。 例如,对于需求高于平时的日历日,创建一个配置文件,并提高最大和最小实例限制。

以下示例使用与上面定义的默认配置文件相同的规则,但为特定日期设置新的实例限制。 还可以配置不同的规则以用于新配置文件。

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

添加定期计划配置文件

使用定期配置文件可以计划每周重复的缩放配置文件。 例如,在周末(周五晚上到周一早上)扩展到单个实例。

计划配置文件具有开始和结束日期,定期配置文件则没有结束时间。 配置文件在下一个配置文件开始前将一直保持活动状态。 因此,在创建定期配置文件时,必须创建一个定期默认配置文件,该配置文件在希望上一个定期配置文件完成时启动。

例如,若要配置从星期五晚上开始到星期一早上结束的周末配置文件,请创建一个从星期五晚上开始的配置文件,然后使用从星期一早上开始的默认设置创建定期配置文件。

以下脚本将创建一个周末配置文件和用于结束周末配置文件的附加默认配置文件。

$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 chinanorth2 `
    -Name vmss-autoscalesetting1 `
    -ResourceGroupName $resourceGroupName `
    -Profile $defaultRecurringProfile, $fridayProfile `
    -Notification $notification1 `
    -TargetResourceUri "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/virtualMachineScaleSets/$vmssName"  

有关配置多个配置文件的详细信息,请参阅具有多个配置文件的自动缩放

其他自动缩放命令

有关自动缩放的 PowerShell cmdlet 的完整列表,请参阅 PowerShell 模块浏览器

清理资源

若要清理在本教程中创建的资源,请删除创建的资源组。 以下 cmdlet 将删除资源组及其所有资源。


Remove-AzResourceGroup -Name $resourceGroupName