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
-Verbose;
$actualLb
=
New-AzureRmLoadBalancer
-Name
$lbName
-ResourceGroupName
$rgname
-Location
$loc `
-FrontendIpConfiguration
$frontend
-BackendAddressPool
$backendAddressPool `
-Probe
$probe
-LoadBalancingRule
$lbrule
-InboundNatPool
$inboundNatPool
-Verbose;
$expectedLb
=
Get-AzureRmLoadBalancer
-Name
$lbName
-ResourceGroupName
$rgname
四
创建VMSS
$vmssName
=
$rgname;
$adminUsername
=
‘hengwei‘;
$adminPassword
=
"[email protected]";
$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
-Verbose;
五增加VMSS的Autoscale规则
VMSS的Autoscale是在VMSS主机进行性能的监控的基础上,根据VM的性能进行自动的增加VM和减少VM。
有两种方式进行VM性能的监视:
1 Azure Host上取到的信息
通过Azure Monitor取得VM的信息
可以支持的监控内容如以下链接:
https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-supported-metrics
可以看到,在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
$protectedSettings
Update-AzureRmVmss
-VirtualMachineScaleSet
$vmss
-ResourceGroupName
$rgname
-VMScaleSetName
$vmssname
其中diag_nosubid.xml文件的链接如下:
https://hwshare.blob.core.chinacloudapi.cn/soft/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的Setting
Add-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。