你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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 "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"

创建自动缩放设置

若要使用 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 可以是任意资源,而不仅仅是所要缩放的资源。 例如,可以根据负载均衡器、数据库或规模集本身创建的指标来缩放虚拟机规模集。 对于指定的 MetricTriggerMetricResourceUriMetricTriggerMetricName 必须存在。
MetricTriggerTimeGrain 规则监视的指标的采样频率。 MetricTriggerTimeGrain 必须是指定的指标的预定义值之一,并且必须介于 12 小时和 1 分钟之间。 例如,MetricTriggerTimeGrain = PT1M"* 表示指标每 1 分钟采样一次,并使用 MetricTriggerStatistic 中指定的聚合方法进行聚合。
MetricTriggerTimeAggregation timeGrain 时间段内的聚合方法。 例如,statistic = "Average" 且 timeGrain = "PT1M" 表示每隔 1 分钟取平均值来聚合指标。
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 eastus `
    -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 eastus `
    -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