连冠华,云计算资深架构师

在实际使用过程当中,使用VMSS有一些最佳实践的建议和限制,便于你在做自动扩展设计的时候进行考虑:

关于 VMSS

  • 如果你使用的是系统镜像,一个扩展集中虚拟机数量不能超过 100
  • 无论是在 ASM 还是 ARM 模式下,如果使用自定义的镜像,新创建的虚拟机必须位于自定义镜像的存储账号内(以后会改,暂时不可以)
  • 如果使用的是自定义镜像,一个扩展集中虚拟机数量默认不能超过 20,如果你打开了超量部署,最高不能超过 40
  • 目前在 VMSS 中,暂时不支持数据磁盘,但已经在内部开发测试了,希望不久的将来可以支持
  • 在你一次创建多个 VMSS 的时候,在一个地区,10 分钟内,总的虚拟机数量不能超过 500
  • 在一个 vNet 里面虚拟机数量不能超过 4096 个
  • 建议一个存储账号中虚拟机数量不要超过 20,以保证性能,详细设置方法请参考前面例子中的 ARM 模板
  • 在一个扩展集中创建多个存储账号的时候,建议以不同的字母作为开头

关于 VMSS 的自动扩展 Auto Scale

  • 在 VMSS 中你的虚拟机在做 Auto Scale 的时候,无论是增减或者减少虚拟机,虚拟机会分布在更新域(UD)和错误域(FD),所以虚拟机的序号在减少的时候会从序号最高的开始,虚拟机增加的时候也会从当前最高序号开始,这也是为什么你在前面做测试的时候看到增加或者减少虚拟机的时候虚拟机序号变化并不连续
  • 在你进行自动扩展的时候,你会看到实际启动的虚拟机数量多于每次增加的虚拟机数量,这是因为默认情况下超量部署(overprovisioning)是打开的,为了增加自动扩展虚拟机部署成功率,多启动的虚拟机并不计费,稍后会自动删除,你也可以关闭超量部署,在模板中设置 “overprovision”: “false”
  • 在设置自动化扩展的时候,确保你的最大值,最小值之间有足够的大小间隔,比如最小 2,最大 5 等,并且你的自动扩展的增长和下降总是成对出现的,比如你只设置了增长规则,那么当压力上升是,虚拟机增加,但如果你没有设置减少规则,那么即使虚拟机负载降低到了阈值,也不会收缩
  • 关于自动扩展的规则算法,比较有意思,你设置的压力负载,指的是整个扩展集合里面所有虚拟机压力的平均值,而不是单个实例的值。举个例子,如果你定义自动扩展的规则为:
    • 如果 CPU 的平均负载大于 80% 的时候,增加一个实例
    • 如果 CPU 的平均负载低于 60% 的时候,减少一个实例

例如初始的虚拟机为 2 台,如果两个实例的平均负载超过 80% 的时候,就会增加一台虚拟机达到 3 台;现在假定增加一台后,平均 CPU 降低到了 60%,那么这个时候会不会降低实例自动收缩昵?实际上不会,自动扩展里面有一个算法,很有意思,他会计算,比如这个例子中,3 台虚拟机的负载是 60X3=180,如果降低一台,那么每台的平均负载就是 180/2=90,90% 的平均负载,一旦减少实例,就意味着马上又要增加,所以不会自动收缩;过段时间,当平均的负载降到 50%,如果降低到 2 台,就意味着降低后的负载是(50X3)/2=75, 平均负载是 75%,那么就会发生自动收缩。

  • 可以针对一个操作,定义多个自动扩展的操作,比如你可以同时定义 CPU,memory 作为自动扩展和自动收缩的条件,任何一个条件满足的时候,都会自动扩展,然后只有所有条件满足的时候,才会自动收缩,例如:
    • 如果 CPU 超过 75%,增加一个实例
    • 如果 Memory 超过 75%,增加一个实例
    • 如果 CPU 低于 30%,减少一个实例
    • 如果 memory 低于 50%,减少一个实例

