Azure 中虚拟机的 cloud-init 支持

适用于:✔️ Linux VM ✔️ 灵活规模集

本文介绍在 Azure 中预配时用于配置虚拟机 (VM) 或虚拟机规模集的 cloud-init 的现有支持。 Azure 预配资源后,这些 cloud-init 配置即会在首次启动时运行。

VM 预配是指 Azure 向下传递你的“VM 创建”参数值(例如主机名、用户名和密码),并在 VM 启动时向其提供这些值的过程。 “预配代理”将使用这些值,配置 VM,并在完成后返回报告。

Azure 支持两个预配代理:cloud-initAzure Linux 代理 (WALA)

cloud-init 概述

cloud-init 是一种广泛使用的方法,用于在首次启动 Linux VM 时对其进行自定义。 可使用 cloud-init 来安装程序包和写入文件,或者配置用户和安全性。 由于是在初始启动过程中调用 cloud-init,因此无需额外的步骤且无需代理来应用配置。 有关如何正确设置 #cloud-config 文件或其他输入的格式的详细信息,请参阅 cloud-init 文档站点#cloud-config 文件是采用 base64 编码的文本文件。

cloud-init 还支持不同的发行版。 例如,不要使用 apt-get 安装yum 安装来安装包。 可定义要安装的程序包的列表。 cloud-init 将对你选择的发行版自动使用本机包管理工具。

我们正在积极地与我们认可的 Linux 发行版合作伙伴合作,以便在 Azure 市场中提供已启用 cloud-init 的映像。 这些映像可使 cloud-init 部署和配置无缝地应用于 VM 和虚拟机规模集。 最初,我们与认可的 Linux 发行版合作伙伴和上游协作,确保 cloud-init 可以配合 Azure 上的 OS 正常运行,然后更新了包,并在发行版包的存储库中公开提供了这些包。

若要使 cloud-init 可供 Azure 上支持的 Linux 发行版使用,需要经历两个阶段 - 包支持,然后是映像支持:

  • “Azure 上的 cloud-init 包支持”阐述了哪些 cloud-init 包即将受支持或以预览版提供,因此你可以将这些包与自定义映像中的 OS 配合使用。
  • “映像 cloud-init 准备就绪”阐述了映像是否已配置为使用 cloud-init。

Canonical

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
Canonical 24.04 UbuntuServer 22.04-LTS 最新
Canonical 22.04 UbuntuServer 22.04-LTS 最新
Canonical 20.04 UbuntuServer 20.04-LTS 最新

RHEL

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
RedHat 7 RHEL 7.7、7.8、7_9 最新
RedHat 8 RHEL 8.1、8.2、8_3、8_4 最新
RedHat 9 RHEL 9_0、9_1 最新
  • 从 RHEL 7(版本 7.7)和 RHEL 8(版本 8.1)开始的所有其他 RedHat SKU(包括 Gen1 和 Gen2 映像)都是用 cloud-init 预配的。 RHEL 6 不支持 Cloud-init。

SUSE SLES

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
SUSE 15 SLES (SUSE Linux Enterprise Server) sp1、sp2、sp3 最新
SUSE 12 SLES (SUSE Linux Enterprise Server) sp5 最新

Debian

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.1015
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.991
debian-10 Debian 10-cloudinit-gen2 Debian:debian-10:10-cloudinit-gen2:0.0.999

目前 Azure Stack 支持预配启用了 cloud-init 的映像。

cloud-init 和 Linux 代理 (WALA) 之间的区别是什么?

WALA 是一种特定于 Azure 平台的代理,用于预配和配置 VM 并处理 Azure 扩展

我们正在增强将 VM 配置为使用 cloud-init 而不是 Linux 代理的任务,使现有的 cloud-init 客户能够使用其当前 cloud-init 脚本,或者使新客户能够利用丰富的 cloud-init 配置功能。 如果已使用过 cloud-init 脚本来配置 Linux 系统,那么,不需要进行额外的设置就能让 cloud-init 处理这些任务。

cloud-init 无法处理 Azure 扩展,因此映像中仍需要 WALA 来处理扩展,但需要禁用其预配代码。 对于正在转换为由 cloud-init 预配的认可的 Linux 发行版映像,它们已安装 WALA 并正确设置。

创建 VM 时,如果在预配时未包括 Azure CLI --custom-data 开关,cloud-init 或 WALA 将采用所需的最小 VM 预配参数来预配 VM 并使用默认值完成部署。 如果使用 --custom-data 开关引用 cloud-init 配置,在 VM 启动时,自定义数据中包含的任何内容均可用于 cloud-init。

应用于 VM 的 cloud-init 配置没有时限,也不会因为超时导致部署失败。对于 WALA,这一点并不适用。如果更改 WALA 默认值来处理自定义数据,则用于处理自定义数据的时间不能超过 VM 预配总时间限制(40 分钟),否则 VM 创建操作将会失败。

无需 UDF 驱动程序的 cloud-init VM 预配

