修改虛擬機器擴展集

注意

本文件所列的許多步驟,適用於使用統一協調流程模式的虛擬機器擴展集。 我們建議針對新的工作負載使用彈性協調流程。 如需詳細資訊,請參閱 Azure 中虛擬機器擴展集的協調流程模式

在應用程式的整個生命週期中,您可能需要修改或更新您的虛擬機器擴展集。 這些更新可能包括如何更新擴展集的組態,或者變更應用程式組態。 本文說明如何使用 REST API、Azure PowerShell 或 Azure CLI 來修改現有的擴展集。

基本概念

擴展集模型

擴展集具有「擴展集模型」,可擷取擴展集整體的「預期」狀態。 若要查詢擴展集的模型,您可以使用

  • REST API 執行 compute/virtualmachinescalesets/get,如下所示:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Azure PowerShell 搭配 Get-AzVmss

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"
    
  • Azure CLI 執行 az vmss show

    az vmss show --resource-group myResourceGroup --name myScaleSet
    
  • 您也可以使用 resources.azure.com 或語言特定 Azure SDK

確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:

az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "overprovision": true,
  "plan": null,
  "singlePlacementGroup": true,
  "sku": {
    "additionalProperties": {},
    "capacity": 1,
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

這些屬性會整體套用至擴展集。

擴展集執行個體檢視

擴展集也具有「擴展集執行個體檢視」,可擷取擴展集整體的目前「執行階段」狀態。 若要查詢擴展集的執行個體檢視,您可以使用:

  • REST API 執行 compute/virtualmachinescalesets/getinstanceview,如下所示:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/instanceView?api-version={apiVersion}
    
  • Azure PowerShell 搭配 Get-AzVmss

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceView
    
  • Azure CLI 執行 az vmss get-instance-view

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
    
  • 您也可以使用 resources.azure.com 或語言特定 Azure SDK

確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
{
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": null,
      "time": "{time}"
    }
  ],
  "virtualMachine": {
    "additionalProperties": {},
    "statusesSummary": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "count": 1
      }
    ]
  }
}

這些屬性會提供擴展集內虛擬機器目前執行階段狀態的摘要,例如套用至擴展集之擴充功能的狀態。

擴展集 VM 模型檢視

就像擴展集有模型檢視一樣,擴展集內的每個 VM 執行個體也有自己的模型檢視。 若要查詢擴展集中特定 VM 執行個體的模型檢視,您可以使用:

  • REST API 執行 compute/virtualmachinescalesetvms/get,如下所示:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId?api-version={apiVersion}
    
  • Azure PowerShell 搭配 Get-AzVmssVm

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId
    
  • Azure CLI 執行 az vmss show

    az vmss show --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • 您也可以使用 resources.azure.comAzure SDK

確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:

$ az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "name": "{name}",
  "sku": {
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

這些屬性會描述擴展集內 VM 執行個體的設定,而非整個擴展集的設定。 例如,擴展集模型具有 overprovision 作為屬性,而擴展集內 VM 執行個體的模型則沒有。 之所以會有這個差異,是因為過度佈建是適用於擴展集整體的屬性,而不適用於擴展集中個別 VM 執行個體 (如需有關過度佈建的詳細資訊,請參閱擴展集的設計考量)。

擴展集 VM 執行個體檢視

就像擴展集有執行個體檢視一樣,擴展集內的每個 VM 執行個體也有自己的執行個體檢視。 若要查詢擴展集內特定 VM 執行個體的執行個體檢視,您可以使用:

  • REST API 執行 ompute/virtualmachinescalesetvms/getinstanceview,如下所示:

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId/instanceView?api-version={apiVersion}
    
  • Azure PowerShell 搭配 Get-AzVmssVm

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId -InstanceView
    
  • Azure CLI 執行 az vmss get-instance-view

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • 您也可以使用 resources.azure.comAzure SDK

確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
{
  "additionalProperties": {
    "osName": "ubuntu",
    "osVersion": "16.04"
  },
  "disks": [
    {
      "name": "{name}",
      "statuses": [
        {
          "additionalProperties": {},
          "code": "ProvisioningState/succeeded",
          "displayStatus": "Provisioning succeeded",
          "time": "{time}"
        }
      ]
    }
  ],
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "time": "{time}"
    },
    {
      "additionalProperties": {},
      "code": "PowerState/running",
      "displayStatus": "VM running"
    }
  ],
  "vmAgent": {
    "statuses": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "displayStatus": "Ready",
        "level": "Info",
        "message": "Guest Agent is running",
        "time": "{time}"
      }
    ],
    "vmAgentVersion": "{version}"
  },
}

這些屬性會描述擴展集內 VM 執行個體的目前執行階段狀態,包括套用至擴展集的所有擴充功能。

如何更新全域擴展集屬性

若要更新全域擴展集屬性,您必須更新擴展集模型中的屬性。 您可以透過下列方式執行此操作:

  • REST API 執行 compute/virtualmachinescalesets/createorupdate,如下所示:

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • 您可以使用來自 REST API 的屬性來部署 Resource Manager 範本,以更新全域擴展集屬性。

  • Azure PowerShell 搭配 Update-AzVmss

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -VirtualMachineScaleSet {scaleSetConfigPowershellObject}
    
  • Azure CLI 執行 az vmss update

    • 若要修改屬性:

      az vmss update --set {propertyPath}={value}
      
    • 若要將物件新增至擴展集內的清單屬性:

      az vmss update --add {propertyPath} {JSONObjectToAdd}
      
    • 若要從擴展集內的清單屬性移除物件:

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • 如果您先前已使用 az vmss create 命令來部署擴展集,則可以再次執行 az vmss create 命令來更新擴展集。 請確保 az vmss create 命令中的所有屬性都與之前相同,除了您想要修改的屬性之外。

  • 您也可以使用 resources.azure.comAzure SDK

更新擴展集模型之後,新的設定就會套用至擴展集內新建立的所有 VM。 不過,擴展集內現有 VM 的模型仍然必須藉由最新的整體擴展集模型來更新至最新狀態。 每個 VM 的模型中都有一個名為 latestModelApplied 的布林值屬性,此屬性會指出 VM 是否已藉由最新的整體擴展集模型更新至最新狀態 (true 表示 VM 已藉由最新的模型更新至最新狀態)。

具有修改限制的屬性

建立階段屬性

有些屬性只能在建立擴展集時設定。 一些範例包括受控 OS 磁碟記憶體帳戶類型和容錯網域。

只能根據目前值變更的屬性

有些屬性可以變更,但除非是根據目前的值。 這些屬性包括:

  • singlePlacementGroup
  • 子網路
  • imageReferenceSku
  • imageReferenceOffer
  • 可用性區域 (預覽)

範例 1

若要更新擴展集以使用不同的 OS 版本,您必須在單一呼叫中設定所有更新的屬性。 在此範例中,我們將從 Unbuntu Server 20.04 變更為 22.04。

az vmss update \
--resource-group myResourceGroup \
--name myScaleSet \
--set virtualMachineProfile.storageProfile.imageReference.offer=0001-com-ubuntu-server-jammy \
--set virtualMachineProfile.storageProfile.imageReference.publisher=Canonical \
--set virtualMachineProfile.storageProfile.imageReference.sku=22_04-lts-gen2 \
--set virtualMachineProfile.storageProfile.imageReference.version=latest

範例 2

若要更新擴展集以使用不同的 OS 版本,您必須在單一呼叫中設定所有更新的屬性。 在此範例中,我們將從 Windows Server 2016 變更為 Windows Server 2019。

$VMSS = Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"

Set-AzVmssStorageProfile $vmss `
    -OsDiskCreateOption "FromImage" `
    -ImageReferencePublisher "MicrosoftWindowsServer" `
    -ImageReferenceOffer "WindowsServer" `
    -ImageReferenceSku "2019-datacenter" `
    -ImageReferenceVersion "latest"

Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -VirtualMachineScaleSet $VMSS

必須解除配置才能變更的屬性

有些屬性只有在已將擴展集內 VM 解除配置的情況下,才能變更成特定值。 這些屬性包括:

  • SKU 名稱 - 如果擴展集目前所在的硬體不支援新的虛擬機器 SKU,您必須先將擴展集內的虛擬機器解除配置,才能修改 SKU 名稱。 如需詳細資訊,請參閱如何調整 Azure 虛擬機器的大小

VM 特定的更新

某些修改可以套用至特定 VM,而無法套用至全域擴展集屬性。 目前唯一支援的虛擬機器特定更新是將資料磁碟連結至擴展集內的虛擬機器,或將資料磁碟與那些虛擬機器中斷連結。 此功能為預覽版。 如需詳細資訊請,參閱預覽文件 \(英文\)。

案例

應用程式更新

如果透過擴充功能將應用程式部署至擴展集,則更新擴充組態時,會造成應用程式根據升級原則進行更新。 例如,如果您有要在自訂指令碼擴充功能中執行的新版指令碼,則可以更新 fileUris 屬性以指向新的指令碼。 在某些情況下,即使擴充組態未變更 (例如,您已更新指令碼,但未變更指令碼的 URI),您也可能會想要強制更新。 在這些情況下,您可以修改 forceUpdateTag 來強制更新。 Azure 平台不會解譯這個屬性。 如果您變更此值,並不會影響擴充功能的執行方式。 變更只會強制擴充功能重新執行。 如需有關 forceUpdateTag 的詳細資訊,請參閱擴充功能的 REST API 文件。 請注意,forceUpdateTag 可以搭配所有擴充功能使用,而不只是搭配自訂指令碼擴充功能。

透過自訂映像來部署應用程式也是常見的做法。 在下一節中將會探討此案例。

OS 更新

如果您使用 Azure 平台映像,您可以修改 imageReference (如需詳細資訊,請參閱 REST API 文件) 來更新映像。

注意

使用平台映像時,通常會指定 "latest" 作為映像參考版本。 當您建立、擴增及重新安裝映像時,會使用最新可用版本來建立虛擬機器。 不過,這並不意謂著作業系統映像會隨著時間在新映像版本發行時自動更新。 獨立功能可提供自動作業系統升級。 如需詳細資訊,請參閱 自動作業系統升級文件

如果您使用自訂映像,您可以更新 imageReference 識別碼 (如需詳細資訊,請參閱 REST API 文件) 來更新映像。

範例

更新擴展集的 OS 映像

您可能有執行舊版 Ubuntu LTS 16.04 的擴展集。 您想要更新為較新版本的 Ubuntu LTS 16.04 (例如,版本 16.04.201801090)。 映像參考版本屬性不是清單的一部分,因此您可以直接使用下列其中一個命令來修改這些屬性:

  • Azure PowerShell 搭配 Update-AzVmss,如下所示:

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -ImageReferenceVersion 16.04.201801090
    
  • Azure CLI 執行 az vmss update

    az vmss update --resource-group myResourceGroup --name myScaleSet --set virtualMachineProfile.storageProfile.imageReference.version=16.04.201801090
    

或者,您可能想要變更擴展集使用的映像。 例如,您可能要更新或變更擴展集使用的自訂映像。 您可以藉由更新映像參考識別碼屬性,來變更擴展集使用的映像。 映像參考識別碼屬性不是清單的一部分,因此您可以使用下列其中一個命令來直接修改此屬性:

  • Azure PowerShell 搭配 Update-AzVmss,如下所示:

    Update-AzVmss `
        -ResourceGroupName "myResourceGroup" `
        -VMScaleSetName "myScaleSet" `
        -ImageReferenceId /subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    
  • Azure CLI 執行 az vmss update

    az vmss update \
        --resource-group myResourceGroup \
        --name myScaleSet \
        --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    

更新擴展集的負載平衡器

假設您有一個含有 Azure Load Balancer 的擴展集,而您想要以「Azure 應用程式閘道」取代 Azure Load Balancer。 擴展集的負載平衡器和應用程式閘道屬性是清單的一部分,因此您可以使用命令來移除或新增清單元素,而不需直接修改屬性:

  • Azure PowerShell:

    # Get the current model of the scale set and store it in a local PowerShell object named $vmss
    $vmss=Get-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet"
    
    # Create a local PowerShell object for the new desired IP configuration, which includes the reference to the application gateway
    $ipconf = New-AzVmssIPConfig -ApplicationGatewayBackendAddressPoolsId /subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendAddressPoolName} -SubnetId $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Subnet.Id -Name $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Name
    
    # Replace the existing IP configuration in the local PowerShell object (which contains the references to the current Azure Load Balancer) with the new IP configuration
    $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0] = $ipconf
    
    # Update the model of the scale set with the new configuration in the local PowerShell object
    Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -virtualMachineScaleSet $vmss
    
  • Azure CLI:

    # Remove the load balancer backend pool from the scale set model
    az vmss update --resource-group myResourceGroup --name myScaleSet --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerBackendAddressPools 0
    
    # Remove the load balancer backend pool from the scale set model; only necessary if you have NAT pools configured on the scale set
    az vmss update --resource-group myResourceGroup --name myScaleSet --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerInboundNatPools 0
    
    # Add the application gateway backend pool to the scale set model
    az vmss update --resource-group myResourceGroup --name myScaleSet --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'
    

注意

這些命令會假設擴展集上只有一個 IP 設定和負載平衡器。 如果有多個,您可能需要使用清單索引而不是 0

下一步

您也可以使用 Azure CLIAzure PowerShell,在擴展集上執行常見管理工作。