谷歌计算引擎:如何使用另一个项目的快照?

33

我在我的开发者控制台中有两个项目。我已经在项目1中的一个虚拟机上创建了一个“快照”。我想使用在项目1中创建的快照来在项目2中创建一个新的虚拟机。现在选项中没有显示快照。 我该如何将一个项目中的快照导入到另一个项目中?

7个回答

49
您可以使用项目1中的快照创建图像,然后在项目2中使用该图像创建实例。假设您在两个项目中都具有编辑权限。您的问题说您拥有一个快照,并希望在项目2中从项目1中的快照创建实例。如果您仍然有可用于快照的磁盘,请确保它未连接到实例。如果它仍附加在实例上,请取消选中“删除实例时删除引导磁盘”并删除实例。转到 Images 并点击 "从磁盘创建映像",然后从该磁盘创建一个图像。如果您没有可用的磁盘,只有快照,请创建一个实例并将启动磁盘设置为快照,并选择您的快照。然后按照以上指示先删除实例再创建图像。现在您在项目1中有一个图像,在图像列表下应该能看到它。我不确定为什么,但您在项目2的控制台中将无法看到该图像,但是您可以使用 gcloud 使用项目1中的图像在项目2中创建实例。在项目1中,单击图像并单击 "查看 REST",那里将有一个完整的 URL 指向该图像,类似于:
https://www.googleapis.com/compute/v1/projects/cpomeroy-whitelist/global/images/ruby-image
使用gcloud在项目2中创建一个实例,使用项目1中的镜像:
gcloud config set project <project-id-of-project-2>
gcloud config list

(您应该验证您是否在项目2中)

gcloud compute instances create <name of instance> --image https://www.googleapis.com/compute/v1/projects/cpomeroy-whitelist/global/images/ruby-image

显然,您的网址将不同。

我刚刚测试了这个方法,它有效。如果您需要更多帮助,请告诉我。


