Konfigurieren der automatischen Skalierung mit Azure PowerShell

Mithilfe der automatischen Skalierung können Sie sicherstellen, dass Sie über die richtige Anzahl von ausgeführten Ressourcen verfügen, um die wechselnde Auslastung Ihrer Anwendung zu bewältigen. Sie können die automatische Skalierung mithilfe des Azure Portals, Azure CLI, Azure PowerShell oder ARM- oder Bicep-Vorlagen konfigurieren.

In diesem Artikel erfahren Sie, wie Sie die Autoskalierung für eine VM-Skalierungsgruppe mit PowerShell konfigurieren. Die Konfigurationen führen die folgenden Schritte aus:

  • Erstellen Sie eine Skalierungsgruppe, die Sie automatisch skalieren können.
  • Erstellen Sie Regeln zum Hoch- und Herunterskalieren.
  • Erstellen Sie ein Profil, das Ihre Regeln verwendet.
  • Wenden Sie die Einstellungen für die automatische Skalierung an.
  • Aktualisieren Sie Ihre Einstellungen für die automatische Skalierung mit Benachrichtigungen.

Voraussetzungen

Zum Konfigurieren der Autoskalierung mit PowerShell benötigen Sie ein Azure-Konto mit einem aktiven Abonnement. Sie können ein Konto kostenlos erstellen.

Richten Sie Ihre Umgebung ein

Note

Führen Sie die Beispiele in derselben PowerShell-Sitzung aus, in der Ihr beabsichtigtes Abonnement ausgewählt ist.

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

Erstellen eines Virtual Machine Scale Set

Im folgenden Azure PowerShell Beispiel werden die New-AzResourceGroup und New-AzVmss Cmdlets verwendet.

Note

Verwenden Sie eine dedizierte Ressourcengruppe für dieses Beispiel, damit Sie die Ressourcen löschen können, wenn Sie fertig sind.

Im Beispiel wird eine öffentliche IP-Adresse erstellt. Verwenden Sie für den Verwaltungszugriff Azure Bastion, anstatt RDP- oder SSH-Ports für das Internet freizugeben.

# 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

Erstellen der Autoskalierungseinstellungen

Befolgen Sie diese Sequenz, um die Autoskalierungseinstellung mithilfe von PowerShell zu erstellen:

  1. Regeln erstellen mithilfe von New-AzAutoscaleScaleRuleObject.
  2. Erstellen Sie ein Profil mithilfe von New-AzAutoscaleProfileObject.
  3. Erstellen Sie die Einstellungen für die automatische Skalierung mithilfe von New-AzAutoscaleSetting.
  4. Aktualisieren Sie die Einstellungen mithilfe von Update-AzAutoscaleSetting.

Erstellen von Regeln

Erstellen Sie Scale-In- und Scaleout-Regeln, und ordnen Sie sie dann einem Profil zu.

Im folgenden Azure PowerShell Beispiel wird das New-AzAutoscaleScaleRuleObject Cmdlet verwendet.

Note

Es werden zwei Regeln erstellt:

  • Skalieren Sie hoch, wenn die CPU-Auslastung 70 % überschreitet.
  • Skalieren Sie einwärts, wenn der Prozentsatz der CPU kleiner als 30 % ist.
# 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

In der folgenden Tabelle werden die Parameter beschrieben, die im New-AzAutoscaleScaleRuleObject Cmdlet verwendet werden.

