【问题标题】:Script to create multiple GCE VMs simultaneously同时创建多个 GCE 虚拟机的脚本
【发布时间】:2018-08-22 14:33:34
【问题描述】:

我有一个基本的 SH 脚本,用于在 GCP 上创建多个虚拟机,它运行良好,但按顺序运行。当虚拟机的数量超过 4 或 5 个时,它会成为时间的实质性延迟。我注意到在 Dataflow 或 Dataproc 等平台中,几乎同时创建了任意数量的 VM。有没有办法在 GCE 中模仿该功能? (毕竟,这些似乎都是基本的 GCE 机器)。

现在我使用以下(简化的)脚本:

vms=4
for i in `seq 1 $vms`
do

    gcloud compute --project PROJECT disks create VM"$i" --size 50 --zone ZONE --type "pd-ssd"
    gcloud beta compute --project=PROJECT instances create VM"$i" --zone=ZONE --machine-type=MACHINE_TYPE --subnet=default --maintenance-policy=MIGRATE --scopes=https://www.googleapis.com/auth/cloud-platform --disk=name=VM"$i",device-name=VM"$i",mode=rw,boot=yes,auto-delete=yes

done

感谢您的任何建议!

【问题讨论】:

    标签: google-compute-engine


    【解决方案1】:

    您可以通过creating a group of managed VMs更快地创建多个相似的虚拟机。

    首先,create an instance template,指定您需要的 VM 配置:

    gcloud compute instance-templates create TEMPLATE_NAME \
      --machine-type MACHINE_TYPE \
      --image-project IMAGE_PROJECT \  # project where your boot disk image is stored
      --image IMAGE \  # boot disk image name
      --boot-disk-type pd-ssd \
      --boot-disk-size 50GB \
      --boot-disk-auto-delete \
      --boot-disk-device-name DEVICE_NAME \  # boot disk device name, the same for all VMs
      --subnet default \ 
      --maintenance-policy MIGRATE \
      [...]
    

    注意:

    • 您将启动磁盘指定为实例模板的一部分。
    • 无需为实例模板指定区域。您将在创建实例组时指定所需的区域。
    • 组中所有虚拟机的启动磁盘的设备名称相同。这不是冲突,因为特定磁盘的设备名称是每个特定 VM 的 seen from guest OS,并且是该 VM 的本地设备。
    • 其他参数与创建虚拟机相同。

    然后,基于此模板创建一组 4 个(或 100 个或 1000 多个)VM:

    gcloud compute instance-groups managed create GROUP_NAME \
      --zone ZONE \
      --template TEMPLATE_NAME \ # name of the instance template that you have just created
      --size 4 \ number of VMs that you need to create
    

    该小组根据您的模板创建多个相似的虚拟机,这比您通过迭代创建独立虚拟机的速度快得多。

    【讨论】:

    • 感谢这工作真的很好。与脚本相比,这里唯一需要注意的是,似乎无法控制机器的确切主机名(它们都以随机后缀结尾)。也与脚本不同,这似乎基于现有图像而不是快照工作。但它运行得非常快,所以这些都是非常小的问题。
    【解决方案2】:

    直接方式

    一个快速的方法是将--async 参数添加到gcloud 命令。 此外,您可以使用wait& 在bash 中添加并行化:

    for i in `seq 1 4`
    do
      gcloud compute instances [...] --async &
    done
    wait
    

    替代方案

    您可以使用terraform 以不同的方式进行操作

    【讨论】:

    • 感谢异步建议——听起来不错。在那种情况下,我将如何在循环的每次迭代中协调硬盘驱动器和 VM 的创建?或者我想我可以先创建异步驱动器,然后再根据这些驱动器异步创建虚拟机? (我在 bash TBH 中一无所知)
    • 是的,我会先创建永久磁盘,在没有--async 参数但使用&wait 的专用循环中进行并行创建。只有当磁盘准备好使用时,才能开始第二个循环。小心 gcloud 错误,许多调用可能会失败(配额、权限、错误请求等)
    • 感谢您的建议。接受另一个答案,因为它似乎更加 GCP 原生。
    • 确实,这取决于你想做什么。例如,如果您想要稳定的实例名称(出于简单发现目的或其他目的),则不能使用托管实例组。更糟糕的是,实例模板 AFAIK 不支持额外的永久性磁盘。但如果您不需要这些功能,使用托管实例组会更简洁。
    【解决方案3】:

    bulk instance creation APIs 允许您使用单个 API 请求创建多个 VM:

    gcloud compute instances bulk create \
      --name-pattern="VM#" \
      --count=4 \
      --region=REGION \
      --machine-type=MACHINE_TYPE \
      --image-project=IMAGE_PROJECT \  # project where your boot disk image is stored
      --image=IMAGE \  # boot disk image name
      --boot-disk-type=pd-ssd \
      --boot-disk-size=50GB \
      --boot-disk-auto-delete \
      --boot-disk-device-name=DEVICE_NAME \  # boot disk device name, the same for all VMs
      --subnet=default \ 
      --maintenance-policy=MIGRATE \
      [...]
    

    注意:

    • 所有虚拟机都是并行创建的
    • 它会根据可用的位置自动选择创建 VM 的区域
    • 如果检测到阻止创建完整请求的问题(例如,如果容量不足),它将提前失败
    • 它可以自动为你生成名字

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2019-05-20
      • 2023-02-22
      • 2016-10-26
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多