深入了解 cloud-init
适用于:✔️ Linux VM ✔️ 灵活规模集
若要详细了解 cloud-init 或在更深级别对其进行故障排除,你需要了解其工作原理。 本文档重点介绍了重要的部分,并介绍了 Azure 具体内容。
当通用映像中包含 cloud-init 并且基于该映像创建了 VM 时,它会在初始启动过程中处理配置并完成 5 个阶段。 这些阶段显示 cloud-init 应用其配置的时间。
了解 Cloud-Init 配置
将 VM 配置为在平台上运行时,会使用 cloud-init 应用多个配置。 你与之交互的主要配置是 User data
(customData),它支持多种格式。 有关详细信息,请参阅 User-Data 格式和 cloud-init 21.2 文档。 你还可以添加并运行脚本 (/var/lib/cloud/scripts) 来进行其他配置。
预配置的 Azure 市场映像
某些配置已经内置到附带了 cloud-init 的 Azure 市场映像中。
云数据源 - cloud-init 包含可与云平台进行交互的代码,这些代码称为“数据源”。 在 Azure 中基于 cloud-init 映像创建 VM 时,cloud-init 会加载 Azure 数据源,该数据源与 Azure 元数据终结点进行交互来获取特定于 VM 的配置。
运行时配置 (/run/cloud-init)。
映像配置 (/etc/cloud),如
/etc/cloud/cloud.cfg
、/etc/cloud/cloud.cfg.d/*.cfg
。 例如,在 Azure 中使用此配置的情况下,具有 cloud-init 的 Linux OS 映像通常可以发出一个 Azure 数据源指令,告诉 cloud-init 应该使用哪个数据源,此配置可以节省 cloud-init 的时间:sudo cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg
# to update this file, run dpkg-reconfigure cloud-init datasource_list: [ Azure ]
cloud-init 启动阶段(处理配置)
使用 cloud-init 预配 VM 时,有五个配置启动阶段。 这些阶段的输出显示在日志中。
生成器阶段:cloud-init systemd 生成器在启动后会确定是否应该将 cloud-init 包括在启动目标中。如果应该,它会启用 cloud-init。
cloud-init 本地阶段:在此阶段中,cloud-init 查找本地“Azure”数据源,该数据源使 cloud-init 能够与 Azure 进行连接,并应用网络配置(包括回退)。
Cloud-init 初始化阶段(网络):应该联网并生成 NIC 和路由表信息。 此阶段会运行
/etc/cloud/cloud.cfg
的cloud_init_modules
中列出的模块。 系统会装载 Azure 中的 VM,格式化临时磁盘,设置主机名并执行其他任务。下面是部分
cloud_init_modules
:- migrator - seed_random - bootcmd - write-files - growpart - resizefs - disk_setup - mounts - set_hostname - update_hostname - ssh
在此阶段之后,cloud-init 会向 Azure 平台发出信号,指示 VM 已成功预配。 某些模块可能已失败,但并非所有模块故障都会自动导致预配失败。
cloud-init 配置阶段:此阶段会运行
/etc/cloud/cloud
.cfg 中定义和列出的cloud_config_modules
中的模块。cloud-init 最终阶段:此最终阶段会运行
/etc/cloud/cloud.cfg
中列出的cloud_final_modules
中的模块。 这些是在引导过程运行期间后期需要运行的模块,例如包安装和运行脚本等。- 在此阶段,可以通过将脚本放在
/var/lib/cloud/scripts
下的目录中来运行脚本:per-boot
- 每次重启时都会运行此目录中的脚本per-instance
- 首次启动新实例时会运行此目录中的脚本per-once
- 此目录中的脚本仅运行一次
- 在此阶段,可以通过将脚本放在