Parameter BESCHREIBUNG
MetricTriggerMetricName Legt die Triggermetrik für die Autoskalierung fest
MetricTriggerMetricResourceUri Gibt die Ressource an, zu der die MetricTriggerMetricName-Metrik gehört. MetricTriggerMetricResourceUri kann eine beliebige Ressource und nicht nur die Ressource sein, die skaliert wird. Beispielsweise können Sie Ihre VM-Skalierungsgruppen basierend auf Metriken skalieren, die von einem Lastenausgleich, einer Datenbank oder der Skalierungsgruppe selbst erstellt wurden. Die MetricTriggerMetricName muss für die angegebene MetricTriggerMetricResourceUrivorhanden sein.
MetricTriggerTimeGrain Die Probenhäufigkeit der Metrik, die von der Regel überwacht wird. MetricTriggerTimeGrain muss einer der vordefinierten Werte für die angegebene Metrik sein und zwischen 12 Stunden und 1 Minute betragen. MetricTriggerTimeGrain = Pt1M"* bedeutet beispielsweise, dass die Metriken alle 1 Minute erfasst und mithilfe der in MetricTriggerStatistic angegebenen Aggregationsmethode aggregiert werden.
MetricTriggerTimeAggregation Dies ist die Aggregationsmethode innerhalb des timeGrain-Zeitraums. Beispiel: statistic = "Average" und timeGrain = "PT1M" bedeutet, dass die Metriken jede Minute anhand des Durchschnitts aggregiert werden.
MetricTriggerStatistic Die Aggregationsmethode, die zum Aggregieren der Stichprobenmetriken verwendet wird. Beispiel: Mit TimeAggregation = "Average" werden die Stichprobenmetriken aggregiert, indem der Durchschnittswert herangezogen wird.
MetricTriggerTimeWindow Die Zeitspanne, auf die die Autoskalierungs-Engine zur Aggregation der Metrik zurückblickt. Dieser Wert muss größer sein als die Verzögerung bei der Metrikerfassung, die je nach Ressource unterschiedlich ist. Der Wert muss zwischen fünf Minuten und zwölf Stunden liegen. Beispiel: „10 Minuten“ bedeutet, dass bei jeder Ausführung der Autoskalierung die Metriken der letzten zehn Minuten abgefragt werden. Durch dieses Feature können sich Ihre Metriken stabilisieren, und es wird vermieden, auf vorübergehende Ausschläge zu reagieren.
MetricTriggerThreshold Definiert den Wert der Metrik, die ein Skalierungsereignis auslöst.
MetricTriggerOperator Gibt die logische Vergleichsoperation an, die bei der Auswertung des Metrikwertes verwendet werden soll.
MetricTriggerDividePerInstance Wenn true festgelegt ist, wird die Triggermetrik durch die Gesamtzahl der Instanzen dividiert. Wenn beispielsweise die Nachrichtenanzahl 300 beträgt und 5 Instanzen ausgeführt werden, beträgt der berechnete Metrikwert 60 Nachrichten pro Instanz. Diese Eigenschaft gilt nicht für alle Metriken.
ScaleActionDirection Legen Sie Ab- oder Aufskalieren fest. Gültige Werte sind Increase und Decrease.
ScaleActionType Skalieren Sie um eine bestimmte Anzahl von Instanzen, skalieren Sie auf eine bestimmte Anzahl von Instanzen oder skalieren Sie nach Prozent der aktuellen Instanzanzahl. Zu den gültigen Werten zählen ChangeCount, ExactCount und PercentChangeCount.
ScaleActionCooldown Die minimale Zeitspanne, die nach einem Skalierungsvorgang vergehen muss, bevor diese Regel eine weitere Skalierungsaktion auslösen kann. Autoscale prüft die Abklingzeit jeder Regel unabhängig. Der Cooldown ermöglicht es den Metriken, das Flapping zu stabilisieren und zu vermeiden.

Erstellen eines Standardprofils für Autoskalierung und Zuordnen der Regeln

Nachdem Sie die Skalierungsregeln definiert haben, erstellen Sie ein Profil. Das Profil gibt die Standard-, Ober- und Untergrenze für die Instanzanzahl sowie die Zeiten an, zu denen die zugeordneten Regeln angewendet werden können.

Im folgenden Azure PowerShell Beispiel wird das New-AzAutoscaleProfileObject Cmdlet verwendet.

Note

Da es sich bei diesem Profil um ein Standardprofil handelt, gibt es keine Zeitplanparameter. Das Standardprofil ist zu Zeiten aktiv, in denen keine anderen Profile aktiv sind.

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

In der folgenden Tabelle werden die Parameter beschrieben, die im New-AzAutoscaleProfileObject Cmdlet verwendet werden.

Parameter BESCHREIBUNG
CapacityDefault Die Anzahl von Instanzen, falls keine Metriken zur Auswertung verfügbar sind. Der Standard wird nur verwendet, wenn die aktuelle Instanzanzahl niedriger als der Standardwert ist.
CapacityMaximum Die maximale Anzahl von Instanzen für die Ressource. Die Höchstanzahl der Instanzen wird weiter durch die Anzahl der Kerne beschränkt, die im Abonnement verfügbar sind.
CapacityMinimum Die Mindestanzahl von Instanzen für die Ressource.
FixedDateEnd Der Endzeitpunkt für das Profil im ISO 8601-Format für.
FixedDateStart Die Startzeit für das Profil im ISO 8601-Format.
Rule Eine Auflistung von Regeln, die die Trigger und Parameter für die Skalierungsaktion bereitstellen, wenn das Profil aktiv ist. Es können maximal 10 kommagetrennte Regeln angegeben werden.
RecurrenceFrequency Wie oft das geplante Profil angewendet wird. Dieser Wert muss week sein.
ScheduleDay Eine Auflistung von Tagen, an denen das Profil in Kraft tritt, wenn ein wiederkehrender Zeitplan angegeben ist. Mögliche Werte sind Sonntag bis Samstag. Weitere Informationen zu wiederkehrenden Zeitplänen finden Sie unter Recurring profiles using PowerShell.
ScheduleHour Eine Auflistung von Stunden, an denen das Profil in Kraft tritt. Die unterstützten Werte sind 0 bis 23.
ScheduleMinute Eine Auflistung von Minuten, in denen das Profil in Kraft tritt.
ScheduleTimeZone Die Zeitzone für die Profilstunden.

Anwenden der Autoskalierungseinstellungen

Nachdem Sie die Regeln und das Profil definiert haben, wenden Sie die Einstellungen für die automatische Skalierung an. Zum Aktualisieren einer vorhandenen Autoskalierungseinstellung verwenden Sie Update-AzAutoscaleSetting.

Im folgenden Azure PowerShell Beispiel wird das New-AzAutoscaleSetting Cmdlet verwendet.

# 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

