【问题标题】:Unable to create a pool with custom images on MS Azure无法在 MS Azure 上创建包含自定义图像的池
【发布时间】:2018-12-10 16:20:25
【问题描述】:

我正在尝试创建一个基于我的自定义映像的虚拟机池。我已成功created a custom image 并将其添加到我的批处理帐户中。

但是当我尝试根据来自 azure 门户的这张图片创建一个池时,我收到了一个错误。

在执行最后一次调整大小时遇到​​错误 水池。请再次尝试调整池大小。代码:分配失败

消息:无法分配所需数量的专用节点

详细信息:原因 - 与关联的源托管磁盘或快照 找不到虚拟机映像 ID。

在门户中创建池时,我使用我的图像名称,因为没有设置图像 ID 的选项。但是json中的图像ID是正确的。我可以在正确的批处理帐户中看到门户中列出的图像。

这是我的池属性 json:

{
  "id": "my-pool-0",
  "displayName": "my-pool-0",
  "lastModified": "2018-12-04T15:54:06.467Z",
  "creationTime": "2018-12-04T15:44:18.197Z",
  "state": "active",
  "stateTransitionTime": "2018-12-04T15:44:18.197Z",
  "allocationState": "steady",
  "allocationStateTransitionTime": "2018-12-04T16:09:11.667Z",
  "vmSize": "standard_a2",
  "resizeTimeout": "PT15M",
  "currentDedicatedNodes": 0,
  "currentLowPriorityNodes": 0,
  "targetDedicatedNodes": 1,
  "targetLowPriorityNodes": 0,
  "enableAutoScale": false,
  "autoScaleFormula": null,
  "autoScaleEvaluationInterval": null,
  "enableInterNodeCommunication": false,
  "maxTasksPerNode": 1,
  "url": "https://mybatch.westeurope.batch.azure.com/pools/my-pool-0",
  "resizeErrors": [
    {
      "message": "Desired number of dedicated nodes could not be allocated",
      "code": "AllocationFailed",
      "values": [
        {
          "name": "Reason",
          "value": "The source managed disk or snapshot associated with the virtual machine Image Id was not found."
        }
      ]
    }
  ],
  "virtualMachineConfiguration": {
    "imageReference": {
      "publisher": null,
      "offer": null,
      "sku": null,
      "version": null,
      "virtualMachineImageId": "/subscriptions/79b59716-301e-401a-bb8b-22edg5c1he4j/resourceGroups/resource-group-1/providers/Microsoft.Compute/images/my-image"
    },
    "nodeAgentSKUId": "batch.node.ubuntu 18.04"
  },
  "applicationLicenses": null
}

似乎错误文本与实际错误无关。有没有人遇到过这个错误或者现在有办法解决这个问题?

更新

用于创建图像的打包器 json (taken from here)

{
  "builders": [{
    "type": "azure-arm",

    "client_id": "ffxcvbd0-c867-429a-bxcv-8ee0acvb6f99",
    "client_secret": "cvb54cvb-202d-4wq-bb8b-22cdfbce4f",
    "tenant_id": "ae33sdfd-a54c-40af-b20c-80810f0ff5da",
    "subscription_id": "096da34-4604-4bcb-85ae-2afsdf22192b",

    "managed_image_resource_group_name": "resource-group-1",
    "managed_image_name": "my-image",

    "os_type": "Linux",
    "image_publisher": "Canonical",
    "image_offer": "UbuntuServer",
    "image_sku": "18.04-LTS",

    "azure_tags": {
        "dept": "Engineering",
        "task": "Image deployment"
    },

    "location": "West Europe",
    "vm_size": "Standard_DS2_v2"
  }],
  "provisioners": [{
    "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
    "inline": [
      "export DEBIAN_FRONTEND=noninteractive",
      "apt-get update",
      "apt-get upgrade -y",
      "apt-get -y install nginx",

        ... 

      "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
    ],
    "inline_shebang": "/bin/sh -x",
    "type": "shell"
  }]
}

【问题讨论】:

  • 您将图像存储在什么格式中,托管磁盘、快照、托管映像还是使用新的共享图像库?
  • @SamCogan 我相信它是一个托管磁盘,我按照文档使用打包程序创建了它。它位于主页 - 图片下。
  • 好的,如果它是用 Packer 创建的,它将是一个托管磁盘映像
  • @sr9yar 如果答案有帮助,您可以接受。
  • @CharlesXu np,我也打算对其进行测试,因为我们将在这些日子里转向付费订阅,但我认为你的答案是正确的,因为我没有创建一个VHD,我是直接用packer创建一个图像。

标签: azure azure-virtual-machine


【解决方案1】:

对于你的问题,我和你一样做了测试。这里的步骤:

  1. 通过 Packer 创建托管映像。
  2. 使用同一订阅和区域中的托管映像创建批处理池。

然后我得到和你一样的错误。然后我进行另一个测试,从快照创建图像,然后使用图像创建批处理池。运气!游泳池运作良好。

在 Azure 中,您可以从 Azure 的快照准备托管映像 VM 的操作系统和数据磁盘,来自具有托管的通用 Azure VM 磁盘,或来自您上传的通用本地 VHD。

参考这个description,好像不能通过Packer创建自定义镜像。我不确定。但它确实有效。希望这会对你有所帮助。

更新

查看文档Custom Images with Batch Shipyard。说明:

注意:目前直接用 Packer 创建 ARM Image 只能 与用户订阅批量帐户一起使用。对于标准批处理服务 pool allocation mode 批量帐户,Packer 将需要创建一个 VHD 首先,您需要将 VHD 导入 ARM 映像。请 遵循与您的 Batch 帐户池匹配的适当路径 分配方式。

在我的测试中,我遵循了 Packer 创建图像的步骤。当源VM存在时,自定义镜像可以正常用于Batch Pool。但是,如果您删除源 VM,它将失败。因此,正如描述的那样,标准批处理服务只能使用 Packer 创建的 VHD 文件创建的映像,并且 VHD 文件应该存在于 Pool 生命周期中。

【讨论】:

  • 谢谢,我试试这个。我已经阅读了很多次您引用的页面,以至于我几乎牢牢记住了这一点 xD 目前我最终创建了一个标准 ubuntu 映像池,然后登录每个 vm 并手动安装我需要的软件。但这不是我需要的,因为我已经拥有自己的 vps 服务器池,并且我正在寻找一种更好的方法来使用 CLI 工具来管理它们。我猜,在打包器构建期间必须在映像中安装其他东西才能使该映像成为有效的 Azure VM 映像。但这只是一个疯狂的猜测。
  • 是的,我也会尝试确认这一点。如果图像需要特定的东西。
【解决方案2】:

如果您使用托管图像,那么您的 imageReference 部分应如下所示:

"imageReference": { "id": "/subscriptions/79b59716-301e-401a-bb8b-22edg5c1he4j/resourceGroups/resource-group-1/providers/Microsoft.Compute/images/my-image" },

【讨论】:

  • 好的,但是我从门户下载了这个池属性 json,它包含“virtualMachineImageId”。不是我自己写的。您是否建议更改此属性并通过 json 重新创建池?
  • 让我们退后一步,首先您是如何创建规模集的? ARM、CLI?
  • 我最初的目标是能够使用 CLI 创建所有内容。但是az batch pool create 给了我一个错误,关于使用共享密钥,所以切换到简单地使用 portal.azure.com 上的 Web 界面 - ARM,对吗?今天这个术语已经骗了我好几次了:(
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多