使用自动操作系统 (OS) 升级创建 Azure Batch 池

创建 Azure Batch 池时,可以使用启用了自动 OS 升级的节点预配池。 本文介绍了如何使用自动 OS 升级设置 Batch 池。

为何使用自动 OS 升级?

自动 OS 升级用于在 Azure Batch 池中实现自动操作系统升级策略和控制。 下面是使用自动 OS 升级的一些原因:

  • 安全性。 自动 OS 升级可确保及时修补操作系统映像中的漏洞和安全问题,以提高计算资源的安全性。 它有助于防止潜在的安全漏洞对应用程序和数据构成威胁。
  • 最小化的可用性中断。 自动 OS 升级用于最大程度地减少 OS 升级期间计算节点的可用性中断。 它通过任务计划感知升级延迟和支持滚动升级来实现,确保工作负荷尽量少遇到中断。
  • 灵活性。 通过自动 OS 升级,可以配置自动操作系统升级策略,包括基于百分比的升级协调和回滚支持。 这意味着你可以自定义升级策略,以满足特定的性能和可用性要求。
  • 控制性。 自动 OS 升级提供对操作系统升级策略的控制,以确保安全且感知工作负荷的升级部署。 可以根据组织的特定需求定制策略配置。

总之,使用自动 OS 升级有助于提高安全性、最大程度地减少可用性中断,并为工作负荷提供更大的控制和灵活性。

自动 OS 升级的工作原理是什么?

升级映像时,Azure Batch 池中的 VM 将遵循与 VirtualMachineScaleSets 大致相同的工作流。 若要详细了解 VirtualMachineScaleSets 自动 OS 升级过程中涉及的详细步骤,请参阅 VirtualMachineScaleSet 页面

但是,如果 automaticOSUpgradePolicy.osRollingUpgradeDeferral 设置为“true”,并且当批处理节点主动运行任务时,升级将变得可用,那么升级将延迟到节点上完成所有任务为止。

注意

如果池已启用 osRollingUpgradeDeferral,则其节点将在升级过程中显示为 upgradingos 状态。 请注意,只有在使用 2024-02-01 或更高版本的 API 版本时,才会显示 upgradingos 状态。 如果使用旧 API 版本调用 GetTVM/ListTVM,则升级时节点将处于重新启动状态。

支持的 OS 映像

当前仅支持特定 OS 平台映像进行自动升级。 有关详细图像列表,可以从 VirtualMachineScaleSet 页获取。

要求

  • 映像的版本属性必须设置为“最新”
  • 对于 Batch 管理 API,请使用 API 版本 2024-02-01 或更高版本。 对于 Batch 服务 API,请使用 API 版本 2024-02-01.19.0 或更高版本。
  • 确保池中指定的外部资源可用且已更新。 示例包括,VM 扩展属性中用于引导有效负载的 SAS URI、存储帐户中的有效负载、对模型中的机密的引用,等等。
  • 如果使用属性 virtualMachineConfiguration.windowsConfiguration.enableAutomaticUpdates,此属性必须设置为“false”。 enableAutomaticUpdates 属性启用 VM 内部修补,其中的“Windows 更新”将应用操作系统补丁但不替换 OS 磁盘。 启用自动 OS 映像升级后,不需要通过 Windows 更新执行额外的修补过程。

自定义映像的其他要求

  • 将新映像版本发布并复制到该池的区域时,VM 将升级到 Azure Compute Gallery 映像的最新版本。 如果新映像未复制到部署规模的区域,则 VM 实例将不会升级到最新版本。 区域映像复制使你可控制 VM 的新映像的推出。
  • 不应从该库映像的最新版本中排除新映像版本。 从库映像的最新版本中排除的映像版本不会通过 OS 映像自动升级推出。

配置自动 OS 升级

如果要在池中实现自动 OS 升级,则必须在池创建过程中配置 UpgradePolicy 字段。 若要配置自动 OS 映像升级,请确保在池定义中将 automaticOSUpgradePolicy.enableAutomaticOSUpgrade 属性设置为“true”。

注意

升级策略模式和自动操作系统升级策略是两个单独的设置,可控制 Azure Batch 预配规模集的不同方面。 升级策略模式将确定规模集中现有实例会发生什么情况。 但是,自动 OS 升级策略 enableAutomaticOSUpgrade 特定于 OS 映像,将跟踪映像发布者所做的更改,并确定更新映像时会发生什么情况。

重要

如果使用用户订阅,请务必注意,需要注册订阅订阅功能 Microsoft.Compute/RollingUpgradeDeferral。 除非注册此功能,否则不能使用 osRollingUpgradeDeferral。 若要启用此功能,请在订阅上手动注册它。

REST API

以下示例介绍如何通过 REST API 创建具有自动 OS 升级的池:

PUT https://management.chinacloudapi.cn/subscriptions/<subscriptionid>/resourceGroups/<resourcegroupName>/providers/Microsoft.Batch/batchAccounts/<batchaccountname>/pools/<poolname>?api-version=2024-02-01

请求正文

