在應用程式的整個生命週期中,您可能需要修改或更新您的虛擬機器擴展集。 這些更新可能包括如何更新擴展集的組態,或者變更應用程式組態。 本文說明如何使用 Azure CLI 修改現有的擴展集。
下面,我們會宣告將在此檔中使用的環境變數。 隨機的後綴會被附加到每個部署都需唯一的資源名稱上。
REGION
設定為 WestUS2。
設定資源群組
繼續之前,請確定資源群組存在。 如果資源群組不存在,此步驟就會建立資源群組。
export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RESOURCE_GROUP_NAME="myResourceGroup$RANDOM_SUFFIX"
export REGION="WestUS2"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION
{
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx",
"location": "WestUS2",
"managedBy": null,
"name": "myResourceGroupxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
建立虛擬機擴展群組
若要確保後續的更新和查詢命令具有有效資源可運作,請建立虛擬機器規模設定。 在此步驟中,我們會使用有效的映像 (Ubuntu2204) 部署基本擴展集,並將實例計數設定為 5,讓實例特定的更新可以以現有的實例標識符為目標。
export SCALE_SET_NAME="myScaleSet$RANDOM_SUFFIX"
az vmss create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $SCALE_SET_NAME \
--image Ubuntu2204 \
--upgrade-policy-mode manual \
--instance-count 5 \
--admin-username azureuser \
--generate-ssh-keys
{
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
"location": "WestUS2",
"name": "myScaleSetxxx",
"provisioningState": "Succeeded"
}
更新擴展集模型
擴展集具有「擴展集模型」,可擷取擴展集整體的「預期」狀態。 若要查詢擴展集的模型,您可以使用 az vmss show:
az vmss show --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME
確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:
{
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
"location": "WestUS2",
"name": "myScaleSetxxx",
"orchestrationMode": "Flexible",
"platformFaultDomainCount": 1,
"resourceGroup": "myResourceGroupxxx",
"sku": {
"capacity": 5,
"name": "Standard_DS1_v2",
"tier": "Standard"
},
"timeCreated": "2022-11-29T22:16:43.250912+00:00",
"type": "Microsoft.Compute/virtualMachineScaleSets",
"networkProfile": {
"networkApiVersion": "2020-11-01",
"networkInterfaceConfigurations": [
{
"deleteOption": "Delete",
"disableTcpStateTracking": false,
"dnsSettings": {
"dnsServers": []
},
"enableIpForwarding": false,
"ipConfigurations": [
{
"applicationGatewayBackendAddressPools": [],
"applicationSecurityGroups": [],
"loadBalancerBackendAddressPools": [
{
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/loadBalancers/myScaleSetLB/backendAddressPools/myScaleSetLBBEPool",
"resourceGroup": "myResourceGroupxxx"
}
],
"name": "mysca2215IPConfig",
"privateIpAddressVersion": "IPv4",
"subnet": {
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myScaleSetVNET/subnets/myScaleSetSubnet",
"resourceGroup": "myResourceGroupxxx"
}
}
],
"name": "mysca2215Nic",
"networkSecurityGroup": {
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkSecurityGroups/myScaleSetNSG",
"resourceGroup": "myResourceGroupxxx"
},
"primary": true
}
]
},
"osProfile": {
"allowExtensionOperations": true,
"computerNamePrefix": "myScaleS",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVmAgentPlatformUpdates": false,
"patchSettings": {
"assessmentMode": "ImageDefault",
"patchMode": "ImageDefault"
},
"provisionVmAgent": true
}
},
"storageProfile": {
"imageReference": {
"offer": "UbuntuServer",
"publisher": "Canonical",
"sku": "22_04-lts",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"deleteOption": "Delete",
"diskSizeGb": 30,
"managedDisk": {
"storageAccountType": "Premium_LRS"
},
"osType": "Linux"
}
}
}
您可以使用 az vmss update 來更新擴展集的各種屬性。 例如,更新授權類型或 VM 的實例保護原則。 請注意,允許的授權類型值 是RHEL_BYOS ,而不是 Windows_Server。
az vmss update --name $SCALE_SET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --license-type RHEL_BYOS
export INSTANCE_ID=$(az vmss list-instances \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $SCALE_SET_NAME \
--query "[0].instanceId" \
-o tsv)
az vmss update \
--name $SCALE_SET_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--instance-id "$INSTANCE_ID" \
--protect-from-scale-set-actions False \
--protect-from-scale-in
此外,如果您先前使用 az vmss create
命令部署擴展集,您可以再次執行 az vmss create
命令來更新擴展集。 請確保 az vmss create
命令中的所有屬性都與之前相同,除了您想要修改的屬性之外。 例如,下面我們會將實例計數增加到五個。
這很重要
自 2023 年 11 月起,如果未指定協調流程模式,則使用 PowerShell 和 Azure CLI 建立的 VM 擴展集會預設為彈性協調流程模式。 如需此變更的詳細資訊,以及您應該採取的動作,請前往針對 VMSS PowerShell/CLI 客戶的重大改變 - Microsoft 社群中樞
az vmss create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $SCALE_SET_NAME \
--orchestration-mode flexible \
--image RHELRaw8LVMGen2 \
--admin-username azureuser \
--generate-ssh-keys \
--instance-count 5 \
--os-disk-size-gb 64
更新規模設定中的個別 VM 實例
就像擴展集有模型檢視一樣,擴展集內的每個 VM 執行個體也有自己的模型檢視。 若要查詢擴展集中特定 VM 實例的模型檢視,您可以使用 az vm show。
export INSTANCE_NAME=$(az vmss list-instances \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $SCALE_SET_NAME \
--query "[0].name" \
-o tsv)
az vm show --resource-group $MY_RESOURCE_GROUP_NAME --name $INSTANCE_NAME
確切的輸出呈現內容取決於您提供給命令的選項。 下列範例會示範 Azure CLI 的扼要範例輸出:
{
"hardwareProfile": {
"vmSize": "Standard_DS1_v2"
},
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myScaleSet_Instance1",
"location": "WestUS2",
"name": "myScaleSet_Instance1",
"networkProfile": {
"networkInterfaces": [
{
"deleteOption": "Delete",
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkInterfaces/mysca2215Nic-5cf164f7",
"primary": true,
"resourceGroup": "myResourceGroupxxx"
}
]
},
"osProfile": {
"allowExtensionOperations": true,
"computerName": "myScaleset_Computer1",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVmAgentPlatformUpdates": false,
"patchSettings": {
"assessmentMode": "ImageDefault",
"patchMode": "ImageDefault"
},
"provisionVmAgent": true
}
},
"provisioningState": "Succeeded",
"resourceGroup": "myResourceGroupxxx",
"storageProfile": {
"dataDisks": [],
"imageReference": {
"exactVersion": "22.04.202204200",
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"deleteOption": "Delete",
"diskSizeGb": 30,
"managedDisk": {
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/myScaleSet_Instance1_disk1_xxx",
"resourceGroup": "myResourceGroupxxx",
"storageAccountType": "Premium_LRS"
},
"name": "myScaleSet_Instance1_disk1_xxx",
"osType": "Linux"
}
},
"timeCreated": "2022-11-29T22:16:44.500895+00:00",
"type": "Microsoft.Compute/virtualMachines",
"virtualMachineScaleSet": {
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
"resourceGroup": "myResourceGroupxxx"
}
}
這些屬性會描述擴展集內 VM 執行個體的設定,而非整個擴展集的設定。
您可以像對獨立 VM 一樣,對擴展集中個別 VM 實例執行更新。 例如,將新的數據磁碟連結至實例 1:
az vm disk attach --resource-group $MY_RESOURCE_GROUP_NAME --vm-name $INSTANCE_NAME --name disk_name1 --new
再次 執行 az vm show ,我們現在會看到 VM 實例已連結新的磁碟。
{
"storageProfile": {
"dataDisks": [
{
"caching": "None",
"createOption": "Empty",
"deleteOption": "Detach",
"diskSizeGb": 1023,
"lun": 0,
"managedDisk": {
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/disk_name1",
"resourceGroup": "myResourceGroupxxx",
"storageAccountType": "Premium_LRS"
},
"name": "disk_name1",
"toBeDetached": false
}
]
}
}
將實例新增至擴展集
有時候您可能會想要將新的 VM 新增至擴展集,但想要不同於擴展集模型中所列的組態選項。 VM 可以在建立期間使用 az vm create 命令新增至擴展集,並指定您要新增實例的擴展集名稱。
export NEW_INSTANCE_NAME="myNewInstance$RANDOM_SUFFIX"
az vm create --name $NEW_INSTANCE_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vmss $SCALE_SET_NAME --image RHELRaw8LVMGen2
{
"fqdns": "",
"id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myNewInstancexxx",
"location": "WestUS2",
"macAddress": "60-45-BD-D7-13-DD",
"powerState": "VM running",
"privateIpAddress": "10.0.0.6",
"publicIpAddress": "20.172.144.96",
"resourceGroup": "myResourceGroupxxx",
"zones": ""
}
然後如果我們檢查規模設定,就會看到新增的實例。
az vm list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Name ResourceGroup Location
-------------------- --------------- ----------
myNewInstancexxx myResourceGroupxxx WestUS2
myScaleSet_Instance1 myResourceGroupxxx WestUS2
myScaleSet_Instance1 myResourceGroupxxx WestUS2
使用最新的擴展集模型將 VM up-to更新至最新版本
備註
使用彈性協調流程模式的虛擬機擴展集目前不支持升級模式。
擴展集具有「升級原則」,決定 VM 如何更新至最新的擴展集模型以符合 up-to。 升級原則的三種模式如下:
- 自動 - 在此模式中,擴展集不會保證 VM 的關閉順序。 規模設定可能會一次性關閉所有 VM。
- 滾動 - 在此模式中,擴展集會以批次方式推出更新,並在批次之間有選擇性的暫停時間。
- 手動 - 在此模式中,當您更新擴展集模型時,在觸發手動更新之前,現有 VM 不會發生任何動作。
如果您的擴展集設定為手動升級,您可以使用 az vmss update 觸發手動升級。
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME
備註
Service Fabric 叢集只能使用 自動 模式,但更新會以不同的方式處理。 如需詳細資訊,請參閱 Service Fabric 應用程式升級。
重新設定擴展集的映像
虛擬機器擴展集將會為擴展集中的每個 VM 產生唯一的名稱。 命名慣例會因協調流程模式而有所不同:
- 彈性編排模式:{scale-set-name}_{8-char-guid}
- 統一協調模式:{scale-set-name}_{instance-id}
如果您需要重新設定特定實例的映像,請使用 az vmss reimage 並指定實例識別碼。另一個選項是使用 az vm redeploy 直接重新映像 VM。 如果您想要重新設定 VM 的映像,而不需要指定實例識別碼,此命令就很有用。
# Get the VM name first
VM_NAME=$(az vmss list-instances \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $SCALE_SET_NAME \
--query "[0].name" \
-o tsv)
# Reimage the VM directly
az vm redeploy \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $VM_NAME
更新擴展集的 OS 映像
您可能有執行舊版 Ubuntu 的規模設定。 您想要更新為較新版本的Ubuntu,例如最新版本。 映像參考版本屬性不是清單的一部分,因此您可以使用 az vmss update 直接修改這些屬性。
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --set virtualMachineProfile.storageProfile.imageReference.version=latest
或者,您可能想要變更擴展集使用的映像。 例如,您可能要更新或變更擴展集使用的自訂映像。 您可以藉由更新映像參考 ID 屬性,來變更您的規模設定組使用的映像。 映像參考標識碼屬性不是清單的一部分,因此您可以使用 az vmss update 直接修改此屬性。
如果您使用 Azure 平台映像,您可以修改 imageReference (如需詳細資訊,請參閱 REST API 文件) 來更新映像。
備註
使用平台映像時,通常會指定 "latest" 作為映像參考版本。 當您建立、擴增及重新安裝映像時,會使用最新可用版本來建立虛擬機器。 不過,這並不意謂著作業系統映像會在新映像版本發行時自動更新。 獨立功能可提供自動作業系統升級。 如需詳細資訊,請參閱 自動作業系統升級文件。
如果您使用自訂映像,您可以透過更新 imageReference ID 來更新映像(如需更多資訊,請參閱 REST API 文件)。
更新擴展集的負載平衡器
假設您有一個含有 Azure Load Balancer 的擴展集,而您想要以「Azure 應用程式閘道」取代 Azure Load Balancer。 擴展集的負載平衡器和應用程式閘道屬性是清單的一部分,因此您可以使用命令來移除或新增清單元素,而不是直接修改屬性。
# Remove the load balancer backend pool from the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --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 $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --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 $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/xxxxx/resourceGroups/'$MY_RESOURCE_GROUP_NAME'/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'
備註
這些命令會假設擴展集上只有一個 IP 設定和負載平衡器。 如果有多個,您可能需要使用非0的清單索引。
後續步驟
在本教學課程中,您已瞭解如何修改擴展集和個別實例的各個層面。
- 更新擴展集模型
- 更新虛擬機規模集中的個別 VM 實例
- 將實例新增至擴展集
- 使用最新的擴展集模型將 VM up-to更新至最新版本
- 重新設定擴展集的映像
- 更新擴展集的 OS 映像
- 更新擴展集的負載平衡器