从 cloud-init 21.2 开始,可以使用 cloud-init 在 Azure 中预配 VM,而无需 UDF 驱动程序。 如果映像中未提供 UDF 驱动程序,cloud-init 将使用 Azure 实例元数据服务中提供的元数据来预配 VM。 此选项仅适用于 SSH 密钥和用户数据。 若要在预配期间将密码或自定义数据传递到 VM,必须使用 UDF 驱动程序。

部署已启用 cloud-init 的虚拟机

部署已启用 cloud-init 的虚拟机就和在部署期间引用已启用 cloud-init 的分发一样简单。 Linux 分发 Maintainer 需要选择启用 cloud-init,并将 cloud-init 集成到其基本 Azure 已发布映像中。 确认想要部署的映像已启用 cloud-init 之后,就可以使用 Azure CLI 部署映像。

部署此映像的第一步是使用 az group create 命令创建资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。

注意

在可以在由世纪互联运营的 Microsoft Azure 中使用 Azure CLI 之前,请先运行 az cloud set -n AzureChinaCloud 来更改云环境。 若要切换回 Azure 公有云,请再次运行 az cloud set -n AzureCloud

以下示例在“chinaeast”位置创建名为“myResourceGroup”的资源组。

az group create --name myResourceGroup --location chinaeast

下一步是在当前 shell 中创建名为 cloud-init.txt 的文件并粘贴以下配置。 对于此示例,请在本地计算机中创建文件。 可以使用所选的任何编辑器。 输入 sensible-editor cloud-init.txt 以创建文件,并查看可用编辑器的列表。 使用所选的编辑器。 一些典型的选择包括 nanovimed。 请确保已正确复制整个 cloud-init 文件,尤其是第一行:

SLES Ubuntu RHEL
# cloud-config
package_upgrade: true
packages:
- apache2
# cloud-config
package_upgrade: true
packages:
- httpd
# cloud-config
package_upgrade: true
packages:
- httpd

注意

cloud-init 具有多个输入类型,cloud-init 将使用 customData/userData 的第一行来指明它应如何处理输入,例如,#cloud-config 指示应将内容作为 cloud-init 配置进行处理。

退出文件并根据编辑器保存文件。 在退出时验证文件名。

最后一步是使用 az vm create 命令创建 VM。

下面的示例创建一个名为 ubuntu2204 的 VM,并且在默认密钥位置中不存在 SSH 密钥时创建这些密钥。 若要使用特定的一组密钥,请使用 --ssh-key-value 选项。 使用 --custom-data 参数传递到 cloud-init 配置文件中。 如果未将 cloud-init.txt 配置文件保存在现有工作目录中,请提供该文件的完整路径。

az vm create \
  --resource-group myResourceGroup \
  --name ubuntu2204 \
  --image Canonical:UbuntuServer:22_04-lts:latest \
  --custom-data cloud-init.txt \
  --generate-ssh-keys 

创建 VM 后,Azure CLI 会显示部署的特定信息。 记下 publicIpAddress。 此地址用于访问 VM。 创建 VM、安装程序包和启动应用需要一些时间。 在 Azure CLI 向你返回提示之后,仍然存在继续运行的后台任务。 你可以使用 SSH 连接到 VM 并使用故障排除部分中所述的步骤来查看 cloud-init 日志。

还可通过传递 ARM 模板中的参数来部署已启用 cloud-init 的 VM。

对 cloud-init 进行故障排除

VM 预配完成后,会在 --custom-data 中定义的所有模块和脚本上运行 cloud-init,以便配置 VM。 若要对配置中存在的任何错误或遗漏进行故障排除,需要在位于 /var/log/cloud-init.log 的 cloud-init 日志中搜索模块名称(例如 disk_setupruncmd)。

注意

并不是每个模块故障都会导致严重的 cloud-init 整体配置故障。 例如使用 runcmd 模块,如果脚本发生故障,cloud-init 依然会报告预配成功,因为 runcmd 模块已执行。

有关 cloud-init 日志的更多信息,请参阅 cloud-init 文档

遥测

cloud-init 收集使用情况数据并将其发送给 Microsoft,以帮助改善我们的产品和服务。 仅在预配过程(首次启动 VM)中收集遥测。 收集的数据可帮助我们调查预配失败原因并监视性能和可靠性。 收集的数据不包括任何标识符(个人标识符)。 阅读隐私声明了解更多信息。 收集的一些遥测数据示例(此列表并不详尽):OS 相关信息(cloud-init 版本、发行版、内核版本)、基本 VM 预配操作的性能指标(获取 DHCP 租约的时间、检索配置 VM 所需元数据的时间等)、cloud-init 日志和 dmesg 日志。

目前,我们为大多数使用 cloud-init 的市场映像启用了遥测收集。 可通过为 cloud-init 指定 KVP 遥测报告器来启用。 在大多数 Azure 市场映像中,可以在文件 /etc/cloud/cloud.cfg.d/10-azure-kvp.cfg 中找到此配置。 在映像准备期间移除此文件时,会禁用通过此映像创建的所有 VM 的遥测收集。

10-azure-kvp.cfg 的示例内容

reporting:
  logging:
    type: log
  telemetry:
    type: hyperv

后续步骤

排查 cloud-init 问题

有关配置更改的 cloud-init 示例,请参阅以下文档: