VMSS的创建可以采用Portal、Powershell、Azure CLI或者Template。
但目前Portal创建有很多限制,本文将介绍如何用PowerShell来创建VMSS的集群。
具体的创建过程有以下几个步骤:
1 创建Resource Group
2 创建Vnet
3 创建Public IP、LoadBalancer
4 创建VMSS
5 增加VMSS的Autoscale规则
一创建Resource Group
具体命令如下:
$loc = 'chinanorth';$rgname = 'hwvmss';New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
二创建Vnet
具体命令如下:
$subnetName = 'vlan1'$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetName ` -AddressPrefix "10.1.1.0/24";$vnet = New-AzureRmVirtualNetwork -Force -Name $rgname ` -ResourceGroupName $rgname -Location $loc ` -AddressPrefix "10.1.0.0/16" -Subnet $subnet;$vnet = Get-AzureRmVirtualNetwork -Name $rgname ` -ResourceGroupName $rgname;$subnetId = $vnet.Subnets[0].Id;
三创建Public IP、LoadBalancer
1 创建Public IP
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) ` -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic ` -DomainNameLabel ('pubip' + $rgname);$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) ` -ResourceGroupName $rgname;
2 创建LoadBalancer
$frontendName = 'fe' + $rgname$backendAddressPoolName = 'bepool' + $rgname$probeName = 'vmssprobe' + $rgname$inboundNatPoolName = 'innatpool' + $rgname$lbruleName = 'lbrule' + $rgname$lbName = 'vmsslb' + $rgname$frontend = New-AzureRmLoadBalancerFrontendIpConfig ` -Name $frontendName -PublicIpAddress $pubip$backendAddressPool = New-AzureRmLoadBalancerBackendAddressPoolConfig ` -Name $backendAddressPoolName$probe = New-AzureRmLoadBalancerProbeConfig -name $probeName ` -Protocol Tcp -Port 80 -IntervalInSeconds 15 -ProbeCount 2 $frontendpoolrangestart = 22100$frontendpoolrangeend = 22200$backendvmport = 22$inboundNatPool = New-AzureRmLoadBalancerInboundNatPoolConfig ` -Name $inboundNatPoolName ` -FrontendIPConfigurationId $frontend.Id -Protocol Tcp ` -FrontendPortRangeStart $frontendpoolrangestart ` -FrontendPortRangeEnd $frontendpoolrangeend ` -BackendPort $backendvmport;$protocol = 'Tcp'$feLBPort = 80$beLBPort = 80$lbrule = New-AzureRmLoadBalancerRuleConfig -Name $lbruleName ` -FrontendIPConfiguration $frontend ` -BackendAddressPool $backendAddressPool ` -Probe $probe -Protocol $protocol ` -FrontendPort $feLBPort -BackendPort $beLBPort ` -IdleTimeoutInMinutes 15 -LoadDistribution SourceIP $actualLb = New-AzureRmLoadBalancer -Name $lbName ` -ResourceGroupName $rgname ` -Location $loc-FrontendIpConfiguration $frontend ` -BackendAddressPool $backendAddressPool-Probe $probe ` -LoadBalancingRule $lbrule ` -InboundNatPool $inboundNatPool $expectedLb = Get-AzureRmLoadBalancer -Name $lbName ` -ResourceGroupName $rgname
四创建VMSS
$vmssName = $rgname;$adminUsername = 'hengwei';$adminPassword = "xxxxxxx";$PublisherName = 'OpenLogic'$Offer = 'CentOS'$Sku = '7.2'$Version = 'latest'$vmNamePrefix = 'centosvmss'$ipCfg = New-AzureRmVmssIPConfig -Name 'nic' `-LoadBalancerInboundNatPoolsId $actualLb.InboundNatPools[0].Id `-LoadBalancerBackendAddressPoolsId $actualLb.BackendAddressPools[0].Id `-SubnetId $subnetId;$numberofnodes = 3$vmss = New-AzureRmVmssConfig -Location $loc -SkuCapacity $numberofnodes ` -SkuName 'Standard_D1' -UpgradePolicyMode 'automatic' ` | Add-AzureRmVmssNetworkInterfaceConfiguration -Name $subnetName ` -Primary $true -IPConfiguration $ipCfg ` | Set-AzureRmVmssOSProfile -ComputerNamePrefix $vmNamePrefix ` -AdminUsername $adminUsername -AdminPassword $adminPassword ` | Set-AzureRmVmssStorageProfile -OsDiskCreateOption 'FromImage' ` -OsDiskCaching 'None' -ImageReferenceOffer $Offer ` -ImageReferenceSku $Sku -ImageReferenceVersion $Version ` -ImageReferencePublisher $PublisherName New-AzureRmVmss -ResourceGroupName $rgname -Name $vmssName -VirtualMachineScaleSet $vmss
五增加VMSS的Autoscale规则
VMSS的Autoscale是在VMSS主机进行性能的监控的基础上,根据VM的性能进行自动的增加VM和减少VM。
有两种方式进行VM性能的监视:
1 Azure Host上取到的信息
通过Azure Monitor取得VM的信息
可以支持的监控内容如以下链接:
可以看到,在Microsoft.Compute/virtualMachineScaleSets中支持的内容有:
Percentage CPU、Network In、Network Out、Disk Read Bytes、Disk Write Bytes、Disk Read Operations/Sec、Disk Write Operations/Sec这些。
Azure中的VMSS可以采用上面的这些指标来进行AutoScale的控制。
但目前AzureChina还不支持这种模式。
2 Azure VM Diagnostics信息
通过在VM中安装Diagnostics Extension,获得诊断信息,通过这种诊断信息中的VM资源情况进行自动扩展。
目前AzureChina支持这种模式。
具体实现步骤如下:
1 创建一个Storage Account,其中的Table用来收集VM的Dagnostic的信息
创建一个General Purpose的Storage Account,本例子中的名字叫hwvmss。
具体创建过程就不描述了。
2 给已有的VMSS中的VM安装Linux Diagnostics的Extension
$rgname = "hwvmss"$vmssname = "hwvmss"$vmss = Get-AzureRmVmss -ResourceGroupName $rgname ` -VMScaleSetName $vmssname$xmlcfg = Get-Content D:\Azure\VMSS\diag_nosubid.xml$xmlCfg = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($xmlCfg))$storageAccountName = "hwvmss"$storageAccountKey = (Get-AzureRmStorageAccountKey ` -ResourceGroupName $rgname -Name $storageAccountName)[0].Value$settings = @{ "xmlCfg" = $xmlCfg; ` "storageAccount" = $storageAccountName}$exname = "Microsoft.Insights.VMDiagnosticsSettings"$publisher = "Microsoft.OSTCExtensions"$type = "LinuxDiagnostic"$typeHandlerVersion = "2.3"$protectedSettings = @{ "storageAccountName" = $storageAccountName;` "storageAccountKey" = $storageAccountKey; ` "storageAccountEndPoint" = "https://core.chinacloudapi.cn"; ` "endpoint" = "table.core.chinacloudapi.cn"}Add-AzureRmVmssExtension -VirtualMachineScaleSet $vmss -Name $exname ` -Publisher $publisher -Type $type ` -TypeHandlerVersion $typeHandlerVersion ` -AutoUpgradeMinorVersion $true ` -Setting $settings ` -ProtectedSetting $protectedSettingsUpdate-AzureRmVmss -VirtualMachineScaleSet $vmss ` -ResourceGroupName $rgname -VMScaleSetName $vmssname
其中diag_nosubid.xml文件的链接如下:
第62行的用户资源ID需要自己更改。就是上面脚本中$vmss.id的内容。
由于是自己定义,这里的监控信息有非常多,查看xml文件就可以知道,有Memory、Processor、Disk等多种指标。
3 查看存储账户的监控信息
由于VMSS创建时,UpgradePolicyMode选择的是automatic。所以在配置更新了Extension后,VM会自动更新配置。
观察Storage中Table的信息,可以看到我们配置的table:
如果用Azure Blob Explorer,可以看到我们定义的各种指标的信息已经吐到table中了:
有了这些信息就可以添加AutoScale了!
4 添加AutoScale的Seeting
具体脚本如下:
#增加机器的规则$rule1 = New-AzureRmAutoscaleRule -MetricName "\Processor\PercentUserTime" ` -MetricResourceId $vmss.id -Operator GreaterThan ` -MetricStatistic Average -Threshold 60 -TimeGrain 00:01:00 ` -TimeWindow 00:05:00 -ScaleActionCooldown 00:05:00 ` -ScaleActionDirection Increase -ScaleActionValue 1#减少机器的规则$rule2 = New-AzureRmAutoscaleRule -MetricName "\Processor\PercentUserTime" ` -MetricResourceId $vmss.id -Operator LessThan ` -MetricStatistic Average -Threshold 30 -TimeGrain 00:01:00 ` -TimeWindow 00:05:00 -ScaleActionCooldown 00:05:00 ` -ScaleActionDirection Decrease -ScaleActionValue 1$profile1 = New-AzureRmAutoscaleProfile -DefaultCapacity 1 ` -MaximumCapacity 10 -MinimumCapacity 1 ` -Rules $rule1,$rule2 ` -Name "autoprofile1"#添加AutoScale的SettingAdd-AzureRmAutoscaleSetting -Location $location -Name "autosetting1" ` -ResourceGroup $rgname ` -TargetResourceId $vmss.id ` -AutoscaleProfiles $profile1
添加完Autoscale Setting后,可以看到,VMSS中的Instance会自动减少到1台。通过添加stress工具,进行CPU的压力测试,可以看到instance的数量会增加。
总结:
通过PowerShell创建VMSS的集群,通过添加VM的Diagnostic,把Instance的资源消耗信息吐出来。再通过Autoscale进行自动的减少和增加Instance。