次の方法で共有


自動オペレーティング システム (OS) アップグレードを使用した Azure Batch プールの作成

Azure Batch プールを作成するときに、自動 OS アップグレードが有効になっているノードを使用してプールをプロビジョニングできます。 この記事では、自動 OS アップグレードを使用して Azure Batch プールを設定する方法について説明します。

OS の自動アップグレードを使用する理由

OS の自動アップグレードは、Azure Batch プール内でオペレーティング システムの自動アップグレード戦略と制御を実装するために使用されます。 OS の自動アップグレードを使用する理由を次に示します。

  • セキュリティ。 OS の自動アップグレードにより、オペレーティング システム イメージ内の脆弱性とセキュリティの問題に対するタイムリーな修正プログラムが適用され、コンピューティング リソースのセキュリティが強化されます。 これは、潜在的なセキュリティの脆弱性がアプリケーションやデータに脅威を与えるのを防ぐのに役立ちます。
  • 可用性の中断が最小限に抑えられます。 OS の自動アップグレードは、OS アップグレード中のコンピューティング ノードの可用性の中断を最小限に抑えるために使用されます。 これは、タスク スケジューリングに対応したアップグレードの遅延とローリング アップグレードのサポートによって実現され、ワークロードの中断が最小限に抑えられます。
  • 柔軟性。 OS の自動アップグレードを使用すると、パーセンテージベースのアップグレード調整やロールバックのサポートなど、オペレーティング システムの自動アップグレード戦略を構成できます。 つまり、特定のパフォーマンスと可用性の要件を満たすようにアップグレード戦略をカスタマイズできます。
  • 制御。 OS の自動アップグレードを使用すると、オペレーティング システムのアップグレード戦略を制御して、セキュリティで保護されたワークロードに対応したアップグレードの展開を確保できます。 組織の特定のニーズを満たすようにポリシー構成を調整できます。

要約すると、自動 OS アップグレードを使用すると、セキュリティの向上、可用性の中断の最小化、ワークロードの制御と柔軟性の向上の両方を実現できます。

OS の自動アップグレードのしくみ

イメージをアップグレードする場合、Azure Batch プール内の VM は VirtualMachineScaleSets とほぼ同じワークフローに従います。 VirtualMachineScaleSets の自動 OS アップグレード プロセスに関連する詳細な手順の詳細については、VirtualMachineScaleSet のページを参照してください。

ただし、automaticOSUpgradePolicy.osRollingUpgradeDeferral が 'true' に設定されていて、バッチ ノードがアクティブにタスクを実行しているときにアップグレードが使用可能になった場合、アップグレードはノード上のすべてのタスクが完了するまで遅延されます。

Note

プールで osRollingUpgradeDeferral が有効になっている場合、そのノードはアップグレード プロセス中に upgradeingos 状態として表示されます。 upgradingos 状態は、2024-02-01 以降の API バージョンを使用している場合にのみ表示されることに注意してください。 以前の API バージョンを使用して GetTVM/ListTVM を呼び出す場合、アップグレード時にノードは rebooting 状態になります。

サポート対象の OS イメージ

現在、自動アップグレードでは、特定の OS プラットフォーム イメージのみがサポートされています。 詳細なイメージの一覧については、VirtualMachineScaleSet のページから取得できます。

要件

  • イメージの version プロパティを latest に設定する必要があります。
  • Batch Management API の場合は、API バージョン 2024-02-01 以降を使用します。 Batch Service API の場合は、API バージョン 2024-02-01.19.0 以降を使用します。
  • プールで指定された外部リソースが使用可能であり、更新されていることを確認します。 例としては、VM 拡張プロパティ内のブートストラップ ペイロードの SAS URI、ストレージ アカウント内のペイロード、モデル内のシークレットへの参照などが挙げられます。
  • virtualMachineConfiguration.windowsConfiguration.enableAutomaticUpdates プロパティを使用する場合、このプロパティはプール定義で 'false' に設定する必要があります。 enableAutomaticUpdates プロパティを使用すると、OS ディスクを交換せずにオペレーティング システムのパッチを "Windows Update" で適用する VM 内パッチが可能になります。 OS イメージの自動アップグレードが有効になっている場合は、Windows Update による追加のパッチ処理は不要です。

カスタム イメージのその他の要件

  • 新しいバージョンのイメージが発行され、そのプールのリージョンにレプリケートされると、VM は Azure Compute Gallery イメージの最新バージョンにアップグレードされます。 プールがデプロイされているリージョンに新しいイメージがレプリケートされていない場合、VM インスタンスは最新バージョンにアップグレードされません。 リージョンのイメージ レプリケーションによって、VM の新しいイメージのロールアウトを制御することができます。
  • そのギャラリー イメージの最新バージョンから、新しいイメージ バージョンを除外しないでください。 ギャラリー イメージの最新バージョンから除外されたイメージ バージョンは、OS イメージの自動アップグレードを通じてロールアウトされません。

OS の自動アップグレードの構成

プール内に OS の自動アップグレードを実装する場合は、プールの作成プロセス中に UpgradePolicy フィールドを構成することが不可欠です。 OS イメージの自動アップグレードを構成するには、automaticOSUpgradePolicy.enableAutomaticOSUpgrade プロパティがプール定義で 'true' に設定されていることを確認します。

Note

アップグレード ポリシー モードOS 自動アップグレード ポリシーは、個別の設定であり、Azure Batch によってプロビジョニングされたスケール セットのさまざまな側面を制御します。 アップグレード ポリシー モードは、スケール セット内の既存のインスタンスに対する動作を決定します。 一方、OS の自動アップグレード ポリシー enableAutomaticOSUpgrade は OS イメージに固有であり、イメージの発行元が行った変更を追跡し、イメージが更新された場合の処理を決定します。

重要

ユーザー サブスクリプションを使用している場合は、サブスクリプションを登録するには、サブスクリプション機能 Microsoft.Compute/RollingUpgradeDeferral が必要であることに注意してください。 この機能が登録されていない限り、osRollingUpgradeDeferral は使用できません。 この機能を有効にするには、サブスクリプションに手動で登録してください。

REST API

次の例では、REST API を使用して OS の自動アップグレードを使用してプールを作成する方法について説明します。

PUT https://management.azure.com/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 を有効にすることをお勧めします。

次のステップ