快速构建自定义配置好的VM-使用GCPinstance-template和custom-image
- 游戏开发
- 2025-07-21 19:11:45

在云项目开发中有时会有下面的需求:
构建大量拥有相同配置, 相同已安装软件, 甚至相同已启动进程的虚拟机。
下面的内容会基于1个简单的例子:
现有1台vm 名字是 tf-vpc0-subnet0-vm0 , 我在上面手动安装了jdk11 和 tomcat 服务器, 但是一台这样的vm是不够的, 我想基于这个vm 快速克隆类似已安装好和启动好tomcat 的服务器。
其实我们用terraform 也能很方便地大量构建规格相同的vm, 但是它们基本上都是空机器, 如果要往里面安装我和配置一些东西, 只靠terraform其实并不足够。
其中1个方法 就是使用goolge cloud 中的下面两种技术
实例模板: instance-template 自定义操作系统镜像: custom-image
实例模板: instance-template 介绍简单来讲, instance-template 可以让用户定制1个 vm 的模板 包括:
规格(cpu / mem/ vpc-network/ disk…)等image 系统镜像注意, 第2点并不是必须的, 如果我们在创建模板时没有指定镜像, 实际上创建出来的vm也是1台刚装好系统的vm. 实际上, 第2点在我的测试中并不成功 这里建议只用instance-template 去定义vm的规格
而下面会详细介绍如何基于1个vm - instance 去创建1个 instance-template, 从而去复制这个vm instance
实例模板: 系统镜像 image 镜像介绍image 实际就是vm的操作系统的一份copy, google 本身已经提供相当多的系统镜像, 包括debian, ubuntu, rockylinux 等。 可以用下面命令去查看
[gateman@manjaro-x13 Terraform-GCP-config]$ gcloud compute images list NAME PROJECT FAMILY DEPRECATED STATUS centos-7-v20231212 centos-cloud centos-7 READY centos-stream-8-v20231212 centos-cloud centos-stream-8 READY centos-stream-9-v20231212 centos-cloud centos-stream-9 READY cos-101-17162-336-28 cos-cloud cos-101-lts READY cos-105-17412-226-43 cos-cloud cos-105-lts READY cos-109-17800-66-33 cos-cloud cos-109-lts READY cos-97-16919-404-21 cos-cloud cos-97-lts READY debian-10-buster-v20231212 debian-cloud debian-10 READY debian-11-bullseye-arm64-v20231212 debian-cloud debian-11-arm64 READY debian-11-bullseye-v20231212 debian-cloud debian-11 READY debian-12-bookworm-arm64-v20231212 debian-cloud debian-12-arm64 READY debian-12-bookworm-v20231212 debian-cloud debian-12 READY fedora-cloud-base-gcp-34-1-2-x86-64 fedora-cloud fedora-cloud-34 READY ...我们在构建vm时必须指定一个镜像, 实际上就是为vm选择操作系统。 但是这些镜像大部分都没有安装第三方软件, 例如jdk, tomcat, k8s… docker等服务器软件是没有的。
如果我们要避免重复在各台vm上安装这些软件, 则需要构建自定义镜像。 好了, 下一节我们开始实操!
在模板vm - instance 上安装jdk 11, tomcat10, 并配置自启动vm 名字: tf-vpc0-subnet0-vm0
安装jdk11:
sudo apt-get install openjdk-11-jdk安装tomcat10:
cd /home/gateman/server/ wget dlcdn.apache.org/tomcat/tomcat-10/v10.1.17/bin/apache-tomcat-10.1.17.tar.gz tar -xf apache-tomcat-10.1.17.tar.gz mv apache-tomcat-10.1.17 tomcat10 rm -rf apache-tomcat-10.1.17.tar.gz利用systemd 配置tomcat 10 自启动 因为如果只完成上面两步, 即使你在当前vm启动tomcat, 但是基于这个vm 的disk创建的镜像是不包含进程的, 所以要对操作系统做一些配置把tomcat10 加入自启动的service list
详细步骤参考: blog.csdn.net/nvd11/article/details/135007086=
基于这个 vm-instance 去构建 1个自定义image镜像我们先看命令
gcloud compute images create <<image-name>> \ --source-disk=<<disk-name>> \ --source-disk-zone=<<zone-name>> \ --force所以关键只有两个参数, 1个就是disk name名字, 实际上镜像就是硬盘上文件的1个集合。 所以参数是disk的名字而不是 vm-instance的名字。
我们可以用下面两种命令去获得 某个vm的disk 名字
[gateman@manjaro-x13 Terraform-GCP-config]$ gcloud compute instances describe tf-vpc0-subnet0-vm0 --zone europe-west2-c --format='get(disks[].source)' .googleapis /compute/v1/projects/jason-hsbc/zones/europe-west2-c/disks/tf-vpc0-subnet0-vm0 [gateman@manjaro-x13 Terraform-GCP-config]$ gcloud compute disks list --filter="users:tf-vpc0-subnet0-vm0" NAME LOCATION LOCATION_SCOPE SIZE_GB TYPE STATUS tf-vpc0-subnet0-vm0 europe-west2-c zone 20 pd-standard READY可以见到默认情况下, 跟着vm创建的第一块disk名字就是vm名字
========================================= 第二个参数是 source-disk-zone, 我们用模板vm的zone 就好, 我这边是europe-west2-c
–force 的意思即使模板vm已启动也强制制作镜像, 默认下只能为1个已关闭的vm 的disk制作镜像(避免制作过程中磁盘被更新)
执行:
[gateman@manjaro-x13 Terraform-GCP-config]$ gcloud compute images create e2-small-tomcat-image \ --source-disk=tf-vpc0-subnet0-vm0 \ --source-disk-zone=europe-west2-c \ --force Created [ .googleapis /compute/v1/projects/jason-hsbc/global/images/e2-small-tomcat-image]. WARNING: Some requests generated warnings: - NAME PROJECT FAMILY DEPRECATED STATUS e2-small-tomcat-image jason-hsbc READY [gateman@manjaro-x13 Terraform-GCP-config]$我们可以用下面去查看所有自定义的系统image
[gateman@manjaro-x13 Terraform-GCP-config]$ gcloud compute images list --project=jason-hsbc --no-standard-images NAME PROJECT FAMILY DEPRECATED STATUS e2-small-tomcat-image jason-hsbc READY而这个e2-small-tomcat-image 是基于disk tf-vpc0-subnet0-vm0 创建的, 为了避免这个disk 跟随它的vm删除而被删除, 可以执行下面命令去取消级联删除关系
gcloud compute instances set-disk-auto-delete tf-vpc0-subnet0-vm0 \ --no-auto-delete \ --disk=tf-vpc0-subnet0-vm0 基于这个 vm-instance 的规格和上面创建的自定义镜像 求创建1个 instance-template先看下面这个命令 gcloud compute instance-templates create e2-small-tomcat –source-instance=tf-vpc0-subnet0-vm0 –source-instance-zone=europe-west2-c –image=e2-small-tomcat-image
从参数来看, 貌似是可以基于1个 vm的规格去创建1个 instance template的, 但是经过本人多次测试, 如果直接基于1个vm的规格, 用–source-instance 创建的instance template 只能应用这个vm 创建时使用的image, 即使在之后创建vm时制定 --image参数也无效。 也就是讲无法使用 基础vm 预安装的jdk11 tomcat等, 不符合需求。 具体原因不详。
所以建议, 了解清楚tf-vpc0-subnet0-vm0的规格, 用更详细的参数去创建template, 同时制定image , 如下:
gcloud compute instance-templates create e2-small-tomcat \ --image=e2-small-tomcat-image \ --machine-type=e2-small \ --network=tf-vpc0 \ --subnet=tf-vpc0-subnet0 \ --region=europe-west2 \ --no-address \ --service-account=vm-common@jason-hsbc.iam.gserviceaccount \ --scopes= .googleapis /auth/cloud-platform \ --preemptible 基于这个 vm-instance 创建1个新的vm gcloud compute instances create tf-vpc0-subnet0-vm2 \ --source-instance-template=e2-small-tomcat \ --zone=europe-west2-c因为创建instance-template时已经指定了image, 这里就不需要–image参数了
output
[gateman@manjaro-x13 ~]$ gcloud compute instances create tf-vpc0-subnet0-vm2 \ --source-instance-template=e2-small-tomcat \ --zone=europe-west2-c Created [ .googleapis /compute/v1/projects/jason-hsbc/zones/europe-west2-c/instances/tf-vpc0-subnet0-vm2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS tf-vpc0-subnet0-vm2 europe-west2-c e2-small true 192.168.0.27 RUNNING这个新建的vm就应该具有与vm0 相同的硬盘内容了, 例如安装了java tomcat等。
一个发现, image 对已经创建过名字的vm无效例如下面我用同样的template 创建了2个vm
[gateman@manjaro-x13 ~]$ gcloud compute instances create tf-vpc0-subnet0-vm10 --source-instance-template=e2-small-tomcat --zone=europe-west2-c Created [ .googleapis /compute/v1/projects/jason-hsbc/zones/europe-west2-c/instances/tf-vpc0-subnet0-vm10]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS tf-vpc0-subnet0-vm10 europe-west2-c e2-small true 192.168.0.30 RUNNING [gateman@manjaro-x13 ~]$ gcloud compute instances create tf-vpc0-subnet0-vm15 --source-instance-template=e2-small-tomcat --zone=europe-west2-c Created [ .googleapis /compute/v1/projects/jason-hsbc/zones/europe-west2-c/instances/tf-vpc0-subnet0-vm15]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS tf-vpc0-subnet0-vm15 europe-west2-c e2-small true 192.168.0.31 RUNNING [gateman@manjaro-x13 ~]$1个vm10, 1个vm15
其中vm10 我之前用它的名字创建过1个VM (基于基础debian 镜像), 但是已删除 而 vm15 则之前为用过这个名字,
结果是, vm10 无法应用vm0的镜像内容, 就是无预装jdk tomcat 等 而vm15是ok的!
原因未知!
快速构建自定义配置好的VM-使用GCPinstance-template和custom-image由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“快速构建自定义配置好的VM-使用GCPinstance-template和custom-image”
上一篇
电脑入门基础知识