在虚拟机规模集中安装和更新应用程序

已完成

在规模集内部署应用程序时,需要一个跨规模集中所有实例一致地更新应用程序的机制。 可通过自定义脚本扩展可以实现此结果。

在运输公司场景中,需要快速推出应用程序更新,同时尽量减少对最终用户造成的干扰。 自定义脚本扩展是一种理想的解决方案。

本单元介绍如何使用自定义脚本扩展更新在规模集上运行的应用程序。

什么是 Azure 自定义脚本扩展?

Azure 自定义脚本扩展在 Azure 虚拟机上下载和运行脚本。 它可以在规模集中的所有虚拟机上自动执行相同的任务。

将自定义脚本存储在 Azure 存储或 GitHub 中。 要向虚拟机添加一个自定义脚本,可使用 Azure 门户。 要在模板化部署的过程中运行自定义脚本,请将自定义脚本扩展与 Azure 资源管理器模板合并。

使用自定义脚本扩展在规模集中安装应用程序

若要通过 Azure CLI 使用自定义脚本扩展,需要创建一个定义待获取文件和待执行命令的配置文件。 该文件的格式为 JSON。

下面的示例演示了自定义脚本配置,该配置从 GitHub 存储库中下载一个应用程序,并通过运行名为 custom_application_v1.sh 的脚本将其安装在主机实例上:

# yourConfigV1.json 
{
  "fileUris": ["https://raw.githubusercontent.com/yourrepo/master/custom_application_v1.sh"],
  "commandToExecute": "./custom_application_v1.sh"
}

要在规模集上部署此配置,请使用自定义脚本扩展。 下面的代码演示如何使用 Azure CLI 为虚拟机规模集创建自定义脚本扩展。 该命令在规模集中的虚拟机上安装新应用:

az vmss extension set \
  --publisher Microsoft.Azure.Extensions \
  --version 2.0 \
  --name CustomScript \
  --resource-group myResourceGroup \
  --vmss-name yourScaleSet \
  --settings @yourConfigV1.json

使用自定义脚本扩展更新规模集中的应用程序

可以使用自定义脚本扩展来更新虚拟机规模集中的现有应用。 引用更新的部署脚本,然后将扩展重新应用到规模集。 例如,下面的 JSON 代码显示了一个配置,该配置获取新版本应用程序并进行安装:

# yourConfigV2.json
{
  "fileUris": ["https://raw.githubusercontent.com/yourrepo/master/custom_application_v2.sh"],
  "commandToExecute": "./custom_application_v2.sh"
}

可使用先前显示的同一 az vmss extension set 命令部署更新的应用,但这次你将引用新的配置文件:

az vmss extension set \
    --publisher Microsoft.Azure.Extensions \
    --version 2.0 \
    --name CustomScript \
    --resource-group yourResourceGroup \
    --vmss-name yourScaleSet \
    --settings @yourConfigV2.json

虚拟机会根据规模集的升级策略进行更新。 在首次创建规模集时,将指定该策略。 升级策略采用以下三种模式中的一种:

  • 自动:规模集不定义虚拟机的升级时间。 虚拟机可能同时全部更新,导致出现服务中断。
  • 滚动:规模集在规模集的虚拟机中批量推出更新。 可选择暂停来最大程度地减少或消除服务中断。 在此模式下,规模集中的虚拟机可能会在短时间内运行不同版本的应用。 此模式要求向规模集添加运行状况探测,或对规模集应用“应用程序运行状况”扩展。
  • 手动:规模集中的现有虚拟机不会自动更新。 所有更改必须手动完成。 这是默认模式。

要在预配虚拟机规模集时指定升级策略,可以使用 upgrade-policy-mode 选项。 以下代码示例使用 Azure CLI:

az vmss create \
  --resource-group MyResourceGroup \
  --name MyScaleSet \
  --image Ubuntu2204 \
  --upgrade-policy-mode automatic \
  --admin-username azureuser \
  --generate-ssh-keys