我正在尝试构建一个可以运行软件组件的短期(CI 和测试版本)的系统,根据我的要求,每个组件都必须位于私有主机上。我认为这个定义包括半虚拟化选项,因为它似乎能为我省去很多麻烦。
我在 Mac 上工作,所以几乎所有技术都可用,虚拟器和閱穆等等对我来说都行不通。不过我计划部署到 Debian;因此,只要我能编写主机及其来宾域的配置脚本,就可以在 Debian 上运行任何程序。
我预期的设置是,我可以用它来引导 Debian 安装程序,这意味着在启动时,机器会自动配置(Chef、Puppet、Babushka,真的不介意)——并且该配置的一部分应该构建一个可用于启动容器的模板 rootfs。容器本身也需要配置,这样当容器启动时,它就知道要做什么工作,并且可以完成工作,然后退出。
简而言之,这是我需要的工作流程:
- 启动一台机器(虚拟的或其他的)并让它准备好工作。
- 该工作应由 chef/puppet/babushka/etc 安装的脚本执行
- 当工作到来的时候,就应该启动一个虚拟机来完成工作。
- VM 应该完成工作、退出并将其资源释放给父/主机。(重要的是,这在合理的硬件上扩展到至少数百个客户 VM)
我曾经尝试过以下方法,但最终由于以下原因而放弃了它们:
对于主机
- 使用 Instalinux 预先植入 Debian micro ISO 映像(由 LinuxCOE 支持)(坏的: 根本不起作用(“未找到内核模块”(因为 Instalinux 映像与 FTP 存储库不同步,显然这种解决方案非常脆弱,它也没有为后期安装留出太多空间,并且将已知的 SSH 密钥、主机密钥等放到机器上,这似乎是一劳永逸的事情,最后我会有一台正在运行的机器,但无法访问它。
- 预安装 Debian netinst ISO(坏的:与上述问题相同,但至少安装通常可以完成,因为 ISO 和 FTP 存储库之间没有内核差异。安装后的范围仍然有限。 好的:绝对可靠且可重复,易于在 Mac 上的任何 VM 技术堆栈上使用,或在裸机上使用,可以在任何地方工作,但我对它的安装还不够)
- 构建 rootfs 并将其编译为可启动硬盘映像的各种方法(坏的:我所能做的只是一点点,但却非常脆弱,很难安装到真正的机器上,而且构建过程也很复杂。 好的: 如果我能让它工作,这似乎为使用 ssh 密钥、主机密钥、主机名、从 Git 安装的软件和其他任何东西将机器预先配置为给定规范提供了最大的范围,但接下来的问题是如何打包它以进行分发,或者如何编写脚本来重新创建它。)
说实话,我不确定人们应该使用什么技术来将虚拟机从无到有地变成一个运行、工作和有用的系统。对我来说似乎有三个步骤:a) 操作系统,b) 系统配置(用户等),然后 c) 文件系统更改。
对于客户机(虚拟):
- 有很多东西,我认为这里的答案主要是用 创建的只读根文件系统
debootstrap
,以及 LXC 容器上的特殊分区,其中包含要为此特定实例完成的工作(作业清单)。插入有关构建操作系统、启动、创建用户、从 git 签出软件和执行工作的所有常见警告。
我真的不知道该用什么工具,看来这个问题应该能很好地解决。但我就是不知道从哪里开始。
对于主机,大多数人似乎建议我选择一种虚拟化技术,将机器启动到工作状态,然后对其进行快照(libvirt 似乎是最适合此目的的)。使用快照启动任何后续安装以进行测试或投入生产。
对于客户机,lxc 似乎提供了最简单的选项,除了在所有现有内核中后台运行容器,然后通过控制台连接到它都会被破坏,并且稳定 Debian 可用的最新版本的 lxc 已经有 18 个月多了,并且缺少很多广泛使用的功能。
通常我是一名应用程序开发人员,并且我并不经常使用服务器级技术(并且我确信 SF 会将这个问题标记为“太主观”),但我确实不确定要使用哪些工具。
最后要说的是,我知道一个类似的项目 (travis-ci.org) 正在使用 Vagrant 盒来实现这一点。这似乎是一种相当笨拙的工具,又大又慢,面向 Ruby 的工具,专为用于关键服务基础设施的测试虚拟机的小规模桌面配置而设计,但我也认识其中一些人,他们比我聪明,所以也许他们只是放弃了。
任何帮助均感激不尽。
答案1
一些想法:
- 您提到的“在合理的硬件上运行数百台虚拟机”让我(没有亲身体验)想到了通过网络启动或通过 NFS 共享大部分卷空间 (/usr) 的虚拟机。这取决于您的虚拟机有多相似。
- “我能得到的东西非常脆弱” 难以置信。你能更准确地说一下问题是什么吗?
- “很难安装到真机上” 您指的是与什么相比“困难”,与创建虚拟机所需的一键式解决方案相比?我想问:这有多难,这种情况发生的频率如何?为相应的硬件重新创建 initrd 有什么区别?
- “但是我无法对其进行足够的后安装”您想要/需要什么,为什么它不起作用?您可以将脚本的下载作为启动过程的一部分。VM 通过 DHCP 获取其 IP(硬配置为 VM 的 MAC 地址),Samba 根据客户端的 IP 地址向 VM 提供不同的后安装脚本。
答案2
在阅读您的帖子时,我一直在想,vagrant 和带有 vagrant 插件的 jenkins 会非常符合您的需求。您拥有的任何可以实际处理您所说的虚拟机数量的设备甚至都不会注意到维护环境的工具的开销。
答案3
使用一些适用于苹果和 Debian 的东西,我唯一尝试过的是虚拟盒。使用虚拟盒您可以在 Mac 系统上构建一个 VM,然后使用相同版本的虚拟盒将其复制到 Debian 系统上,它就会启动。
使用虚拟盒的数百个虚拟机听起来你会花很多时间使用维博克斯曼为每个虚拟机编写必要的唯一信息脚本的接口。例如硬盘的 UUID、网络接口的 MAC 地址。
如果基础系统要使用以相同方式配置的相同软件,则可以创建快照在虚拟机中恢复系统并冻结它。这样所做的更改就不会覆盖冻结的快照,而是写入新的临时存储区域。然后关闭虚拟机,恢复到快照并且您正在使用一个干净的系统,没有在测试期间进行任何更改。这一切都可以使用以下脚本编写:维博克斯曼。
使用您的快照您还可以制作该 VM 映像的数百个副本。使用维博克斯曼脚本接口使副本在重要方面(即 uuid 和 mac 地址)独一无二。然后让启动脚本调用您需要应用于虚拟机进行测试或运行各种测试的任何更改、配置。