@chrispomeroy,嗨,我正在尝试完成相同的事情,并且我已经按照您建议的做了。问题是,在尝试创建新实例后,我收到了这个错误:ERROR: (gcloud.compute.instances.create) could not parse resource: [https://www.googleapis.com/compute/beta/projects/<project-1-ID>/global/images/<image-name>。您有任何想法为什么我会得到这个错误吗?谢谢! - jonny bordo
通常在这里、论坛和文档中,我们使用尖括号 "< >" 来表示你应该替换那个位置的实际名称。因此,在我列出 <project-1-ID> 的位置上,你应该放入你的实际项目名称,在我列出 <image name> 的位置上,你应该放入实际图像名称。你最终的 gcloud 命令不应该包含任何尖括号,否则会导致解析错误,就像你发现的那样。 - chrispomeroy
@chrispomeroy的方法对我有效,但是我还必须额外指定一个--image-project才能够使用来自project1的镜像。 - John Sercel
4
如果你将URL中的“beta”替换为“v1”,它就可以使用。 - nachi
1
比起在这里记录的“推荐”移动方式,这种方法简单多了:https://medium.com/google-cloud/how-to-move-a-vm-instance-between-projects-on-google-cloud-platform-39d1690c73a。非常感谢@nachi! - Sebastian J.
显示剩余10条评论

30

你不需要一个镜像或者一个虚拟机,也不用打断源虚拟机。只需要在源项目中创建一个快照:

$ gcloud compute --project p1 disks snapshot the-snapshot src-disk --snapshot-names=the-snapshot
Created [https://compute.googleapis.com/compute/v1/projects/p1/global/snapshots/the-snapshot].

然后在目标项目中创建一个磁盘,使用--source-snapshot参数指向上面返回的“Created”URL:

$ gcloud compute --project p2 disks create the-disk \
    --source-snapshot https://compute.googleapis.com/compute/v1/projects/p1/global/snapshots/the-snapshot

这种用法没有在gcloud文档中显示,我是在@krishna praveen的答案中找到的,但他的解释是不正确的;你不需要删除任何实例或使用映像。即使源和目标都是启动磁盘,这也可以正常工作:

$ gcloud compute --project p2 instances create the-vm --disk name=the-disk,boot=yes

如果由于某些原因您需要图像,则仍然可以将快照还原到磁盘并使用其来创建图像,而无需使用零时虚拟机。 如果零时虚拟机在引导时会自动启动服务,并可能干扰同一项目网络上正在运行的其他虚拟机,则此方法更可取。


$ gcloud compute images create image-1 --source-disk=src-disk-image --source-disk-zone=zone1

这张图片现在可以从另一个项目中使用(如上所示@ jiminikiz)。

$ gcloud compute --project p2 instances create <name-of-new-instance> --image image-1 \
    --image-project p1 --zone=zone

这个在部署管理器中能行吗?因为你只有参数“sourceImage”来定义磁盘应该基于什么,似乎没有任何“sourceSnapshot”等价物。 - xref
这是正确的方法。创建图像是不必要的步骤。 - master

28

@chrispomeroy发布的答案对我有用,但我能够简化它,因为我需要越来越多地这样做。

假设您在 项目-1 中有一个图像,并且需要使用该图像创建一个实例在项目-2中。

gcloud config set project "project-2"
gcloud compute instances create <name-of-new-instance> \
    --image <name-of-your-image-from-project-1> \
    --image-project "project-1"

这消除了对于任何事情都使用 URL 的担忧。

编辑: 目前我的答案基本上与他的相同,但关于此内容的文档在这里:

gcloud compute instances create


很好,我可以知道这个信息的来源吗?它是由谷歌记录的吗? - Remis Haroon - رامز
1
这确实是最短的方式,前提是您在两个项目上都具有正确的权限。 - Eduardo B.
绝对是最简单的方式。 - MeLight

2

这是一个只需通过浏览器点击操作的解决方案。您需要什么? 您需要图片。要从磁盘创建镜像,必须将磁盘与任何实例分离。

如果您只有Project1中的实例,以下是步骤:

  • 从Project1中的实例创建快照。

  • 从此快照中在Project1中创建实例。取消选中“删除实例时删除启动磁盘”。此实例仅用于现在并将被删除。

  • 删除您刚刚创建的实例。

  • 转到“磁盘”菜单,您必须在那里看到实例的磁盘。

  • 转到“映像”菜单->“创建图像”。在这里,您可以创建图像。如果您没有分离的磁盘,则在下拉列表中不会有任何磁盘可用。

  • 进入Project 2,并使用为Project 1创建的自定义图像创建实例。如何操作? 启动磁盘 -> 更改 -> 自定义图像 -> 选择 Project 1 -> 您可以在此处看到您的自定义图像。


2

"chrispomeroy"提供的解决方案很好,但需要首先使用个人Google用户帐户(而不是project2服务帐户)初始化gcloud(因为它是具有访问两个项目权限的帐户):

gcloud init(并选择[2]使用新凭据登录)

然后,您确实可以使用以下命令在项目1上的基础映像上创建项目2上的VM:

gcloud compute instances create testimg --image --image-project (无需URL) 我今天测试了一下(2015年11月),效果很好。


0

可以使用映像在整个项目中创建实例。现在,如果您在项目1中有一个映像,也可以在项目2中选择该映像。

但是,截至今天,您无法在整个项目中查看磁盘。如果您需要将带有关联附加磁盘的VM从项目1迁移到项目2,请按照以下步骤操作。

  1. 使用快照并通过连接gcloud命令接口在项目2中创建磁盘。连接到项目2,然后执行:

    gcloud compute --project "GCPProject2" disks create "myserver-disk1" --size "50" --zone "us-east1-b" --source-snapshot https://www.googleapis.com/compute/v1/projects/GCPProject1/global/snapshots/snapshot-myserver-disk1 --description "DriveName" --type "pd-standard"
    
  2. 以上步骤将在项目2中创建磁盘。然后您需要保留引导磁盘的情况下删除项目1中的实例。然后,从磁盘myserver-bootdisk创建映像。 创建映像后,切换到项目2,然后从项目1中选择映像,使用下拉菜单创建服务器。

  3. 添加您从快照创建的附加磁盘并创建虚拟机。


0
据我所知,这是不可能的。要实现您所描述的功能,最好的方法是使用这个教程。您需要执行几个步骤:创建一个空白磁盘,将其附加到相关的机器上,对引导分区进行打包,并将其上传到云存储中。完成后,将其下载到本地,切换项目并上传到另一个项目中。然后,当点击新建实例时,您只需从镜像列表中选择该机器即可。

在教程中要求格式化和挂载外部磁盘,但在我的情况下,已经连接了外部磁盘,我无法格式化它,还有其他选项吗? - Sunil Garg
现在是可以的。请遵循@jiminikiz的答案。 - Manel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接