VMSS上用Managed Disk和Data Disk进行自动扩展

Posted StevenLian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VMSS上用Managed Disk和Data Disk进行自动扩展相关的知识,希望对你有一定的参考价值。

虚拟机自动扩展集(VMSS)是Azure上一个非常强大的功能,在我之前的系列文档中已经做了详细的介绍,在此就不赘述了;我同时也提到,在使用Azure传统存储账号的时候,也存在诸多限制,比如你需要计算每个存储账号下虚拟机的数量以避免IOPS超过性能限制,需要考虑扩展集中虚拟机数量限制,自定义镜像的限制等等:

在用户进行大规模扩展的设计和使用中,使用传统存储账号非常不方便,所以我们在生产环境下,推荐用户使用在中国区新上线的托管磁盘(managed disk)。托管磁盘是将虚拟机的磁盘管理集中交给后台去做管理,用户不需要关心磁盘的存储, IOPS限制,扩展等琐碎的细节,只需要指定类型,比如高级磁盘或者普通磁盘,剩下的事情交给Azure后台服务去处理,使用托管磁盘可以让你在一个订阅中最大创建10000个磁盘,几千个虚拟机满足大部分扩展性应用的。

另外一个VMSS的限制是不能使用数据磁盘,但有些应用设计上在做扩展的时候,需要数据磁盘进行数据存储,目前在新版本的VMSS中已经支持Data Disk。

假如你有以下相对来讲比较复杂的客户需求,你该如何实现?

  1. 虚拟机按照CPU的负载自动扩展收缩
  2. 每个虚拟机有两块数据磁盘,并格式化,挂载,可用
  3. 可以快速的扩展到100台虚拟机
  4. 快速全自动化部署
  5. 可以部署在中国区的Azure上

这个过程相对来说比较复杂,本文讨论如何基于传统存储账号的VMSS ARM模板进行修改,使用磁盘脚本,Azure CLI 2.0进行基于管理磁盘和数据磁盘的VMSS大规模部署。

用于本文的之前介绍的我的Linux VMSS Autoscale 的模板地址如下:

https://github.com/kingliantop/azurelabs/tree/master/AzureChinaARMTemplate/VMSS-Linux-Autoscale

基于该模板,我们需要做一些修改将使用传统存储账号的VMSS转换为使用Managed Disk和数据磁盘的VMSS 模板,然后再创建扩展集合。

  1. 删除掉无用的存储变量(variables)

"storageAccountType": "Standard_LRS",

"newStorageAccountSuffix": "[concat(variables(\'namingInfix\'), \'sa\')]",

"uniqueStringArray": [

"[concat(uniqueString(concat(resourceGroup().id, variables(\'newStorageAccountSuffix\'), \'0\')))]",

"[concat(uniqueString(concat(resourceGroup().id, variables(\'newStorageAccountSuffix\'), \'1\')))]",

"[concat(uniqueString(concat(resourceGroup().id, variables(\'newStorageAccountSuffix\'), \'2\')))]",

"[concat(uniqueString(concat(resourceGroup().id, variables(\'newStorageAccountSuffix\'), \'3\')))]",

"[concat(uniqueString(concat(resourceGroup().id, variables(\'newStorageAccountSuffix\'), \'4\')))]"

],

"vhdContainerName": "[concat(variables(\'namingInfix\'), \'vhd\')]",

"osDiskName": "[concat(variables(\'namingInfix\'), \'osdisk\')]",