{
    "name": "test1",
    "type": "Microsoft.Batch/batchAccounts/pools",
    "parameters": {
        "properties": {
            "vmSize": "Standard_d4s_v3",
            "deploymentConfiguration": {
                "virtualMachineConfiguration": {
                    "imageReference": {
                        "publisher": "MicrosoftWindowsServer",
                        "offer": "WindowsServer",
                        "sku": "2019-datacenter-smalldisk",
                        "version": "latest"
                    },
                    "nodePlacementConfiguration": {
                        "policy": "Zonal"
                    },
                    "nodeAgentSKUId": "batch.node.windows amd64",
                    "windowsConfiguration": {
                        "enableAutomaticUpdates": false
                    }
                }
            },
            "scaleSettings": {
                "fixedScale": {
                    "targetDedicatedNodes": 2,
                    "targetLowPriorityNodes": 0
                }
            },
            "upgradePolicy": {
                "mode": "Automatic",
                "automaticOSUpgradePolicy": {
                    "disableAutomaticRollback": true,
                    "enableAutomaticOSUpgrade": true,
                    "useRollingUpgradePolicy": true,
                    "osRollingUpgradeDeferral": true
                },
                "rollingUpgradePolicy": {
                    "enableCrossZoneUpgrade": true,
                    "maxBatchInstancePercent": 20,
                    "maxUnhealthyInstancePercent": 20,
                    "maxUnhealthyUpgradedInstancePercent": 20,
                    "pauseTimeBetweenBatches": "PT0S",
                    "prioritizeUnhealthyInstances": false,
                    "rollbackFailedInstancesOnPolicyBreach": false
                }
            }
        }
    }
}

SDK (C#)

以下代码片段示范如何使用 Batch .NET 客户端库通过 C# 代码创建自动 OS 升级池的示例。 有关 Batch .NET 的更多详细信息,请查看参考文档

public async Task CreateUpgradePolicyPool()
{
     // Authenticate
     var clientId = Environment.GetEnvironmentVariable("CLIENT_ID");
     var clientSecret = Environment.GetEnvironmentVariable("CLIENT_SECRET");
     var tenantId = Environment.GetEnvironmentVariable("TENANT_ID");
     var subscriptionId = Environment.GetEnvironmentVariable("SUBSCRIPTION_ID");
     ClientSecretCredential credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
     ArmClient client = new ArmClient(credential, subscriptionId);

     // Get an existing Batch account
     string resourceGroupName = "testrg";
     string accountName = "testaccount";
     ResourceIdentifier batchAccountResourceId = BatchAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, accountName);
     BatchAccountResource batchAccount = client.GetBatchAccountResource(batchAccountResourceId);

     // get the collection of this BatchAccountPoolResource
     BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();

     // Define the pool
     string poolName = "testpool";
     BatchAccountPoolData data = new BatchAccountPoolData()
     {
         VmSize = "Standard_d4s_v3",
         DeploymentConfiguration = new BatchDeploymentConfiguration()
         {
             VmConfiguration = new BatchVmConfiguration(new BatchImageReference()
             {
                 Publisher = "MicrosoftWindowsServer",
                 Offer = "WindowsServer",
                 Sku = "2019-datacenter-smalldisk",
                 Version = "latest",
             },
             nodeAgentSkuId: "batch.node.windows amd64")
             {
                 NodePlacementPolicy = BatchNodePlacementPolicyType.Zonal,
                 IsAutomaticUpdateEnabled = false
             },
         },
         ScaleSettings = new BatchAccountPoolScaleSettings()
         {
             FixedScale = new BatchAccountFixedScaleSettings()
             {
                 TargetDedicatedNodes = 2,
                 TargetLowPriorityNodes = 0,
             },
         },
         UpgradePolicy = new UpgradePolicy()
         {
             Mode = UpgradeMode.Automatic,
             AutomaticOSUpgradePolicy = new AutomaticOSUpgradePolicy()
             {
                 DisableAutomaticRollback = true,
                 EnableAutomaticOSUpgrade = true,
                 UseRollingUpgradePolicy = true,
                 OSRollingUpgradeDeferral = true
             },
             RollingUpgradePolicy = new RollingUpgradePolicy()
             {
                 EnableCrossZoneUpgrade = true,
                 MaxBatchInstancePercent = 20,
                 MaxUnhealthyInstancePercent = 20,
                 MaxUnhealthyUpgradedInstancePercent = 20,
                 PauseTimeBetweenBatches = "PT0S",
                 PrioritizeUnhealthyInstances = false,
                 RollbackFailedInstancesOnPolicyBreach = false,
             }
         }
     };

     ArmOperation<BatchAccountPoolResource> lro = await collection.CreateOrUpdateAsync(WaitUntil.Completed, poolName, data);
     BatchAccountPoolResource result = lro.Value;

     // the variable result is a resource, you could call other operations on this instance as well
     // but just for demo, we get its data from this resource instance
     BatchAccountPoolData resourceData = result.Data;
     // for demo we just print out the id
     Console.WriteLine($"Succeeded on id: {resourceData.Id}");
}

常见问题

  • 如果我启用了自动 OS 升级,我的任务是否会中断?

    当 automaticOSUpgradePolicy.osRollingUpgradeDeferral 设置为“true”时,任务不会中断。 在这种情况下,升级将推迟到节点处于空闲状态时。 否则,无论节点当前是否正在运行任务,都会在收到新的 OS 版本时升级。 因此,我们强烈建议启用 automaticOSUpgradePolicy.osRollingUpgradeDeferral

后续步骤