快速构建自定义配置好的VM - 使用GCP instance-template 和 custom-image

news2024/11/26 19:53:23

在云项目开发中有时会有下面的需求:

构建大量拥有相同配置, 相同已安装软件, 甚至相同已启动进程的虚拟机。

下面的内容会基于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 的模板
包括:

  1. 规格(cpu / mem/ vpc-network/ disk…)等
  2. 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 https://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

详细步骤参考:
https://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)'
https://www.googleapis.com/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 [https://www.googleapis.com/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.com \
  --scopes=https://www.googleapis.com/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 [https://www.googleapis.com/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 [https://www.googleapis.com/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 [https://www.googleapis.com/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的!

原因未知!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能手表上的音频(五):录音

上篇讲了语音通话&#xff0c;本篇讲录音。录音功能就是把录到的音频保存成文件。保存文件的格式支持两种&#xff1a;一是PCM(16K采样)的WAV格式&#xff0c;二是AMR-NB&#xff08;8k采样&#xff09;的AMR格式。WAV格式简单&#xff1a;44字节的文件头PCM 数据&#xff0c;示…

flask 接口处理带有图片和json数据的请求 发送图片到前端的实现

1.flask的request 从flask的源码可以看到flask的可用属性很多&#xff0c;包括data,form,files&#xff0c;header,host等&#xff0c;在我们接收文件传参时需要用到的属性就是form和files。不过具体的使用方式有两种&#xff0c;即&#xff1a;postman发送的和requests模拟发…

〖大前端 - 基础入门三大核心之JS篇(57)〗- 继承

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

Leetcode—11.盛最多水的容器【中等】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—11.盛最多水的容器 实现代码 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) int maxArea(int* height, int heightSize) {int left 0, right heightSize - 1;int m…

【具身智能评估7】ProcTHOR: Large-Scale Embodied AI Using Procedural Generation

论文标题&#xff1a;ProcTHOR: Large-Scale Embodied AI Using Procedural Generation 论文作者&#xff1a;Matt Deitke, Eli VanderBilt, Alvaro Herrasti, Luca Weihs, Jordi Salvador, Kiana Ehsani, Winson Han, Eric Kolve, Ali Farhadi, Aniruddha Kembhavi, Roozbeh M…

118. 杨辉三角

描述 : 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目 : LeetCode 118. 杨辉三角 : 118. 杨辉三角 分析 : 这道题用二维数组来做 . 解析 : class Solution {public Li…

python图像二值化处理

目录 1、双峰法 2、P参数法 3、迭代法 4、OTSU法 图像的二值化处理是将图像上的像素点的灰度值设置为0或255&#xff0c;也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法&#xff0c;可以把灰度图像转换成二值图像。具体实现是将大…

OpenSSL 3.2.0新增Argon2支持——防GPU暴力攻击

1. 引言 OpenSSL新发布的3.20版本中&#xff0c;引入了一些新特性&#xff0c;包括&#xff1a; post-quantum方法Brainpool曲线QUICArgon2&#xff1a;Argon2 是一种慢哈希函数&#xff0c;在 2015 年获得 Password Hashing Competition 冠军&#xff0c;利用大量内存计算抵…

Redis一些常用的技术

文章目录 第1关&#xff1a;Redis 事务与锁机制第2关&#xff1a;流水线第3关&#xff1a;发布订阅第4关&#xff1a;超时命令第5关&#xff1a;使用Lua语言 第1关&#xff1a;Redis 事务与锁机制 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End补充代码&#xff0c;根据…

vuepress-----25、右侧目录

# 25、vuepress 右侧目录 https://github.com/xuek9900/vuepress-plugin-right-anchor vuepress-plugin-right-anchor English &#xff5c;中文 在用 Vuepress 2.x 编写的文档页面右侧添加 锚点导航栏 # 版本 2.x.x -> Vuepress 2.x -> npm next -> master 分支0…

c语言突击

一&#xff1a;前序 1.一个c语言程序有且只有一个main函数&#xff0c;是程序运行的起点&#xff01; 每个c语言程序写完后&#xff0c;都是先编译&#xff08;.c---&#xff09;&#xff0c;后链接&#xff08;.obj---&#xff09;&#xff0c;最后运行&#xff08;.exe&…

ROS-分布式通信

ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式&#xff0c;任何节点可能随时需要与任何其他节点进行通信。 因此&#xff0c;ROS对网络配置有某些要求&#xff1a; 所有端口上的所有机器之间必须有完整的双向连接。每…

【VScode】设置语言为中文

1、下载安装好vscode 2、此时可看到页面为英文&#xff0c;为方便使用可切换为中文 3、键盘按下 ctrlshiftP 4、在输入框内输入configure display language 5、选择中文&#xff0c;restart即可&#xff08;首次会有install安装过程&#xff0c;等待安装成功后重启即可&am…

反爬虫介绍及其处理方法

反爬虫机制 封IP&#xff1a;监控短时间内同一地址的请求次数过大登录及验证码&#xff1a;对于监控后封IP之后短时间内继续的大量请求&#xff0c;要求登陆或验证码通过验证之后才能继续进行。健全账号体制&#xff1a;即核心数据只能通过账号登录后才能进行访问。动态加载数…

【.NET】控制台应用程序的各种交互玩法

关于控制台交互&#xff0c;大伙伴们也许见得最多的是进度条&#xff0c;就是输出一行但末尾不加 \n&#xff0c;而是用 \r 回到行首&#xff0c;然后输出新的内容&#xff0c;这样就做出进度条了。不过这种方法永远只能修改最后一行文本。 于是&#xff0c;有人想出了第二种方…

【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于高斯核回归的拟合算法是一种处理回归问题的机器学习方法。以下是该算法的简单介绍&#xff1a; 核心思想&#xff1a;高斯核回归的核心思想是利用高斯核函数对数据点进行非线性映射&a…

AudioGPT 语音技术全覆盖:语音识别、增强、分离、风格迁移等 | 开源日报 No.114

stevearc/oil.nvim Stars: 1.7k License: MIT oil.nvim 是一个类似于 vim-vinegar 的文件浏览器&#xff0c;允许您像普通 Neovim 缓冲区一样编辑文件系统。其主要功能包括支持常见插件管理器、通过适配器抽象进行所有文件系统交互以及提供 API 来执行各种操作。该项目的关键…

RNN梯度爆炸实验

前情回顾 from torch.utils.data import Dataset import torch.nn as nn import torch.nn.functional as F import os import random import torch from nndl import Accuracy from nndl import RunnerV3 from torch.utils.data import DataLoader import matplotlib.pyplot a…

零基础自学C语言|字符函数和字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数&#xff0c;接下来我们就学习一下这些函数。 &#x1f4cc;字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就…

06_Web框架之Django三

Web框架之Django三 学习目标和内容 1、能够通过ORM模型创建数据表 2、能够通过ORM模型对数据进行操作 3、能够理解ORM模型对应关系 一、ORM概念 1、ORM介绍 对象关系映射 用于实现面向对象编程语言里不同类型系统数据之间的转换。 其就是使用面向对象的方式&#xff0c;操作…