1. cloud-init 基础
首次启动的架构¶
本指南将探讨 cloud-init
,这是自动化您的 Rocky Linux 10 云实例初始设置的关键工具。当我们谈论在云端部署服务器(甚至是在本地虚拟化实验室中)时,我们常常理所当然地认为从一个空白镜像到一台功能齐全、已连接网络的机器的转变几乎是瞬时的。这种数字炼金术的壮举是由一个不知疲倦的实用工具完成的:cloud-init。
1. 引导难题¶
问题:服务器启动时一无所知¶
想象一个通用的 Rocky Linux 10 QCOW2 镜像。它是一个完美、未经修改的副本,不知道它的最终目的地。它不知道自己的主机名、哪个用户账户应该拥有 SSH 访问权限、它在哪个时区,或者它是否需要 Apache 或 NGINX。
如果您正在部署物理硬件,系统管理员将手动配置所有这些参数。但在云端,服务器是短暂的,成千上万地被扩展和缩减。我们需要一种标准化、通用且可靠的机制,在空白镜像首次启动时注入必要的上下文。
这就是 cloud-init 解决的问题。
什么是 cloud-init¶
简单来说,cloud-init 是行业标准的跨发行版软件包,负责云实例的早期初始化。它是负责采用通用镜像(如我们正在使用的)并执行必要的配置任务,将其转换为独特的、可投入生产的服务器的核心服务。
它实际上位于配置过程的核心,解释 **元数据** 和 **用户定义的指令** 来设置系统。没有它,您的云实例只是一个经过精美编译的 Linux 内核,但存在身份危机。
cloud-init 生态系统¶
cloud-init 是一个消费者,而不是一个创造者。它依赖于底层云平台(AWS、Azure、GCP、OpenStack 或 libvirt 等本地工具)来为其提供配置信息。
- 云提供商 通过专门的 *数据源*(通常是本地 HTTP 端点、特定的磁盘标签或内核参数)暴露数据。
- cloud-init 检测到此数据源,读取配置,并执行适当的配置步骤。
这种解耦——即镜像通用而配置从外部提供——是整个云部署模型的根本优势。
2. Rocky Linux 10 和通用云镜像¶
在本指南中,我们将使用官方的 Rocky-10-GenericCloud-Base.latest.x86_64.qcow2。
目标镜像:预先配置好的主力军¶
此镜像很特别,因为它预装并启用了 cloud-init 软件包。它已经过 *泛化*,意味着所有特定于机器的标识符、SSH 主机密钥和日志文件都已被剥离。它已准备好在首次启动时接收其新身份。
使用推荐的镜像
如果您尝试在标准的 Rocky Linux 安装(例如最小 ISO 安装)上使用 cloud-init,您会发现它默认情况下不存在。请坚持使用 **通用云镜像**,以避免不必要的复杂性,并确保一切都按预期工作。尝试使用其他镜像进行本指南中的练习很可能会失败,且不受支持。
核心概念:用户数据 (User-Data) vs. 元数据 (Meta-Data)¶
cloud-init 处理的配置信息分为两类。理解这种区别对于了解您能控制什么以及云提供商能控制什么至关重要。
将其想象成建房子:**元数据** 是城市分配的街道地址,而 **用户数据** 是您提供的内部设计蓝图。
数据类型 | 来源和目的 | 配置类型 |
---|---|---|
元数据 (Meta-Data) | 由云平台提供(只读)。包含系统标识符,如实例 ID、主机名(如果由平台提供)、区域和可用区。 | 系统上下文 |
用户数据 (User-Data) | 由用户提供。这是您的指令集——YAML 配置块或 shell 脚本,用于自定义服务器。 | 用户指令 |
元数据 告诉 cloud-init 它 *在哪里*。用户数据 告诉 cloud-init *做什么*。
我们将主要关注如何创建有效的 **用户数据** 文件,这些文件通常以必需的 YAML 头开始
#cloud-config
3. 生命周期:cloud-init 的四个初始化阶段¶
cloud-init 不仅仅是运行一个脚本然后退出;它执行一系列高度结构化的阶段,这些阶段与服务器的启动过程一致。这种有条理的方法确保了满足依赖关系(例如,在下载包之前配置网络)。
理解这个生命周期对于调试和准确了解您的自定义指令何时被执行至关重要。
阶段 | 时机和描述 | 关键操作/模块 |
---|---|---|
生成器 (Generator) | 在启动过程的非常早期运行。设置内部目录并执行基本的配置检查。 | 内部设置,日志初始化。 |
本地 (Local) | 在网络不一定启动之前运行。它处理本地数据源,如 CD-ROM 或虚拟驱动器(我们将在实验中使用)。 | 从本地数据设置主机名,初始磁盘设置。 |
网络 | 在网络完全配置并运行后运行。它查询基于网络的`数据源`(例如云提供商的 API)。 | 配置网络接口,从网络元数据获取密钥。 |
最终 (Final) | 最后运行。这是大部分用户定义的配置发生的地方,因为所有先决条件(用户、网络、磁盘)现在都已准备就绪。 | 安装包,运行自定义脚本 (runcmd),写入文件 (write_files),系统清理。 |
检查日志
在进行故障排除时,请务必检查 /var/log/cloud-init.log
。此文件是 cloud-init
过程的取证报告,显示每个阶段何时开始和结束,以及在此过程中执行了哪些模块。如果您的脚本未运行,日志将准确地告诉您原因以及哪个阶段失败了。
下一步¶
现在您已经理解了 cloud-init
的基本架构——“是什么”和“为什么”,不同的数据类型以及启动阶段——您已准备好从理论转向实践。下一章将引导您完成您的第一个实践练习:启动 Rocky Linux 10 云镜像并执行一个简单的、真实的自定义。
作者:Wale Soyinka
贡献者:Steven Spencer