深入了解 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 时,有五个配置启动阶段。 这些阶段的输出显示在日志中。

  1. 生成器阶段:cloud-init systemd 生成器在启动后会确定是否应该将 cloud-init 包括在启动目标中。如果应该,它会启用 cloud-init。

  2. cloud-init 本地阶段:在此阶段中,cloud-init 查找本地“Azure”数据源,该数据源使 cloud-init 能够与 Azure 进行连接,并应用网络配置(包括回退)。

  3. Cloud-init 初始化阶段(网络):应该联网并生成 NIC 和路由表信息。 此阶段会运行 /etc/cloud/cloud.cfgcloud_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 已成功预配。 某些模块可能已失败,但并非所有模块故障都会自动导致预配失败。

  4. cloud-init 配置阶段:此阶段会运行 /etc/cloud/cloud.cfg 中定义和列出的 cloud_config_modules 中的模块。

  5. cloud-init 最终阶段:此最终阶段会运行 /etc/cloud/cloud.cfg 中列出的 cloud_final_modules 中的模块。 这些是在引导过程运行期间后期需要运行的模块,例如包安装和运行脚本等。

    • 在此阶段,可以通过将脚本放在 /var/lib/cloud/scripts 下的目录中来运行脚本:
      • per-boot - 每次重启时都会运行此目录中的脚本
      • per-instance - 首次启动新实例时会运行此目录中的脚本
      • per-once - 此目录中的脚本仅运行一次

后续步骤

对 cloud-init 进行故障排除