"saCount": "[length(variables(\'uniqueStringArray\'))]",

  1. VMSS上支持Managed Disk是在ARM Compute资源管理器的API version 2016-04-30-preview以后才支持的,我们需要确保中国的Azure上面API的版本是可用的,首先安装Azure CLI 2.0,登陆中国区Azure:

     

  2. 检查中国区Compute provider的API版本号:

    az provider show --namespace Microsoft.Compute

     

     

    可以看到虚拟机扩展集合和虚拟机都支持"2016-04-30-preview","2016-08-30","2017-03-30"等多个版本号,而Insight provider的Autoscalesetting最高支持"2015-04-01"这个版本:

     

     

  3. 然后我们来修改API的version,之前的模板API version比较老,我建议修改成相对最新的版本,我修改的版本如下:

     

  4. 需要注意的是,我们虽然对于所有虚拟机的磁盘不再需要传统存储账号进行管理,但对于存储LinuxDiag的诊断信息,我们依然需要Azure Storage Table来进行存储,因此上resource上的storage部分的定义只需要定义diagnostic storage account即可:

     

  5. 删除VMSS中虚拟机扩展集磁盘部分对于传统存储的依赖关系:

    "type": "Microsoft.Compute/virtualMachineScaleSets",

    "name": "[variables(\'namingInfix\')]",

    "location": "[resourceGroup().location]",

    "apiVersion": "[variables(\'computeApiVersion\')]",

    "dependsOn": [

    "[concat(\'Microsoft.Storage/storageAccounts/\', variables(\'uniqueStringArray\')[0], variables(\'newStorageAccountSuffix\'))]",

    "[concat(\'Microsoft.Storage/storageAccounts/\', variables(\'uniqueStringArray\')[1], variables(\'newStorageAccountSuffix\'))]",

    "[concat(\'Microsoft.Storage/storageAccounts/\', variables(\'uniqueStringArray\')[2], variables(\'newStorageAccountSuffix\'))]",

    "[concat(\'Microsoft.Storage/storageAccounts/\', variables(\'uniqueStringArray\')[3], variables(\'newStorageAccountSuffix\'))]",

    "[concat(\'Microsoft.Storage/storageAccounts/\', variables(\'uniqueStringArray\')[4], variables(\'newStorageAccountSuffix\'))]",

    "[concat(\'Microsoft.Network/loadBalancers/\', variables(\'loadBalancerName\'))]",

    "[concat(\'Microsoft.Network/virtualNetworks/\', variables(\'virtualNetworkName\'))]"

     

  6. 同时删除OSDisk中有关Container的配置,这部分都会由Managed Disk来管理:

    "osDisk": {

    "vhdContainers": [

    "[concat(\'https://\', variables(\'uniqueStringArray\')[0], variables(\'newStorageAccountSuffix\'), \'.blob.core.chinacloudapi.cn/\', variables(\'vhdContainerName\'))]",

    "[concat(\'https://\', variables(\'uniqueStringArray\')[1], variables(\'newStorageAccountSuffix\'), \'.blob.core.chinacloudapi.cn/\', variables(\'vhdContainerName\'))]",

    "[concat(\'https://\', variables(\'uniqueStringArray\')[2], variables(\'newStorageAccountSuffix\'), \'.blob.core.chinacloudapi.cn/\', variables(\'vhdContainerName\'))]",

    "[concat(\'https://\', variables(\'uniqueStringArray\')[3], variables(\'newStorageAccountSuffix\'), \'.blob.core.chinacloudapi.cn/\', variables(\'vhdContainerName\'))]",

    "[concat(\'https://\', variables(\'uniqueStringArray\')[4], variables(\'newStorageAccountSuffix\'), \'.blob.core.chinacloudapi.cn/\', variables(\'vhdContainerName\'))]"

    ],

    "name": "[variables(\'osDiskName\')]",

    "caching": "ReadOnly",

    "createOption": "FromImage"

    },

  7. 为扩展及中的虚拟机添加两个书磁盘,每个1023GB,注意在一个虚拟机中lun号必须唯一:

     

     

  8. 修改模板的最后一步,也是很重要的一步,就是你在加载了数据磁盘给Linux虚拟机以后,其实是无法直接使用的, 你需要分区,格式化,挂载才能使用,这部分实际是需要客户自己写代码和脚本完成的,不用担心,我已经写了一个脚本,来自动化完成这个工作,脚本已经放在Github上了,需要在模板中添加定制化脚本运行部分:

     

     

     

以上是关于VMSS上用Managed Disk和Data Disk进行自动扩展的主要内容,如果未能解决你的问题,请参考以下文章

Azure Managed Disk操作

Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞

把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM

使用 azure cli,vmss json 模板不会使用 datadisk 创建 vmss

深入理解Azure自动扩展集VMSS

深入理解Azure自动扩展集VMSS