Cloud-Init 和 VM

潘佐
2023-12-01

如果你想使用 cloud-init 来配置 cloud-images,只需向下滚动到第 3 点。

1.它有什么作用?

有没有想过每次在“云”中启动新 VM 时,VPS 提供商如何配置您的 VM、添加您的 SSH 密钥、创建用户和安装软件包?嗯,大多数供应商的答案是cloud-init。大多数操作系统和发行版都附带安装在映像中的各自操作系统的虚拟磁盘映像。安装非常简单,可以作为操作系统根文件系统的模板。操作系统维护人员也很友好地为从原始磁盘映像到 qcow2 甚至 vmdk、vdi 和 vhd 的所有各种格式提供虚拟磁盘映像。

该映像还预装了一个额外的软件包,即 cloud-init。cloud-init 的工作是初始化VM(通常在 DigitalOcean、AWS 或 Azure 等云托管服务中)与托管提供商的数据源对话并获取配置信息,然后使用这些信息来配置 VM。

配置信息可以包括用户数据,如 SSH 密钥、实例的主机名、用户和密码以及用户想要运行的任何其他任意命令。

2. Cloud-Init 的问题

如果您是云用户,则 Cloud-init 是一个很棒的工具,如果您正在启动虚拟机或容器,并且您的云提供商很友好地要求您提供云配置,那就太好了!使用 cloud-config 文件,即您的用户数据,您可以在创建 VM 时添加用户、运行任意命令、安装软件包。该过程可以一遍又一遍地重复,而无需一遍又一遍地键入乏味的命令。很快您就会拥有一组虚拟机,所有这些都具有相同的配置。

但是,如果您深入挖掘并了解香肠是如何制作的,您将开始质疑 cloud-init 的某些方面。例如,默认情况下,数据源就像一个 REST 端点,它们本质上是硬编码到 cloud-init 包本身中的。当然,您可以自己设置一个数据源,但这个过程很麻烦且耗时。执行此操作的文档几乎不存在。

官方文件是什么,但对于最终用户依靠已有的云服务的用户手册。它不会告诉您如何设置自己的 cloud-init 数据源,以防您是即将到来的供应商。

更糟糕的是,拥有家庭虚拟化实验室和小型 VPS 初创公司的用户发现很难从这些轻量级云镜像中受益。如果没有 cloud-init 数据源或一些难以自动化和扩展的黑客,您就无法真正从这些模板启动 VM。换句话说,除非您想制作自己的模板,否则您甚至不能选择忽略 cloud-init。

以经典的 systemd 方式,它摆脱了其预定义的角色,并开始与网络和操作系统的其他部分混为一谈,从而使用户望而却步。它捆绑在 Ubuntu 18.04 服务器 ISO 中,这完全没有意义(至少对我来说不是)。

3. 家庭实验室的解决方法

抛开所有的咆哮,我仍然需要在日常使用中处理 cloud-init。我在 x86_64 硬件上安装了一个非常小的 Debian 9,我将其用作KVM 管理程序。我真的很想使用UbuntuCentOS附带的 qcow2 磁盘映像。这些磁盘映像中预装了操作系统,要使用它们,您只需:

  1. 将它们复制为 VM 的虚拟硬盘映像。
  2. 将根文件系统的虚拟大小调整为您想要的大小(建议至少 10GB)。这不会增加 VM 的物理大小,但随着 VM 向其添加更多数据,磁盘映像会随着时间的推移而增长。
  3. 使用 cloud-init 配置 VM。最低要求是设置 root 用户的密码或 SSH 密钥,但您可以执行 cloud-init 所能做的一切。

遵循以下步骤:

  1. 下载您喜欢的操作系统的云镜像并将其保存在 /var/lib/libvirt/boot 目录中:
$ cd /var/lib/libvirt/boot
$ curl -O https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-
amd64-disk1.img
$ cd /var/lib/libvirt/images

  1. 创建一个所需大小的空虚拟硬盘,并将下载的 qcow2 映像展开到其中。我喜欢把虚拟机硬盘存放在 /var/lib/libvirt/images/ 目录下,你可以选择不同的目录。无论您选择什么,请在同一目录中运行以下命令:
$ qemu-img create -f qcow2 myVM.qcow2 8G ## Create a harddisk with
virtual disk size of 8GB
$ virt-resize --expand /dev/sda1 /var/lib/libvirt/boot/xenial-server-
cloudimg-amd64-disk1.img
 ./myVM.qcow2

  1. 创建 cloud-init 文件。这些是用户数据和元数据文件:
$ vim meta-data
instance-id: myVM
local-hostname: myVM
 
$ vim user-data
#cloud-config
users:
- name: root
chpasswd:
list: |
root:myPassword
expire: False

我在这里唯一的用户是 root 用户。如果您不提及任何用户,则会创建名为ubuntu的默认用户。默认用户名因操作系统而异,这就是我建议指定用户的原因,即使它只是root。用户数据文件的下一部分告诉 cloud-init 为要分配密码的所有用户配置密码。同样,我只是为 root 用户设置密码,它是myPassword。确保冒号和密码字符串之间没有空格。

更好的是,您可以使用 SSH 密钥而不是放置硬编码的密码。

$ vim user-data
#cloud-config
users:
- name: root
ssh_pwauth: True
ssh_authorized_keys:
- ssh-rsa <Your public ssh keys here>

  1. 将用户数据和元数据文件嵌入到一个 iso 中。
$ genisoimage -output cidata-myVM.iso -volid cidata -joliet -rock user-data meta-data

确保文件 cidata-myVM.iso 位于 /var/lib/libvirt/images/

 

  1. 转到 /var/lib/libvirt/images 目录并使用 virt-install 命令初始化 VM:
    $ virt-install --import --name myVM --memory 2048 --vcpus 2 --cpu host
     --disk myVM.qcow2,format=qcow2,bus=virtio --disk myVM-cidata.iso,device=cdrom
     --network bridge=virbr0,model=virtio --os-type=linux
     --os-variant=ubuntu16.04 --noautoconsole

    您现在可以尝试使用命令 virsh console myVM 并使用 root 用户名及其相应密码登录来登录 VM。要退出控制台,只需键入 Ctrl+]

结论

大多数供应商提供的云图像在资源利用方面非常高效,而且它们也感觉非常快速和响应。我们需要以处理笨拙的 cloud-init 配置作为起点的事实只会阻碍社区对 KVM 和相关技术的采用。

社区可以从 Docker 构建和发布其镜像的方式中学到很多东西。它们作为运行容器和易于分发和使用的模板都非常易于管理。

 类似资料: