你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure 门户创建虚拟机规模集
本文将详细介绍如何使用 Azure CLI 创建虚拟机规模集。
确保已安装最新的 Azure CLI,并且已使用 az login 登录到 Azure 帐户。
启动 Azure Cloud Shell
Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。
若要打开 Cloud Shell,请从代码块的右上角选择“打开 Cloud Shell”。 也可以通过转到 https://shell.azure.com/cli 在单独的浏览器标签页中启动 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后按 Enter 来运行它。
定义环境变量
如下所示定义环境变量。
export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myVMSSResourceGroup$RANDOM_ID"
export REGION=EastUS
export MY_VMSS_NAME="myVMSS$RANDOM_ID"
export MY_USERNAME=azureuser
export MY_VM_IMAGE="Ubuntu2204"
export MY_VNET_NAME="myVNet$RANDOM_ID"
export NETWORK_PREFIX="$(($RANDOM % 254 + 1))"
export MY_VNET_PREFIX="10.$NETWORK_PREFIX.0.0/16"
export MY_VM_SN_NAME="myVMSN$RANDOM_ID"
export MY_VM_SN_PREFIX="10.$NETWORK_PREFIX.0.0/24"
export MY_APPGW_SN_NAME="myAPPGWSN$RANDOM_ID"
export MY_APPGW_SN_PREFIX="10.$NETWORK_PREFIX.1.0/24"
export MY_APPGW_NAME="myAPPGW$RANDOM_ID"
export MY_APPGW_PUBLIC_IP_NAME="myAPPGWPublicIP$RANDOM_ID"
创建资源组
资源组是在其中部署和管理 Azure 资源的逻辑容器。 所有资源都必须在资源组中部署。 以下命令创建具有前面定义的 $MY_RESOURCE_GROUP_NAME 和 $REGION 参数的资源组。
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION -o JSON
结果:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx",
"location": "eastus",
"managedBy": null,
"name": "myVMSSResourceGroupxxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
创建网络资源
现在,你将创建网络资源。 在此步骤中,你将创建 1 个虚拟网络、1 个用于应用程序网关的子网 1,以及 1 个用于 VM 的子网。 你还需要有一个公共 IP 来附加应用程序网关,以便从 Internet 访问 Web 应用程序。
创建虚拟网络和子网
az network vnet create --name $MY_VNET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $REGION --address-prefix $MY_VNET_PREFIX --subnet-name $MY_VM_SN_NAME --subnet-prefix $MY_VM_SN_PREFIX -o JSON
结果:
{
"newVNet": {
"addressSpace": {
"addressPrefixes": [
"10.X.0.0/16"
]
},
"enableDdosProtection": false,
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx",
"location": "eastus",
"name": "myVNetxxxxxx",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"subnets": [
{
"addressPrefix": "10.X.0.0/24",
"delegations": [],
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myVMSNxxxxxx",
"name": "myVMSNxxxxxx",
"privateEndpointNetworkPolicies": "Disabled",
"privateLinkServiceNetworkPolicies": "Enabled",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/virtualNetworks/subnets"
}
],
"type": "Microsoft.Network/virtualNetworks",
"virtualNetworkPeerings": []
}
}
创建应用程序网关资源
Azure 应用程序网关需要虚拟网络中的专用子网。 以下命令会在虚拟网络 $MY_VNET_NAME 中创建一个名为 $MY_APPGW_SN_NAME 的子网,指定的地址前缀为 $MY_APPGW_SN_PREFIX。
az network vnet subnet create --name $MY_APPGW_SN_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vnet-name $MY_VNET_NAME --address-prefix $MY_APPGW_SN_PREFIX -o JSON
结果:
{
"addressPrefix": "10.66.1.0/24",
"delegations": [],
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myAPPGWSNxxxxxx",
"name": "myAPPGWSNxxxxxx",
"privateEndpointNetworkPolicies": "Disabled",
"privateLinkServiceNetworkPolicies": "Enabled",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/virtualNetworks/subnets"
}
以下命令会在资源组中创建标准、区域冗余、静态、公共 IPv4。
az network public-ip create --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_APPGW_PUBLIC_IP_NAME --sku Standard --location $REGION --allocation-method static --version IPv4 --zone 1 2 3 -o JSON
结果:
{
"publicIp": {
"ddosSettings": {
"protectionMode": "VirtualNetworkInherited"
},
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/publicIPAddresses//myAPPGWPublicIPxxxxxx",
"idleTimeoutInMinutes": 4,
"ipAddress": "X.X.X.X",
"ipTags": [],
"location": "eastus",
"name": "/myAPPGWPublicIPxxxxxx",
"provisioningState": "Succeeded",
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sku": {
"name": "Standard",
"tier": "Regional"
},
"type": "Microsoft.Network/publicIPAddresses",
"zones": [
"1",
"2",
"3"
]
}
}
在此步骤中,你将创建一个要与虚拟机规模集集成的应用程序网关。 此示例使用 Standard_v2 SKU 创建一个区域冗余应用程序网关,并为该应用程序网关启用 Http 通信。 上一步中创建的公共 IP $MY_APPGW_PUBLIC_IP_NAME 会附加到该应用程序网关。
az network application-gateway create --name $MY_APPGW_NAME --location $REGION --resource-group $MY_RESOURCE_GROUP_NAME --vnet-name $MY_VNET_NAME --subnet $MY_APPGW_SN_NAME --capacity 2 --zones 1 2 3 --sku Standard_v2 --http-settings-cookie-based-affinity Disabled --frontend-port 80 --http-settings-port 80 --http-settings-protocol Http --public-ip-address $MY_APPGW_PUBLIC_IP_NAME --priority 1001 -o JSON
{
"applicationGateway": {
"backendAddressPools": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendAddressPools/appGatewayBackendPool",
"name": "appGatewayBackendPool",
"properties": {
"backendAddresses": [],
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
]
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/backendAddressPools"
}
],
"backendHttpSettingsCollection": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendHttpSettingsCollection/appGatewayBackendHttpSettings",
"name": "appGatewayBackendHttpSettings",
"properties": {
"connectionDraining": {
"drainTimeoutInSec": 1,
"enabled": false
},
"cookieBasedAffinity": "Disabled",
"pickHostNameFromBackendAddress": false,
"port": 80,
"protocol": "Http",
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"requestTimeout": 30
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection"
}
],
"backendSettingsCollection": [],
"frontendIPConfigurations": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendIPConfigurations/appGatewayFrontendIP",
"name": "appGatewayFrontendIP",
"properties": {
"httpListeners": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"privateIPAllocationMethod": "Dynamic",
"provisioningState": "Succeeded",
"publicIPAddress": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/publicIPAddresses/myAPPGWPublicIPxxxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/frontendIPConfigurations"
}
],
"frontendPorts": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendPorts/appGatewayFrontendPort",
"name": "appGatewayFrontendPort",
"properties": {
"httpListeners": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"port": 80,
"provisioningState": "Succeeded"
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/frontendPorts"
}
],
"gatewayIPConfigurations": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/gatewayIPConfigurations/appGatewayFrontendIP",
"name": "appGatewayFrontendIP",
"properties": {
"provisioningState": "Succeeded",
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myAPPGWSNxxxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/gatewayIPConfigurations"
}
],
"httpListeners": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"name": "appGatewayHttpListener",
"properties": {
"frontendIPConfiguration": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendIPConfigurations/appGatewayFrontendIP",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"frontendPort": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendPorts/appGatewayFrontendPort",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"hostNames": [],
"protocol": "Http",
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"requireServerNameIndication": false
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/httpListeners"
}
],
"listeners": [],
"loadDistributionPolicies": [],
"operationalState": "Running",
"privateEndpointConnections": [],
"privateLinkConfigurations": [],
"probes": [],
"provisioningState": "Succeeded",
"redirectConfigurations": [],
"requestRoutingRules": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"name": "rule1",
"properties": {
"backendAddressPool": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"backendHttpSettings": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendHttpSettingsCollection/appGatewayBackendHttpSettings",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"httpListener": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"priority": 1001,
"provisioningState": "Succeeded",
"ruleType": "Basic"
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/requestRoutingRules"
}
],
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"rewriteRuleSets": [],
"routingRules": [],
"sku": {
"capacity": 2,
"family": "Generation_1",
"name": "Standard_v2",
"tier": "Standard_v2"
},
"sslCertificates": [],
"sslProfiles": [],
"trustedClientCertificates": [],
"trustedRootCertificates": [],
"urlPathMaps": []
}
}
创建虚拟机规模集
重要
从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及你应采取哪些操作,请访问针对 VMSS PowerShell/CLI 客户的中断性变更 - Microsoft 社区中心
现在,使用 az vmss create 创建虚拟机规模集。 以下示例会创建一个实例计数为 2 的区域冗余规模集,它具有资源组 $MY_RESOURCE_GROUP_NAME 中的子网 $MY_VM_SN_NAME 中的公共 IP,该示例还会集成应用程序网关并生成 SSH 密钥。 如果需要通过 ssh 登录到 VM,请务必保存 SSH 密钥。
az vmss create --name $MY_VMSS_NAME --resource-group $MY_RESOURCE_GROUP_NAME --image $MY_VM_IMAGE --admin-username $MY_USERNAME --generate-ssh-keys --public-ip-per-vm --orchestration-mode Uniform --instance-count 2 --zones 1 2 3 --vnet-name $MY_VNET_NAME --subnet $MY_VM_SN_NAME --vm-sku Standard_DS2_v2 --upgrade-policy-mode Automatic --app-gateway $MY_APPGW_NAME --backend-pool-name appGatewayBackendPool -o JSON
结果:
{
"vmss": {
"doNotRunExtensionsOnOverprovisionedVMs": false,
"orchestrationMode": "Uniform",
"overprovision": true,
"platformFaultDomainCount": 1,
"provisioningState": "Succeeded",
"singlePlacementGroup": false,
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00",
"uniqueId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"upgradePolicy": {
"mode": "Automatic",
"rollingUpgradePolicy": {
"maxBatchInstancePercent": 20,
"maxSurge": false,
"maxUnhealthyInstancePercent": 20,
"maxUnhealthyUpgradedInstancePercent": 20,
"pauseTimeBetweenBatches": "PT0S",
"rollbackFailedInstancesOnPolicyBreach": false
}
},
"virtualMachineProfile": {
"networkProfile": {
"networkInterfaceConfigurations": [
{
"name": "myvmsa53cNic",
"properties": {
"disableTcpStateTracking": false,
"dnsSettings": {
"dnsServers": []
},
"enableAcceleratedNetworking": false,
"enableIPForwarding": false,
"ipConfigurations": [
{
"name": "myvmsa53cIPConfig",
"properties": {
"applicationGatewayBackendAddressPools": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGW7xxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"privateIPAddressVersion": "IPv4",
"publicIPAddressConfiguration": {
"name": "instancepublicip",
"properties": {
"idleTimeoutInMinutes": 10,
"ipTags": [],
"publicIPAddressVersion": "IPv4"
}
},
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxx/subnets/myVMSN7xxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxxx"
}
}
}
],
"primary": true
}
}
]
},
"osProfile": {
"adminUsername": "azureuser",
"allowExtensionOperations": true,
"computerNamePrefix": "myvmsa53c",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVMAgentPlatformUpdates": false,
"provisionVMAgent": true,
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa xxxxxxxx",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
}
},
"requireGuestProvisionSignal": true,
"secrets": []
},
"storageProfile": {
"diskControllerType": "SCSI",
"imageReference": {
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts-gen2",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": 30,
"managedDisk": {
"storageAccountType": "Premium_LRS"
},
"osType": "Linux"
}
},
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00"
},
"zoneBalance": false
}
}
使用虚拟机规模集扩展安装 ngnix
以下命令使用虚拟机规模集扩展运行自定义脚本,该脚本会安装 ngnix 并发布一个页面来显示 HTTP 请求命中的虚拟机的主机名。
az vmss extension set --publisher Microsoft.Azure.Extensions --version 2.0 --name CustomScript --resource-group $MY_RESOURCE_GROUP_NAME --vmss-name $MY_VMSS_NAME --settings '{ "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh" }' -o JSON
结果:
{
"additionalCapabilities": null,
"automaticRepairsPolicy": null,
"constrainedMaximumCapacity": null,
"doNotRunExtensionsOnOverprovisionedVMs": false,
"extendedLocation": null,
"hostGroup": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxx",
"identity": null,
"location": "eastus",
"name": "myVMSSxxxx",
"orchestrationMode": "Uniform",
"overprovision": true,
"plan": null,
"platformFaultDomainCount": 1,
"priorityMixPolicy": null,
"provisioningState": "Succeeded",
"proximityPlacementGroup": null,
"resourceGroup": "myVMSSResourceGroupxxxxx",
"scaleInPolicy": null,
"singlePlacementGroup": false,
"sku": {
"capacity": 2,
"name": "Standard_DS2_v2",
"tier": "Standard"
},
"spotRestorePolicy": null,
"tags": {},
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00",
"type": "Microsoft.Compute/virtualMachineScaleSets",
"uniqueId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"upgradePolicy": {
"automaticOsUpgradePolicy": null,
"mode": "Automatic",
"rollingUpgradePolicy": {
"enableCrossZoneUpgrade": null,
"maxBatchInstancePercent": 20,
"maxSurge": false,
"maxUnhealthyInstancePercent": 20,
"maxUnhealthyUpgradedInstancePercent": 20,
"pauseTimeBetweenBatches": "PT0S",
"prioritizeUnhealthyInstances": null,
"rollbackFailedInstancesOnPolicyBreach": false
}
},
"virtualMachineProfile": {
"applicationProfile": null,
"billingProfile": null,
"capacityReservation": null,
"diagnosticsProfile": null,
"evictionPolicy": null,
"extensionProfile": {
"extensions": [
{
"autoUpgradeMinorVersion": true,
"enableAutomaticUpgrade": null,
"forceUpdateTag": null,
"id": null,
"name": "CustomScript",
"protectedSettings": null,
"protectedSettingsFromKeyVault": null,
"provisionAfterExtensions": null,
"provisioningState": null,
"publisher": "Microsoft.Azure.Extensions",
"settings": {
"commandToExecute": "./automate_nginx.sh",
"fileUris": [
"https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"
]
},
"suppressFailures": null,
"type": null,
"typeHandlerVersion": "2.0",
"typePropertiesType": "CustomScript"
}
],
"extensionsTimeBudget": null
},
"hardwareProfile": null,
"licenseType": null,
"networkProfile": {
"healthProbe": null,
"networkApiVersion": null,
"networkInterfaceConfigurations": [
{
"deleteOption": null,
"disableTcpStateTracking": false,
"dnsSettings": {
"dnsServers": []
},
"enableAcceleratedNetworking": false,
"enableFpga": null,
"enableIpForwarding": false,
"ipConfigurations": [
{
"applicationGatewayBackendAddressPools": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"applicationSecurityGroups": null,
"loadBalancerBackendAddressPools": null,
"loadBalancerInboundNatPools": null,
"name": "myvmsdxxxIPConfig",
"primary": null,
"privateIpAddressVersion": "IPv4",
"publicIpAddressConfiguration": null,
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxx/subnets/myVMSNxxxxx",
"resourceGroup": "myVMSSResourceGroupaxxxxx"
}
}
],
"name": "myvmsxxxxxx",
"networkSecurityGroup": null,
"primary": true
}
]
},
"osProfile": {
"adminPassword": null,
"adminUsername": "azureuser",
"allowExtensionOperations": true,
"computerNamePrefix": "myvmsdxxx",
"customData": null,
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVmAgentPlatformUpdates": false,
"patchSettings": null,
"provisionVmAgent": true,
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa xxxxxxxx",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
}
},
"requireGuestProvisionSignal": true,
"secrets": [],
"windowsConfiguration": null
},
"priority": null,
"scheduledEventsProfile": null,
"securityPostureReference": null,
"securityProfile": null,
"serviceArtifactReference": null,
"storageProfile": {
"dataDisks": null,
"diskControllerType": "SCSI",
"imageReference": {
"communityGalleryImageId": null,
"exactVersion": null,
"id": null,
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sharedGalleryImageId": null,
"sku": "22_04-lts-gen2",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"deleteOption": null,
"diffDiskSettings": null,
"diskSizeGb": 30,
"image": null,
"managedDisk": {
"diskEncryptionSet": null,
"securityProfile": null,
"storageAccountType": "Premium_LRS"
},
"name": null,
"osType": "Linux",
"vhdContainers": null,
"writeAcceleratorEnabled": null
}
},
"userData": null
},
"zoneBalance": false,
"zones": [
"1",
"2",
"3"
]
}
定义自动缩放配置文件
若要在规模集上启用自动缩放,首先请定义自动缩放配置文件。 此配置文件定义默认、最小和最大规模集容量。 这些限制让你不用继续创建 VM 实例,从而控制成本,并且在可接受的性能与横向缩减事件中保留的最小实例数量之间取得平衡。 以下示例设置默认值、两个 VM 实例的最小容量,以及最大容量 10:
az monitor autoscale create --resource-group $MY_RESOURCE_GROUP_NAME --resource $MY_VMSS_NAME --resource-type Microsoft.Compute/virtualMachineScaleSets --name autoscale --min-count 2 --max-count 10 --count 2
结果:
{
"enabled": true,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/microsoft.insights/autoscalesettings/autoscale",
"location": "eastus",
"name": "autoscale",
"namePropertiesName": "autoscale",
"notifications": [
{
"email": {
"customEmails": [],
"sendToSubscriptionAdministrator": false,
"sendToSubscriptionCoAdministrators": false
},
"webhooks": []
}
],
"predictiveAutoscalePolicy": {
"scaleLookAheadTime": null,
"scaleMode": "Disabled"
},
"profiles": [
{
"capacity": {
"default": "2",
"maximum": "10",
"minimum": "2"
},
"fixedDate": null,
"name": "default",
"recurrence": null,
"rules": []
}
],
"resourceGroup": "myVMSSResourceGroupxxxxx",
"systemData": null,
"tags": {},
"targetResourceLocation": null,
"targetResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"type": "Microsoft.Insights/autoscaleSettings"
}
创建规则,以便自动横向扩展
以下命令会创建一个规则,当平均 CPU 负载在 5 分钟内超过 70% 时,该规则会增加规模集中的 VM 实例数。 触发规则时,VM 实例数增加 3。
az monitor autoscale rule create --resource-group $MY_RESOURCE_GROUP_NAME --autoscale-name autoscale --condition "Percentage CPU > 70 avg 5m" --scale out 3
结果:
{
"metricTrigger": {
"dimensions": [],
"dividePerInstance": null,
"metricName": "Percentage CPU",
"metricNamespace": null,
"metricResourceLocation": null,
"metricResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"operator": "GreaterThan",
"statistic": "Average",
"threshold": "70",
"timeAggregation": "Average",
"timeGrain": "PT1M",
"timeWindow": "PT5M"
},
"scaleAction": {
"cooldown": "PT5M",
"direction": "Increase",
"type": "ChangeCount",
"value": "3"
}
}
创建规则,以便自动横向缩减
使用 az monitor autoscale rule create
创建一个规则,当平均 CPU 负载在 5 分钟内下降至 30% 以下时,该规则会减少规模集中的 VM 实例数。 以下示例定义将 VM 实例数减 1 的规则。
az monitor autoscale rule create --resource-group $MY_RESOURCE_GROUP_NAME --autoscale-name autoscale --condition "Percentage CPU < 30 avg 5m" --scale in 1
结果:
{
"metricTrigger": {
"dimensions": [],
"dividePerInstance": null,
"metricName": "Percentage CPU",
"metricNamespace": null,
"metricResourceLocation": null,
"metricResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"operator": "LessThan",
"statistic": "Average",
"threshold": "30",
"timeAggregation": "Average",
"timeGrain": "PT1M",
"timeWindow": "PT5M"
},
"scaleAction": {
"cooldown": "PT5M",
"direction": "Decrease",
"type": "ChangeCount",
"value": "1"
}
}
测试页面
以下命令会显示应用程序网关的公共 IP。 将 IP 地址粘贴到浏览器页中以进行测试。
az network public-ip show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_APPGW_PUBLIC_IP_NAME --query [ipAddress] --output tsv
清理资源(可选)
若要避免 Azure 费用,应清除不需要的资源。 如果不再需要规模集和其他资源,请使用 az group delete 删除资源组及其所有资源。 --no-wait
参数会使光标返回提示符处,无需等待操作完成。 使用 --yes
参数将确认你希望删除资源,不会再通过其他提示进行询问。 本教程会为你清理资源。