Azure 中虚拟机的 cloud-init 支持
适用于:✔️ Linux VM ✔️ 灵活规模集
本文介绍在 Azure 中预配时用于配置虚拟机 (VM) 或虚拟机规模集的 cloud-init 的现有支持。 Azure 预配资源后,这些 cloud-init 配置即会在首次启动时运行。
VM 预配是指 Azure 向下传递你的“VM 创建”参数值(例如主机名、用户名和密码),并在 VM 启动时向其提供这些值的过程。 “预配代理”将使用这些值,配置 VM,并在完成后返回报告。
Azure 支持两个预配代理:cloud-init 和 Azure 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 以创建文件,并查看可用编辑器的列表。 使用所选的编辑器。 一些典型的选择包括 nano、vim 或 ed。 请确保已正确复制整个 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_setup
或 runcmd
)。
注意
并不是每个模块故障都会导致严重的 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 示例,请参阅以下文档: