之所以写这篇文章,是因为通常使用的批量创建虚拟机的方式,可以创建成功,但是无法获取到本次批量创建的虚拟机列表。现找到了一种方法可以获取,在此分享一下。
1、在 horizon 上创建
使用horizon页面创建时,可以直接填写要创建的数量。创建后,在虚拟机列表出能看见正在创建的虚拟机(状态)。
2、使用 nova boot 命令行
用 nova boot 命令行创建时,带上 --max-count 和 --min-count 参数,指定创建的最大数量和最小数量,可以实现批量创建。
3、使用 nova api
nova api批量创建虚拟机的 url 为 /servers,参数中指定 max_count 和 min_count ,即批量创建的最大数量和最小数量,可以实现批量创建。
三种方法只是使用的 client 不同,最终都会调用nova api。方法1和2最终也会使用方法3(即nova api)的形式创建。
先补充说明一下方法2和方法3中的参数 --max-count(max_count)和 --min-count(min_count)。两个参数的解释是允许创建的最大数量和最小数量。起初以为是在 nova scheduler 调度时,尽量按照 max_count 创建,如果资源不够再取 min_count,如果还不够则返回失败。跟踪了代码以后,才发现这两个参数并不影响 scheduler 调度,而是在 nova api 中生效。nova api 中检查项目的quota,如果项目的 quota 足够大,就取 max_count,否则尝试取 min_count,如果 quota 连 min_count 也容纳不下,则失败。将最终选取的 max_count 或者 min_count 作为新的参数 num_instances 往下传递。一般情况下我们的 openstack project 有一套默认的规格,例如允许的总vcpu数、总内存数,管理员可以进行修改。所以这两个参数是在 nova api 中根据项目的 quota 来进行校验,转换成新的参数 num_instances 往下传递,并不暴露给 nova scheduler 。
1、horizon 上创建后,并不需要直接获取到本次新创建的虚拟机。界面会跳转到虚拟机列表,只要触发刷新一遍虚拟机列表,就能列出正在创建的新虚拟机;
2、直接使用 nova api 进行批量创建,api 只返回成功创建的第一台虚拟机的信息,而不是所有虚拟机的信息。这并不是我们想要的结果;
3、使用 nova boot 命令行的方式进行批量创建,结果和使用 nova api 的方式返回的结果一样,只返回第一台虚拟机的信息。
在 openstack 社区找到了关于批量创建虚拟机后如何获取创建虚拟机列表的讨论,社区已经知道这个不足,但是目前 v2 api 确实只能返回一台虚拟机的信息,无法返回所有。在 v3 api 中会返回所有虚拟机的信息。所以解决办法之一是把 compute api 由 v2 切换到 v3 。这种方式对于我来说改动稍显大,于是继续寻找其他的方案。
批量创建虚拟机的 nova api 中有一个参数是 return_reservation_id , 设置为 true 的话 api 返回的是 reservation_id 。
Set "return_reservation_id": "True" in the request body to request that a reservation ID be returned instead of the newly created instance information. With this parameter, the response shows only the reservation ID.
但是官方文档中没有说明 reservation_id 的用途。
使用 nova help list 查看帮助时,也能看到有 --reservation-id 参数,作用是查看虚拟机列表时,根据 --reservation-id 查找,但是帮助和代码中依然没有明确说明 reservation-id 的作用。
Optional arguments:
--reservation-id <reservation-id> Only return servers that match reservation-id.
在 openstack 数据库 instances 表中,能看到每个虚拟机都会对应一个 reservation-id。至此大概明白了 reservation-id 所能提供的作用。 批量创建后,可以根据 reservation-id 来查询。在使用 nova api 批量创建时,参数 return_reservation_id 设置为 true, api 会返回这批虚拟机的 reservation-id,然后调用查询虚拟机的 api 根据 reservation-id 查询就可以得到这批虚拟机的信息了。
1、批量创建的常用方式以及获取到本次创建结果:
2、批量创建虚拟机后,获取本次创建的所有虚拟机列表的方式:
3、max_count 和 min_count 参数在 nova api 中和项目的 quota 进行校验,决定允许创建的台数。并不在 scheduler 调度时校验。