Hinzufügen von Benachrichtigungen zu Ihren Einstellungen für die Autoskalierung

Fügen Sie Ihrer Einstellung für die automatische Skalierung Benachrichtigungen hinzu, um einen Webhook auszulösen oder E-Mail-Benachrichtigungen zu senden, wenn ein Skalierungsereignis eintritt.

Im folgenden Azure PowerShell Beispiel wird das New-AzAutoscaleWebhookNotificationObject Cmdlet verwendet.

# Set variables
$webhookUri = "<WebhookUri>"

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

Im folgenden Azure PowerShell Beispiel wird das New-AzAutoscaleNotificationObject Cmdlet zum Konfigurieren von Webhook- und E-Mail-Benachrichtigungen verwendet.

Note

Verwenden Sie einen HTTPS-Endpunkt für den Webhook.

# Set variables
$notificationEmail = "<NotificationEmail>"

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

Im folgenden Azure PowerShell Beispiel wird das Update-AzAutoscaleSetting Cmdlet verwendet, um die Benachrichtigung anzuwenden.

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

# Update the autoscale notification
Update-AzAutoscaleSetting @updateAzAutoscaleSettingParams

Prüfen Ihrer Einstellungen für Autoskalierung

Im folgenden Azure PowerShell Beispiel wird das Get-AzAutoscaleSetting Cmdlet verwendet, um die Einstellung für die automatische Skalierung abzurufen.

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

Im folgenden Azure PowerShell Beispiel wird das Get-AzAutoscaleHistory Cmdlet verwendet.

Note

Sie fragt den Verlauf der Autoskaleneinstellung ab, nicht die Ressourcen-ID des Skalierungssatzes.

# 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

Geplante und wiederkehrende Profile

Note

Wenn Sie Profile aktualisieren, schließen Sie jedes Profil ein, das Sie behalten möchten. In den folgenden Beispielen werden der zuvor in diesem Artikel erstellten Einstellung Profile hinzugefügt. Behalten Sie alle anderen Profile bei, wenn Sie sie an eine andere Einstellung für die automatische Skalierung anpassen.

Fügen Sie ein geplantes Profil für ein Sonderereignis hinzu

Richten Sie die Autoskalierungsprofile so ein, dass sie für bestimmte Ereignisse unterschiedlich skaliert werden. Erstellen Sie beispielsweise für einen Tag, an dem die Nachfrage höher ist als üblich, ein Profil mit erhöhten maximalen und minimalen Instanzgrenzwerten.

Im folgenden Azure PowerShell Beispiel werden die Cmdlets New-AzAutoscaleProfileObject und Update-AzAutoscaleSetting verwendet.

Note

Im folgenden Beispiel werden die gleichen Regeln wie das zuvor definierte Standardprofil verwendet, aber neue Instanzenbeschränkungen für ein bestimmtes Datum festgelegt. Sie können auch unterschiedliche Regeln für die Verwendung mit dem neuen Profil konfigurieren. Die Start- und Endwerte verwenden ISO 8601-Zeitstempel in 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

Wiederkehrendes Zeitplanprofil hinzufügen

Mit wiederkehrenden Profilen können Sie ein Skalierungsprofil planen, das jede Woche wiederholt wird.

Während geplante Profile über ein Start- und Enddatum verfügen, haben wiederkehrende Profile keine Endzeit. Ein Profil bleibt bis zum Startzeitpunkt des nächsten Profils aktiv. Daher müssen Sie beim Erstellen eines wiederkehrenden Profils ein wiederkehrendes Standardprofil erstellen, das beginnt, wenn das vorherige wiederkehrende Profil abgeschlossen werden soll.

Im folgenden Azure PowerShell Beispiel werden die New-AzAutoscaleProfileObject- und Update-AzAutoscaleSetting-Cmdlets verwendet.

Note

Skalieren Sie beispielsweise am Wochenende von Freitagabend bis Montagmorgen auf eine einzelne Instanz. Um ein Wochenendprofil zu konfigurieren, das am Freitagabend beginnt und am Montagmorgen endet, erstellen Sie ein Profil, das am Freitagabend beginnt, und erstellen Sie dann ein wiederkehrendes Profil, das am Montagmorgen beginnt, mit Ihren Standardeinstellungen.

Es erstellt ein Wochenendprofil und ein wiederkehrendes Standardprofil, um das Wochenendprofil zu beenden, während die Standard- und Festdatumsprofile aus den vorherigen Schritten beibehalten werden.

# 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

Weitere Informationen zu geplanten Profilen finden Sie unter AutoScale mit mehreren Profilen.

Andere Befehle für Autoskalierung

Eine vollständige Liste der PowerShell-Cmdlets für die automatische Skalierung finden Sie im PowerShell-Modulbrowser.

Bereinigen von Ressourcen

Um die in diesem Lernprogramm erstellten Ressourcen zu bereinigen, löschen Sie die dedizierte Ressourcengruppe, die Sie erstellt haben. Das folgende Cmdlet löscht die Ressourcengruppe und alle zugehörigen Ressourcen.

Im folgenden Azure PowerShell Beispiel wird das Remove-AzResourceGroup Cmdlet verwendet.

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