Azure HyperVGeneration V2 VM 创建

Azure HyperVGeneration V2 VM creation

我正在寻找使用 Azure 的 node/Javascript SDK 启动 VM。到目前为止,我的代码很幸运,它几乎按预期工作。但是我想启动第 2 代/HyperV v2 VM 而不是默认的 v1。这是我的代码片段:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      HyperVGeneration: 'V2',
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18.04-LTS', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

我遇到的问题是:

HyperVGeneration: 'V2'

因为它似乎并不适用。我也没有收到任何错误,只是创建了一个 V1 虚拟机。此处缺少 Azure Docs:https://docs.microsoft.com/en-us/javascript/api/@azure/arm-compute/hypervgeneration?view=azure-node-latest 我还尝试了其他参数,例如 HyperVGenerationType / Types,结果相同。

我想通了!

我在这里的假设是错误的。不是将 VM generation/HyperVGeneration 配置为 V2,而是使用 gen2 映像 sku 以 OS 磁盘为基础,自动将 VM 生成也配置为 V2。这也无助于 MS 以多个名称调用同一事物:VM 生成、HyperV 生成、映像生成。

无论如何,解决方案是实际查找所有可以安装的可用映像,然后从中选择正确的映像。 要获取您所在地区的可用图片:

az vm image list --all --publisher 'Canonical' --sku '18_04' --output table

其中 returns 类似于:

Offer                                         Publisher    Sku                           Urn                                                                                          Version
--------------------------------------------  -----------  ----------------------------  -------------------------------------------------------------------------------------------  ---------------
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04                         Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04:18.04.20210309                  18.04.20210309
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04-gen2                    Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04-gen2:18.04.20210309             18.04.20210309
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200318                              18.04.20200318
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200605                              18.04.20200605
...

另一件值得注意的事情是,有些 Ubuntu 图像的 sku 为“18.04”,有些图像的 sku 为“18_04”,这进一步混淆了事情。

最终的解决方案是使用这个片段将它们放在一起:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18_04-lts-gen2', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

请注意图像 sku 是 18_04-lts-gen2 而不是 18.04-LTS.