다음을 통해 공유


자동 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 업그레이드 프로세스와 관련된 세부 단계에 대해 자세히 알아보려면 VirtualMachineScaleSets 페이지를 참조하세요.

그러나 automaticOSUpgradePolicy.osRollingUpgradeDeferral이 'true'로 설정되고 일괄 처리 노드가 작업을 적극적으로 실행할 때 업그레이드를 사용할 수 있게 되면 노드에서 모든 작업이 완료될 때까지 업그레이드가 지연됩니다.

참고 항목

풀이 osRollingUpgradeDeferral을 사용하도록 설정한 경우 해당 노드는 업그레이드 프로세스 중에 upgradingos 상태로 표시됩니다. upgradingos 상태는 API 버전 2024-02-01 이상을 사용하는 경우에만 표시됩니다. 이전 API 버전을 사용하여 GetTVM/ListTVM을 호출하는 경우 업그레이드 시 노드는 다시 부팅 상태가 됩니다.

지원되는 OS 이미지

현재는 특정 OS 플랫폼 이미지만 자동 업그레이드를 지원합니다. 자세한 이미지 목록은 VirtualMachineScaleSet 페이지에서 확인할 수 있습니다.

요구 사항

  • 이미지의 버전 속성을 최신으로 설정해야 합니다.
  • Batch 관리 API의 경우 API 버전 2024-02-01 이상을 사용합니다. Batch Service API의 경우 API 버전 2024-02-01.19.0 이상을 사용합니다.
  • 풀에 지정된 외부 리소스가 사용 가능하고 업데이트되었는지 확인합니다. VM 확장 속성의 페이로드, 스토리지 계정의 페이로드, 모델의 비밀에 대한 참조 등을 부트스트랩하기 위한 SAS URI를 예로 들 수 있습니다.
  • virtualMachineConfiguration.windowsConfiguration.enableAutomaticUpdates 속성을 사용하는 경우 풀 정의에서 이 속성을 'false'로 설정해야 합니다. enableAutomaticUpdates 속성은 “Windows 업데이트”가 OS 디스크를 교체하지 않고 운영 체제 패치를 적용하는 VM 내 패치를 사용합니다. 자동 OS 이미지 업그레이드를 사용하도록 설정하면 Windows 업데이트를 통한 추가 패치 프로세스가 필요하지 않습니다.

사용자 지정 이미지에 대한 추가 요구 사항

  • 새 버전의 이미지가 게시되고 해당 풀의 지역에 복제되면 VM은 최신 버전의 Azure Compute Gallery 이미지로 업그레이드됩니다. 풀이 배포된 지역에 새 이미지가 복제되지 않으면 VM 인스턴스가 최신 버전으로 업그레이드되지 않습니다. 지역 이미지 복제를 사용하면 VM에 대한 새 이미지의 출시를 제어할 수 있습니다.
  • 새 이미지 버전은 해당 갤러리 이미지의 최신 버전에서 제외되어서는 안 됩니다. 갤러리 이미지의 최신 버전에서 제외된 이미지 버전은 자동 OS 이미지 업그레이드를 통해 출시되지 않습니다.

자동 OS 업그레이드 구성

풀 내에서 자동 OS 업그레이드를 구현하려는 경우 풀 만들기 프로세스 중에 UpgradePolicy 필드를 구성해야 합니다. 자동 OS 이미지 업그레이드를 구성하려면 풀 정의에서 automaticOSUpgradePolicy.enableAutomaticOSUpgrade 속성이 'true'로 설정되어 있는지 확인합니다.

참고 항목

업그레이드 정책 모드자동 OS 업그레이드 정책은 별도의 설정이며 Azure Batch에서 설정한 프로비전된 크기 조정의 다양한 측면을 제어합니다. 업그레이드 정책 모드는 확장 집합의 기존 인스턴스에 어떤 일이 발생하는지 결정합니다. 그러나 자동 OS 업그레이드 정책 enAutomaticOSUpgrade는 OS 이미지에만 적용되며 이미지 게시자의 변경 내용을 추적하고 이미지 업데이트 시 발생하는 상황을 결정합니다.

Important

사용자 구독을 사용하는 경우 구독을 등록하려면 구독 기능 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}");
}

FAQ

  • 자동 OS 업그레이드를 사용하도록 설정하면 내 작업이 중단되나요?

    automaticOSUpgradePolicy.osRollingUpgradeDeferral이 'true'로 설정된 경우 작업이 중단되지 않습니다. 이 경우 노드가 유휴 상태가 될 때까지 업그레이드가 연기됩니다. 그렇지 않으면 노드는 현재 작업을 실행 중인지 여부에 관계없이 새 OS 버전을 받을 때 업그레이드됩니다. 따라서 automaticOSUpgradePolicy.osRollingUpgradeDeferral을 사용하도록 설정하는 것이 좋습니다.

다음 단계