Azure 中虚拟机的 cloud-init 支持

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。

适用于:✔️ 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 22.04 UbuntuServer 22.04-LTS 最新
Canonical 20.04 UbuntuServer 20.04-LTS 最新
Canonical 18.04 UbuntuServer 18.04-LTS 最新

CentOS

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
OpenLogic 7 CentOS 7.7、7.8、7.9 最新
OpenLogic 8 CentOS 8.1、8.2、8.3 最新
  • 从 CentOS 7(版本 7.7)和 CentOS 8(版本 8.1)开始,所有其他 CentOS SKU(包括 Gen1 和 Gen2 映像)都是用 cloud-init 预配的。 CentOS 6.10、7.4、7.5 和 7.6 映像不支持 cloud-init。

注意

OpenLogic 现为 Rogue Wave Software

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 最新
  • 从 SLES 15 (sp1) 和 SLES 12 (sp5) 开始,所有其他 SUSE SKU(包括 Gen1 和 Gen2 映像)都是用 cloud-init 预配的。
  • 此外,这些映像也是使用 cloud-init 预配的。
发布者/版本 产品/服务 SKU/版本
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp4:2020.06.10
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp3:2020.06.10
SUSE 12 SLES (SUSE Linux Enterprise Server) sles-{byos/sap/sap-byos}:12-sp2:2020.06.10
SUSE 15 SLES (SUSE Linux Enterprise Server) manager-proxy-4-byosgen1:2020.06.10
SUSE 15 SLES (SUSE Linux Enterprise Server) manager-server-4-byos:gen1:2020.06.10

Debian

发布者/版本 产品/服务 SKU 版本 映像 cloud-init 准备就绪 Azure 上的 cloud-init 包支持
debian (Gen1) debian-10 10-cloudinit 10:0.20201013.422 是 - 以下包版本提供支持:20.2-2~deb10u1
debian (Gen2) debian-10 10-cloudinit-gen2 0.20201013.422 是 - 以下包版本提供支持:20.2-2~deb10u1

目前 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 编辑器。 选择 #1 以使用 nano 编辑器 。 请确保已正确复制整个 cloud-init 文件,尤其是第一行:

SLES Ubuntu CentOS
# 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 配置进行处理。

Ctrl + X 退出该文件,键入 y 以保存文件,并按 Enter 确认退出时的文件名。

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

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

az vm create \
  --resource-group myResourceGroup \
  --name centos74 \
  --image OpenLogic:CentOS-CI:7-CI: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 示例,请参阅以下文档: