教程:使用 PowerShell 修改虚拟机规模集

在应用程序的整个生命周期内,你可能需要修改或更新你的虚拟机规模集。 这些更新可能包括更新规模集的配置,或更改应用程序配置。 本文介绍如何使用 PowerShell 修改现有的规模集。

更新规模集模型

规模集有一个“规模集模型”,用于以整体方式捕获规模集的所需状态。 若要查询规模集的模型,可使用 Get-AzVmss

Get-AzVmss -ResourceGroupName myResourceGroup -Name myScaleSet

输出的具体呈现取决于提供给命令的选项。 下面的示例显示了来自 PowerShell 的精简版示例输出:

Sku                                         : 
  Name                                      : Standard_DS1_v2
  Tier                                      : Standard
  Capacity                                  : 2
ProvisioningState                           : Succeeded
SinglePlacementGroup                        : False
Id                                          : /subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet
Name                                        : myScaleSet
Type                                        : Microsoft.Compute/virtualMachineScaleSets
Location                                    : chinanorth2
VirtualMachineProfile                       : 
    ComputerNamePrefix                      : myScaleSe
      ProvisionVMAgent                      : True
      EnableAutomaticUpdates                : True
        PatchMode                           : AutomaticByOS
        AssessmentMode                      : ImageDefault
      EnableVMAgentPlatformUpdates          : False
    AllowExtensionOperations                : True
  StorageProfile                            : 
      Publisher                             : MicrosoftWindowsServer
      Offer                                 : WindowsServer
      Sku                                   : 2016-Datacenter
      Version                               : latest
    OsDisk                                  : 
      Caching                               : None
      CreateOption                          : FromImage
      DiskSizeGB                            : 127
      OsType                                : Windows
        StorageAccountType                  : Premium_LRS
      DeleteOption                          : Delete
  NetworkProfile                            : 
    NetworkInterfaceConfigurations[0]       : 
      Name                                  : myScaleSet
      Primary                               : True
      DisableTcpStateTracking               : False
        Name                                : myScaleSet
        Subnet                              : 
          Id                                : /subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myScaleSet/subnets/myScaleSet
        PrivateIPAddressVersion             : IPv4
        LoadBalancerBackendAddressPools[0]  : 
/subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/myScaleSet/backendAddressPools/myScaleSet
      EnableIPForwarding                    : False
      DeleteOption                          : Delete
    NetworkApiVersion                       : 2020-11-01
OrchestrationMode                           : Flexible
TimeCreated                                 : 12/2/2022 5:41:21 PM

还可以使用 Update-AzVmss 更新规模集的各种属性。 例如,更新许可证类型。

$myVmss = Get-AzVmss -ResourceGroupName myResourceGroup -Name myScaleSet
Update-AzVmss -ResourceGroupName myResourceGroup -VirtualMachineScaleSet $myVMss -VMScaleSetName myScaleSet -LicenseType Windows_Server

更新规模集中的单个 VM 实例

规模集中的每个 VM 实例都有自己的模型视图,这类似于每个规模集都有模型视图的情况。 若要查询规模集中特定 VM 实例的模型视图,可使用 Get-AzVM

Get-AzVM -ResourceGroupName myResourceGroup -name MyScaleSet_Instance1
ResourceGroupName      : myResourceGroup
Id                     : /subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myScaleSet_Instance1
Name                   : myScaleSet_Instance1
Type                   : Microsoft.Compute/virtualMachines
Location               : chinanorth2
Extensions             : {MicrosoftMonitoringAgent}
HardwareProfile        : {VmSize}
NetworkProfile         : {NetworkInterfaces}
OSProfile              : {ComputerName, AdminUsername, WindowsConfiguration, Secrets, AllowExtensionOperations, RequireGuestProvisionSignal}
ProvisioningState      : Succeeded
StorageProfile         : {ImageReference, OsDisk, DataDisks}
VirtualMachineScaleSet : {Id}
TimeCreated            : 12/2/2022 5:41:23 PM

还可以添加 -Status 标志以获取实例视图,该视图提供有关 VM 的更多详细信息。

Get-AzVM -ResourceGroupName myResourceGroup -name MyScaleSet_Instance1 -Status                                    
ResourceGroupName       : myResourceGroup
Name                    : MyScaleSet_Instance1
OsName                  : Windows Server 2016 Datacenter
OsVersion               : 10.0.14393.5501
HyperVGeneration        : V1
Disks[0]                : 
  Name                  : myScaleSet_Instance1_disk1_cab60acccff7414b81d60572eeecb9e3
  Statuses[0]           : 
    Code                : ProvisioningState/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Time                : 12/2/2022 5:41:25 PM
Disks[1]                : 
  Name                  : disk1
  Statuses[0]           : 
    Code                : ProvisioningState/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Time                : 12/2/2022 6:33:36 PM
Extensions[0]           : 
  Name                  : MicrosoftMonitoringAgent
  Type                  : Microsoft.EnterpriseCloud.Monitoring.MicrosoftMonitoringAgent
  TypeHandlerVersion    : 1.0.18067.0
  Statuses[0]           : 
    Code                : ProvisioningState/succeeded
    Level               : Info
    DisplayStatus       : Provisioning succeeded
    Message             : Latest configuration has been applied to the Microsoft Monitoring Agent.
VMAgent                 : 
  VmAgentVersion        : 2.7.41491.1071
  ExtensionHandlers[0]  : 
    Type                : Microsoft.EnterpriseCloud.Monitoring.MicrosoftMonitoringAgent
    TypeHandlerVersion  : 1.0.18067.0
    Status              : 
      Code              : ProvisioningState/succeeded
      Level             : Info
      DisplayStatus     : Ready
      Message           : This virtual machine has successfully connected to Azure Log Analytics.
  Statuses[0]           : 
    Code                : ProvisioningState/succeeded
    Level               : Info
    DisplayStatus       : Ready
    Message             : GuestAgent is running and processing the extensions.
    Time                : 12/2/2022 6:34:55 PM
Statuses[0]             : 
  Code                  : ProvisioningState/succeeded
  Level                 : Info
  DisplayStatus         : Provisioning succeeded
  Time                  : 12/2/2022 6:33:42 PM
Statuses[1]             : 
  Code                  : PowerState/running
  Level                 : Info
  DisplayStatus         : VM running

这些属性描述的是规模集中某个 VM 实例的配置,而不是规模集作为一个整体的配置。

可以像对独立 VM 一样,对规模集中的单个 VM 实例执行更新。 例如,将新的数据磁盘附加到实例 1:

$VirtualMachine = Get-AzVM -ResourceGroupName "myResourceGroup" -Name "myScaleSet_Instance1".
Add-AzVMDataDisk -VM $VirtualMachine -Name "disk1" -LUN 0 -Caching ReadOnly -DiskSizeinGB 128 -CreateOption Empty
Update-AzVM -ResourceGroupName "myResourceGroup" -VM $VirtualMachine

将实例添加到规模集

有时,你可能想要将新的 VM 添加到规模集,但希望配置选项不同于规模集模型中列出的选项。 使用 Get-AzVmss 命令并指定要向其添加实例的规模集名称,可以在创建期间将 VM 添加到规模集。

New-AzVM -Name myNewInstance -ResourceGroupName myResourceGroup -image Ubuntu2204 -VmssId /subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet
ResourceGroupName        : myResourceGroup                                                                              
Id                       : /subscriptions/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myNewInstance
Name                     : myNewInstance                                                                                
Type                     : Microsoft.Compute/virtualMachines                                                            
Location                 : chinanorth2                                                                                       
Tags                     : {}                                                                                           
HardwareProfile          : {VmSize}                                                                                     
NetworkProfile           : {NetworkInterfaces}                                                                          
OSProfile                : {ComputerName, AdminUsername, LinuxConfiguration, Secrets, AllowExtensionOperations, RequireGuestProvisionSignal}
ProvisioningState        : Succeeded                                                                                    
StorageProfile           : {ImageReference, OsDisk, DataDisks}                                                          
FullyQualifiedDomainName : mynewinstance-21bc01.chinanorth2.chinacloudapp.cn                                               
VirtualMachineScaleSet   : {Id}                                                                                         
TimeCreated              : 12/2/2022 6:40:20 PM   

通过再次运行 Get-AzVM,可以看到新实例已创建并添加到现有规模集。

Get-AzVm -ResourceGroupName myResourceGroup 
ResourceGroupName   Name                   Location   VmSize            OsType     NIC                  ProvisioningState 
-----------------   ----                   --------   ------            ------     ---                  ----------------- 
myResourceGroup     myNewInstance          chinanorth2     Standard_D2s_v3   Linux      myNewInstance         Succeeded     
myResourceGroup     myScaleSet_Instance1   chinanorth2     Standard_DS1_v2   Windows    myScaleSet-a9f1d54c   Succeeded     
myResourceGroup     myScaleSet_Instance2   chinanorth2     Standard_DS1_v2   Windows    myScaleSet-4dc708e5   Succeeded   

使用最新的规模集模型对 VM 进行更新

注意

使用灵活业务流程模式的虚拟机规模集当前不支持升级模式。

规模集有一项“升级策略”,该策略决定了如何使用最新的规模集模型对 VM 进行更新。 升级策略的三种模式是:

  • 自动 - 在此模式下,规模集无法保证 VM 的关闭顺序。 规模集可能同时关闭所有 VM。
  • 滚动 - 在此模式下,规模集以批次的方式推出更新,批次之间的暂停时间为可选。
  • 手动 - 在此模式下,更新规模集模型时,在触发手动更新之前,不会对现有的 VM 执行任何操作。

如果规模集设置为手动升级,则可以使用 Update-AzVmss 触发手动升级。

$myVmss = Get-AzVmss -ResourceGroupName myResourceGroup -Name myScaleSet
Update-AzVmss -ResourceGroupName myResourceGroup -VirtualMachineScaleSet $myVMss -VMScaleSetName myScaleSet

注意

Service Fabric 群集只能使用“自动”模式,但采用不同方式来处理更新。 有关详细信息,请参阅 Service Fabric 应用程序升级

重置规模集的映像

虚拟机规模集将为规模集中的每个 VM 生成独一无二的名称。 命名约定因业务流程模式而异:

  • 灵活业务流程模式:{scale-set-name}_{8-char-guid}
  • 统一业务流程模式:{scale-set-name}_{instance-id}

如果需要重置特定实例的映像,请使用 Set-AzVmss 并指定实例名称。

Set-AzVmssVM -ResourceGroupName myResourceGroup -VMScaleSetName myScaleSet -InstanceId myScaleSet_Instance1 -Reimage

若要重置规模集中所有实例的映像,只需指定规模集名称并省略任何 instanceID 即可。

Set-AzVmssVM -Reimage -ResourceGroupName myResourceGroup -VMScaleSetName myScaleSet

更新规模集的 OS 映像

你可能具有运行旧版 Ubuntu LTS 18.04 的规模集。 你希望将其更新到新版 Ubuntu LTS 16.04,例如版本 18.04.202210180。 映像引用版本属性不是列表的一部分,因此可以使用 Update-AzVmss 直接修改这些属性。

$myVmss = Get-AzVmss -ResourceGroupName myResourceGroup -Name myScaleSet      
  
Update-AzVmss -ResourceGroupName myResourceGroup -VirtualMachineScaleSet $myVMss -VMScaleSetName myScaleSet -ImageReferenceVersion virtualMachineProfile.storageProfile.imageReference.version=18.04.202210180

或者,你可能想要更改规模集使用的映像。 例如,你可能想要更新或更改规模集使用的自定义映像。 可以通过更新“映像引用 ID”属性来更改规模集使用的映像。 映像引用 ID 属性不是列表的一部分,因此可以使用 Update-AzVmss 直接修改此属性。

$myVmss = Get-AzVmss -ResourceGroupName myResourceGroup -Name myScaleSet     
   
Update-AzVmss -ResourceGroupName myResourceGroup -VirtualMachineScaleSet $myVMss -VMScaleSetName myScaleSet -ImageReferenceVersion virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage

如果使用 Azure 平台映像,可以通过修改 imageReference 来更新映像(有关详细信息,请参阅 REST API 文档)。

注意

使用平台映像时,通常指定 "latest" 作为映像引用版本。 在你执行创建、横向扩展和重置映像操作时,将使用最新发布的脚本创建 VM。 但是,这并不意味着 OS 映像会随新映像版本的发布自动进行更新。 一个独立功能提供了自动 OS 升级功能。 有关详细信息,请参阅自动 OS 升级文档

如果使用自定义映像,可以通过更新 imageReference ID 来更新映像(有关详细信息,请参阅 REST API 文档)。

后续步骤

本教程介绍了如何使用 PowerShell 修改规模集的各个方面以及单个实例。

  • 更新规模集模型
  • 更新规模集中的单个 VM 实例
  • 将实例添加到规模集
  • 使用最新的规模集模型对 VM 进行更新
  • 重置规模集的映像
  • 更新规模集的 OS 映像