更新 Batch 池属性

创建 Azure Batch 池时,会指定定义池配置的某些属性。 示例包括指定 VM 大小、要使用的 VM 映像、虚拟网络配置和加密设置。 但是,可能需要更新池属性,因为工作负荷会随着时间推移而发展,或者 VM 映像达到生命周期结束。

这些池属性中有一些(但并非全部)可以通过修补或更新来适应这些情况。 本文提供有关可更新的池属性、池属性更新的预期行为以及示例的信息。

提示

某些池属性只能使用 Entra 身份验证使用 Batch 管理平面 API 或 SDK 进行更新。 需要安装或使用适当的 API 或 SDK,这些操作才可用。

可更新的池属性

Batch 提供了多个方法来更新池的属性。 选择使用哪个 API 会决定可更新的池属性集以及更新行为。

注意

如果要更新不属于以下更新或修补程序 API 的池属性,则必须重新创建池以反映所需状态。

管理面:池 - 更新

更新池属性的建议方法是使用池 - 更新 API 作为 Batch 管理平面 API 或 SDK 的一部分。 此 API 提供更新池属性的最全面且最灵活的方法。 使用此 API 允许仅对管理平面的池属性进行选择性更新,并且能够更新其他原本无法通过数据平面 API 更新的属性。

重要

必须使用 API 版本 2024-07-01 或更高版本的 Batch 管理平面 API 来更新池属性,如本节中所述。

由于此操作是 PATCH,因此仅会更新请求中指定的池属性。 如果未将属性指定为请求的一部分,则现有值将保持不变。

仅当池中没有活动节点或池中计算节点总数为零时,才能更新某些属性。 不要求池大小为零才能使新值生效的属性为:

  • 应用程序包
  • 证书
  • 元数据
  • scaleSettings
  • startTask

如果池使用这些属性进行更新时存在活动节点,则可能需要重新启动活动计算节点才能生效。 有关详细信息,请参阅每个单独池属性的文档。

所有其他可更新的池属性,只有在池大小为零个节点时,才会作为更新请求的一部分被接受。

例如,对 vmSize、deploymentConfiguration、diskEncryptionConfiguration 或 securityProfile 的更改要求池处于 稳定 分配状态,且专用节点数和 Spot 或低优先级节点数均为零。 更新后调整池大小时,Batch 会利用更新后的配置创建一个新的底层计算部署。

还可以使用池 - 创建 API更新这些特定属性,但由于该操作是PUT,因此该请求将完全替换所有现有属性。 因此,请求中未指定的任何属性都将被删除或设置为关联的默认值。

示例:更新 VM 映像规范

以下示例演示如何通过管理平面 C# SDK 更新池 VM 映像配置:

public async Task UpdatePoolVmImage()
{
     // 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 = "<resourcegroup>";
     string accountName = "<batchaccount>";
     ResourceIdentifier batchAccountResourceId = BatchAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, accountName);
     BatchAccountResource batchAccount = client.GetBatchAccountResource(batchAccountResourceId);

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

     // Update the pool
     string poolName = "mypool";
     BatchAccountPoolData data = new BatchAccountPoolData()
     {
         DeploymentConfiguration = new BatchDeploymentConfiguration()
         {
             VmConfiguration = new BatchVmConfiguration(new BatchImageReference()
             {
                 Publisher = "MicrosoftWindowsServer",
                 Offer = "WindowsServer",
                 Sku = "2022-datacenter-azure-edition-smalldisk",
                 Version = "latest",
             },
             nodeAgentSkuId: "batch.node.windows amd64"),
         },
     };

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

     BatchAccountPoolData resourceData = result.Data;
     Console.WriteLine($"Succeeded on id: {resourceData.Id}");
}

示例:更新 VM 大小和目标节点通信模式

以下示例演示如何通过 REST API 更新池 VM 映像大小,并将目标节点通信模式设置为简化:

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

请求正文

{
    "type": "Microsoft.Batch/batchAccounts/pools",
    "parameters": {
        "properties": {
            "vmSize": "standard_d32ads_v5",
            "targetNodeCommunicationMode": "simplified"
        }
    }
}

示例:从 Azure 磁盘加密 迁移到 Encryption at Host

Azure 磁盘加密 for Batch pools 将于 2028 年 9 月 15 日退役。 如果一个池可以使用 Azure 磁盘加密 进行临时磁盘加密,请将池的节点数调整为零,等待其分配状态变为 Steady。 然后使用 API 版本 2024-07-01 或更高版本选择支持的虚拟机大小(如有需要),并将 securityProfile.encryptionAtHost 设置为 true。

更新后,将池大小调整为所需的目标节点数。 Batch 创建了一个新的底层计算部署,并启用了主机加密功能。 完整的迁移过程和请求示例,请参见“ 将现有池迁移到主机加密”。

数据平面:池 - 修补或更新属性

数据平面提供修补或更新选定的池属性的功能。 可用的 API 是 池 - 更新属性 API 作为 Batch 数据平面 API 或 SDK 的一部分。

更新属性 API 允许对文档中指定的池属性进行选择性更新。 此请求会完全替换现有属性,因此删除请求中未指定的任何属性。

必须重新启动计算节点,以下属性的更改才能生效:

  • applicationPackageReferences
  • 证书引用
  • startTask

必须将池大小调整为零个活动节点,才能更新 targetNodeCommunicationMode 属性。

常见问题

  • 当池具有活动节点时,是否需要在更新池属性后执行任何其他操作?

是的,对于可以使用正在运行的节点更新的池属性,有一些属性需要重新启动计算节点。 或者,池可以缩减到零个节点,以反映修改的属性。

  • 当池具有活动节点时,是否可以修改池上的托管标识集合?

是的,但不应该这样做。 虽然 Batch 不会禁止对包含活动节点的集合进行更改,但我们建议避免这样做,因为如果池横向扩展,这会导致标识集合中出现不一致的情况。建议仅在池大小为零时更新此属性。 有关详细信息,请参阅“配置托管标识”一文。

后续步骤