那么,当 CPU 到达 76%,或者 memory 达到 76%,都会增加一个实例;只有 CPU 低于 30%,并且 memory 低于 50%,两个条件同时满足,才会减少实例.

  • 有非常多的度量值可以用来作为衡量负载增加或者减少的规则依据,对于 Linux 虚拟机和 Windows 虚拟机,可以从如下地址获得:

https://azure.microsoft.com/en-us/documentation/articles/insights-autoscale-common-metrics/

管理工具 VMSS Editor

那么除了目前新的 portal 和 Powershell 的意外,有没有别的管理工具可以直观的,可视化的对 VMSS 扩展集进行管理昵?答案是肯定的,感谢微软的 PM Guy Bowerman 和 Stan Peng 同学,使得这个非常强大的工具可以同时在 Azure 中国和 global 工作。

下面我们看看如何配置和使用这个工具。

1.首先你需要有一个 python 3.x 的环境,可以去 python 官方下载并安装。

2.安装 python 的 AzureRm 基本模块,如果你要连接的是 global 的 Azure,请执行:

pip install azurerm

如果是要连接中国的 Azure,请安装 Stan 修改过的模块:

pip install mcazurerm

3.从 Github 上克隆源代码到本地,当然你使用任何的 IDE 都是可以的,地址如下,两个都可以:

https://github.com/gbowerman/vmssdashboard

https://github.com/pjshi23/mcvmsseditor

4.创建你的 VMSS 虚拟机集合,前面例子已经介绍的非常详细,再次不赘述

5.在执行 VMSS editor 来管理 VMSS 之前,你需要在 Azure 上创建 service principle,以下例子介绍如何通过 Powershell 来创建 SP:

#使用 ARM 模式登陆 Azure

Login-AzureRmAccount -EnvironmentName AzureChinaCloud

#创建 AD 应用,修改密码为你的密码

$app = New-AzureRmADApplication -DisplayName “vmssdemo” -HomePage “https://www.contoso.org/vmssdemo”

-IdentifierUris “https://www.contoso.org/vmssdemo” -Password “YOURPASSWD”

#可以查看你获得的 AD Application 的相关信息

Get-AzureRmADApplication -DisplayNameStartWith vm

 

可以看到你的 application id,ObjectID 等信息。

#创建 service principle

New-AzureRmADServicePrincipal -ApplicationId $app.ApplicationId

#分配角色,请注意,角色必须为 Contributor

New-AzureRmRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $app.ApplicationId.Guid

 

#获得你的 tenantID 信息

(Get-AzureRmSubscription).TenantId

6.获得了以上信息之后,在你下载下来的 VMSS editor 目录下,创建一个文件 json,在文件中输入以下信息并保存:

{

“tenantId”: “b7bc9fa1-XXXXX”,

“appId”: “2bc07bb2-XXXXXXXXXX”,

“appSecret”: “YOURPASSWORD”,

“subscriptionId”: “fc92f523-XXXXXXXX”

}

7.运行 python vmsseditor.py,选择 “show details”,可以看到你当前的自动扩展集合,你的实例版本,虚拟机 size 等信息:

 

可以看到,当前是 2 台虚拟机,分布在两个不同的 FD 和 UD 中,针对不同的 FD,我们可以控制实例,比如删除,重启,升级等等。

8.我们来进行手工扩展,修改 capacity 为 6,并点击 scale,可以看到实例分布在不同的 FD 进行启动:

 

实际上可以看到,VMSS 启动了 7 台虚拟机,这实际上这就是之前说的 overprovining,提高扩展成功的概率,多出的实例不收费,全部正常运行后,6 台实例如下:

 

9.如果我们修改 capacity 的值为 2,进行 scale in,可以看到 VMSS 立即开始收缩,从序号高的开始删除虚拟机,最终剩下 0 和 1:

 

该 VMSS editor 源代码是开放的,也就是说任何人可以修改并添加自己的代码进去,也可以学习了解如何 python SDK 进行 VMSS 控制,了解更多 VMSS 逻辑。