다음을 통해 공유


NGroup 정보(미리 보기)

컨테이너는 클라우드 애플리케이션을 패키징, 배포 및 관리하는 표준이 되었으며, 이러한 컨테이너를 효과적으로 관리하는 것은 앱 자체를 실행하는 것만큼 중요합니다. ACI(Azure Container Instances )는 인프라를 관리하지 않고 컨테이너화된 애플리케이션을 실행할 수 있는 유연하고 확장 가능한 서버리스 컴퓨팅 서비스입니다.

NGroups는 여러 관련 컨테이너 그룹을 관리하기 위한 고급 기능을 제공합니다. 지원되는 기능은 다음과 같습니다.

  • 여러 인스턴스 유지 관리
  • 롤링 업그레이드
  • AZs(가용성 영역 통해 고가용성)
  • 관리 ID 지원
  • 기밀 컨테이너 지원
  • 부하 분산
  • 영역 재조정(영역 임의)

NGroups 기능은 ACI를 기반으로 하여 컨테이너 그룹이 안전하고 고가용성이며 ACI의 기능 집합을 지원하도록 합니다.

Azure Container Instances에 대한 자세한 내용은 다음을 참조 하세요. Azure Container Instances란?

NGroups 상위 수준 아키텍처

NGroups 상위 수준 워크플로를 보여 주는 다이어그램입니다.

Azure Container Instances를 사용하면 고객은 각 개별 컨테이너 그룹을 수동으로 만들고 유지 관리해야 합니다. NGroups는 단일 API 호출을 사용하여 N 컨테이너 그룹 인스턴스를 만들고, 업데이트하고, 관리하는 보다 쉬운 솔루션을 제공합니다.

NGroups 리소스 만들기는 2단계 프로세스입니다.

  1. 템플릿 역할을 하는 CGProfile(컨테이너 그룹 프로필 )을 만듭니다. CGProfile에서 사용자는 NGroups에서 만든 모든 CG에 적용되는 CG 속성을 지정합니다.

  2. NGroups 리소스를 만듭니다. 원하는 개수(필요한 CG 수) 및 컨테이너 그룹 프로필에 대한 참조를 다른 관련 속성과 함께 제공할 수 있습니다.

NGroups는 이 컨테이너 그룹 프로필을 참조한 다음, CGProfile에 언급된 속성으로 CG를 만들거나 업데이트하기 위해 ACI API를 호출합니다.

개념

컨테이너 그룹 프로필(CG 프로필)

대규모 클라우드 애플리케이션을 사용하려면 여러 컨테이너 그룹을 관리해야 할 수 있습니다. 현재 여러 CG(컨테이너 그룹)를 실행하려면 고객은 매번 컨테이너 이미지, 다시 시작 정책 및 기타 속성과 같은 관련 속성을 제공해야 합니다. 이로 인해 제한, 중복된 작업 및 관리 오버헤드가 발생할 수 있습니다.

이러한 문제를 완화하기 위해 NGroups는 컨테이너 그룹 프로필을 도입했습니다. 컨테이너 그룹 프로필(CGProfile)은 동일한 속성 집합을 사용하여 컨테이너 그룹을 만들기 위한 템플릿 역할을 합니다.

컨테이너 그룹 프로필에 지정할 수 있는 몇 가지 일반적인 속성은 다음과 같습니다.

  • osType(예: Linux, Windows)
  • 또 다른 옵션을 사용할 수 있습니다. 이미지 이름, 메모리, CPU 등
  • restartPolicy
  • ipAddress 프로토콜 및 내부 포트
  • shutdownGracePeriod
  • timeToLive

샘플 CG 프로필은 다음과 같습니다.

{ 
    "location": "{{location}}", 
    "properties": { 
        "sku": "Standard", 
        "containers": [ 
            { 
                "name": "container1", 
                "properties": { 
                    "image": "nginx", 
                    "ports": [ 
                        { 
                            "protocol": "TCP", 
                            "port": 80 
                        } 
                    ], 
                    "resources": { 
                        "requests": { 
                            "memoryInGB": 2.0, 
                            "cpu": 1.0 
                        } 
                    } 
                } 
            } 
        ], 
        "restartPolicy": "Always", 
        "shutdownGracePeriod": "PT1H", 
        "ipAddress": { 
            "ports": [ 
                { 
                    "protocol": "TCP", 
                    "port": 80 
                } 
            ], 
            "type": "Public",
        }, 
        "timeToLive": "PT1H", 
        "osType": "Linux" 
    }     
}

NGroups

NGroups 리소스는 다양한 작업 집합을 사용하여 'n' 컨테이너 그룹을 만들고 관리하는 방법을 제공합니다. NGroups 리소스는 컨테이너 그룹 프로필 리소스를 참조하고 이를 사용하여 유사한 CG의 N 인스턴스를 만듭니다. NGroups 리소스 내에서 고객은 CG 수, 업데이트 기본 설정(수동 또는 롤링 업데이트), 부하 분산 장치, 서브넷 및 NGroups 리소스에서 CG와 연결하려는 기타 관련 속성을 포함하되 이에 국한되지 않는 다른 속성을 지정할 수도 있습니다.

참고 항목

NGroups 리소스를 만들기 전에 CG 프로필을 만들어야 합니다. CG 프로필은 ARM 리소스이므로 자체 ARM API가 있습니다. NGroups 리소스를 만들기 전에 CG 프로필을 만들어야 합니다.

컨테이너 그룹 프로필 참조의 이점

  • 컨테이너 그룹 프로필은 NGroups와 별도의 리소스입니다. 고객은 동일한 컨테이너 그룹 프로필을 참조할 수 있는 여러 NGroup을 만들 수 있습니다. 또한 단일 컨테이너 그룹 프로필을 참조하는 모든 NGroup에서 일관성을 보장하고 중복을 방지합니다.

  • CG 프로필에서 단일 ACI CG를 만들 수도 있습니다. 프로토타입에서 프로덕션 모드로 빠르게 이동할 수 있습니다.

다음은 컨테이너 그룹 프로필을 참조하고 세 개의 컨테이너 그룹을 만드는 관리 ID 및 영역이 있는 NGroups 리소스의 샘플입니다.

{ 
    "location": "{{location}}", 
    "properties": { 
        "elasticProfile": { 
            "desiredCount": 100 // specifies how many CGs to create
        }, 
        "containerGroupProfiles": [ 
            { 
                "resource": { 
                    "id": "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ContainerInstance/containerGroupProfiles/{{cgProfile1}}" 
                } 
            } 
        ] 
    } 
}

NGroups 기능 강조 표시

  • 롤링 및 수동 업데이트 모두 제공
  • 영역 간 컨테이너 그룹 관리
  • 관리 ID 지원
  • 부하 분산 장치 및 애플리케이션 게이트웨이를 추가하여 컨테이너 그룹 간 트래픽 관리
  • 다른 컨테이너 그룹 프로필을 사용하여 컨테이너 그룹 관리
  • 컨테이너 그룹 연결 및 분리

NGroups API

NGroups는 CG 프로필을 참조하고 다른 관련 속성 및 기능을 추가합니다. 예시:

  • 만들거나 스케일 아웃할 원하는 CG 수
  • 가상 네트워크를 사용할 때 CG가 배포되는 서브넷
  • CG에 네트워크 수신을 제공하는 Load Balancer 또는 Application Gateway

NGroup은 차례로 ACI ARM API를 호출하여 각 CG를 만들고 관리합니다. 동일한 ARM API를 사용하므로 NGroups에서 만든 CG와 고객이 직접 만든 CG 간에는 차이가 없습니다. 정확히 동일한 API 환경을 가지고 있습니다.

NGroups 리소스 업데이트

요구 사항이 변경되면 NGroup 및 해당 CG를 계속 업데이트해야 합니다. NGroups 를 업데이트할 수 있는 두 가지 업데이트 모드인 수동 (기본 옵션) 및 롤링이 있습니다.

cgprofile1에서 cgprofile2로 CG 프로필 참조를 업데이트하는 기본 예제를 고려합니다.

  • 수동 모드에서는 cgprofile2에 대한 참조를 업데이트하고 NGroups에 UPDATE PUT 요청을 보냅니다.

NGroups는 이 새 CG 프로필 참조를 저장합니다. 그러나 이 참조를 사용하여 기존 CG를 업데이트하지는 않습니다. 기존 CG는 현재 실행 중이며 영향을 주지 않습니다. 그러나 NGroups가 확장되면 cgprofile2를 사용하여 CG가 만들어집니다.

  • cgprofile2를 사용하여 기존 CG를 업데이트하려면 어떻게 해야 할까요?

기존 CG를 새 CGProfile로 업데이트하기 위해 업데이트하려는 명시적 CG 목록을 사용하여 수동 업데이트 명령을 실행합니다. 이 명령은 목록에 지정된 CG만 업데이트합니다. CG를 업데이트하려면 ACI의 PUT CG API를 호출해야 합니다. 이 목록에 지정되지 않은 CG는 cgprofile1로 계속 실행됩니다.

이 모드는 CG를 선택적으로 업데이트할 수 있는 유연성을 제공하고 프로덕션 워크로드에 미치는 영향을 완전히 제어합니다.

롤링 모드에서 cgprofile2에 대한 참조를 업데이트하고 UPDATE NGroups 명령을 실행하면 기존 CG가 cgprofile2로 업데이트됩니다. 기존 CG에 대한 업데이트는 작은 일괄 처리로 수행됩니다(한 번에 전부는 아님). 이렇게 하면 업데이트 중에 소수의 CG만 사용할 수 없으므로 워크로드에 미치는 영향이 최소화됩니다.

NGroups API를 사용하여 일괄 처리 크기 및 기타 관련 롤링 업데이트 모드 설정을 구성할 수 있습니다.

NGroups 사용해 보기

NGroup 작업 필수 구성 요소

현재 지원되는 API 버전은 2024-09-01-preview입니다.

  1. 구독에 기능을 Microsoft.ContainerInstace/NGroupsPreview 등록합니다.

  2. 기능 플래그가 구독에 적용되면 구독 에 리소스 공급자 Microsoft.ContainerInstance 를 등록합니다.

참고 항목

api-version - 2024-09-01-preview 등을 미리 보기로 사용합니다.

NGroups API에 대한 최신 정보는 Azure Container Instance Swagger를 따릅니다. Container Instance NGroups Swagger - 2024-11-01-preview

이러한 필수 구성 요소가 충족되지 않으면 요청이 실패하고 NGroups 리소스 종류가 인식되지 않습니다.

ARM 템플릿 샘플

CG 프로필 만들기: ContainerGroupProfile-Sample.json CGProfile을 사용하여 영역 NGroup 만들기: NGroups-Zonal-Sample.json

고객은 JSON 보기에서 컨테이너 그룹 orchestratorId 속성을 확인하여 컨테이너 그룹이 NGroups 리소스에 연결되어 있는지 확인할 수 있습니다. orchestratorId는 연결된 NGroups ARM 리소스 ID를 나타냅니다.

OrchestratorId 속성을 표시하는 NGroups CG ARM JSON의 스크린샷.

방법 가이드

롤링 업데이트 수행

롤링 업데이트 기능을 사용하여 NGroup의 가동 중지 시간 없이 모든 CG를 최신 버전으로 자동으로 업데이트할 수 있습니다. 롤링 업데이트 설명서: NGroups 롤링 업데이트를 참조하세요.

지역(영역/비 영역) NGroup 만들기

먼저 CG 프로필을 만듭니다. 다음은 샘플 CG 프로필입니다. 현재 지원되는 API 버전은 2024-09-01-preview입니다.

{ 
    "properties": { 
        "sku": "Standard", 
        "containers": [ 
            { 
                "name": "container1", 
                "properties": { 
                    "image": "nginx", 
                    "ports": [ 
                    { 
                        "protocol": "TCP", 
                        "port": 80 
                    }], 
                    "resources": { 
                        "requests": { 
                            "memoryInGB": 2.0, 
                            "cpu": 1.0 
                        } 
                    } 
                } 
            } 
        ], 
        "restartPolicy": "Always", 
        "shutdownGracePeriod": "PT1H", 
        "ipAddress": { 
            "ports": [ 
            { 
                "protocol": "TCP", 
                "port": 80 
            }], 
            "type": "Public"
        }, 
        "timeToLive": "PT1H", 
        "osType": "Linux" 
    }

다음으로 속성 외부에 영역을 추가하거나 영역 배열을 비워 두어 영역/영역이 아닌 NGroup을 만들 수 있습니다.

{ 
    "properties": { 
        "elasticProfile": { 
            "desiredCount": 5 
        }, 
        "containerGroupProfiles": [ 
            { 
                "resource": { 
                    "id": "[resourceId('Microsoft.ContainerInstance/containerGroupProfiles', parameters('cgProfileName'))]" 
                } 
            } 
        ] 
    }, 
    "zones": [ "1", "2", "3" ] 
}

desiredCount 속성을 설정하여 NGroups를 확장하면 CG가 지정된 모든 영역에 균등하게 분산됩니다. 한 영역이 다운되면 NGroup의 나머지 CG가 다른 영역에서 계속 실행되기 때문에 애플리케이션을 계속 사용할 수 있습니다.

ACI CG API를 통해 직접 NGroups 리소스에서 만든 CG를 업데이트할 수 있나요?

예, 고객은 ACI(Azure Container Instances) API를 사용하여 CG(컨테이너 그룹)를 직접 업데이트할 수 있습니다. ACI 컨테이너 그룹을 자세히 이해하고 관련 API 옵션을 탐색하려면 Azure Container Instances의 컨테이너 그룹인 이 리소스 를 확인하세요.

컨테이너 그룹을 만들거나 업데이트하는 동안 NGroups는 동일한 ACI API를 사용합니다. 즉, 고객은 이러한 API를 사용하여 추가 구성 없이 필요에 따라 특정 컨테이너 그룹을 업데이트할 수 있습니다.

기술 기능 및 제약 조건
  • 영역 집합(예: { "1", "2" })을 사용하여 NGroups 리소스를 만든 후에는 영역을 제거할 수 없습니다. 그러나 새 영역을 목록에 추가할 수 있습니다. 예를 들어 { "1", "2", "3" }

  • 지정된 영역이 다운되면 CG를 만들기 위한 전체 NGroups 작업이 실패합니다. 영역이 백업되면 요청을 다시 시도합니다. 또 다른 옵션은 실패한 CG를 삭제하는 것입니다.

  • 규모를 축소하는 동안 NGroups는 인스턴스를 임의로 삭제하며, 항상 AZ 스프레드를 유지 관리하지는 않을 수 있습니다. 그러나 후속 스케일 아웃 작업은 항상 AZ 스프레드의 균형을 조정하려고 합니다.

  • AZ 스프레드는 스폿 컨테이너에서 지원되지 않습니다. 이러한 요구 사항이 있는 경우 ACI 팀에 문의하세요.

  • 참고 항목: 인프라/플랫폼 업데이트로 인한 가용성의 영향

접두사를 사용하여 NGroups CG 만들기

고객은 GUID 이름 대신 접두사를 사용하여 NGroups CG를 만들 수 있습니다.

"properties": { 
    "elasticProfile": { 
        "desiredCount": 2,             
        "containerGroupNamingPolicy": { 
            "guidNamingPolicy": { 
                "prefix": "cg-" 
            } 
        } 
    },

단일 리소스 그룹에 여러 NGroup이 있고 각 NGroup에 속하는 CG를 구분하려는 경우(예: Azure Portal 보기에서) 유용할 수 있습니다. 또한 각 스케일 아웃 작업에 대해 이를 변경하여 한 작업에서 함께 스케일 아웃된 CG를 식별할 수 있습니다.

시스템 할당 및 사용자 할당 관리 ID를 모두 사용하여 NGroup 만들기

“location”: “{{location}}” 
"identity": { 
    "type": "SystemAssigned, UserAssigned", 
    "userAssignedIdentities": { 
        "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{{userAssignedIdentity1}}": {},  
        "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{{userAssignedIdentity2}}": {} 
    }

NGroup에서 일부 CG를 삭제하는 경우 NGroup이 원하는 개수를 유지하기 위해 새 CG로 다시 빌드할 수 있나요?

예, properties.elasticProfile.maintainDesiredCount bool 속성을 true로 설정할 수 있습니다.

NGroups에서 삭제/분리되는 모든 CG에 대해 새 CG를 만듭니다. NGroups의 desiredCount 속성을 설정 값으로 유지하려고 합니다.

이는 워크로드 시나리오를 위해 풀에서 CG를 제거할 때 자동으로 보충되는 풀로 NGroups를 사용하려는 경우에 유용합니다.

nullable bool 속성입니다. 후속 NGroups PUT/업데이트 호출에 대해 생략하면 false로 다시 설정되지 않습니다. 다시 설정하려면 명시적으로 false로 설정해야 합니다. null/false이고 CG가 NGroups에서 삭제/분리되면 NGroups에 대한 desiredCount 속성이 그에 따라 감소합니다.

CG 이름, NGroups ID 및 기타 메타데이터를 컨테이너로 전파할 어떻게 할까요? 있나요?

현재 CG 이름 및 오케스트레이터 ID(ARM 리소스 ID)만 노출합니다. 나중에 다른 관련 속성을 고려할 수 있습니다. 이러한 두 속성은 컨테이너 환경 변수로 표시됩니다.

컨테이너에서 이러한 환경 변수를 얻으려면 NGroups 수준에서 다음 태그를 지정합니다.

tags: { 
    “metadata.container.environmentVariable.containerGroupName”: true, 
    “metadata.container.environmentVariable.orchestratorId”: true, 
    : 
    : // other NGroups tags you may have 
    : 
}

NGroups는 이러한 태그를 특수이해하고 여기에 표시된 대로 필요한 환경 변수를 각 컨테이너로 전파합니다.

'ContainerGroupName' 및 'OrchestratorId' 속성을 포함하는 환경 변수를 표시하는 Azure Portal의 컨테이너 리소스 스크린샷

인프라/플랫폼 업데이트로 인한 가용성의 영향은 무엇인가요?

더 높은 가용성을 제공하는 워크로드(예: 여러 AZ에 분산된 NGroups)의 경우 둘 이상의 AZ에서 CG가 동시에 다운되는 가능성은 여전히 낮습니다. 기본 Azure 인프라(호스트 머신, Virtual Machine Scale Sets 등)가 업데이트(인프라 업데이트 또는 플랫폼 업데이트라고 함)를 거치면 발생할 수 있습니다.

이 업데이트는 AZ 간에 자동화된 조정이 별로 없는 AZ에 의해 수행됩니다. 조정은 수동으로 추적되며 최선의 노력을 기울입니다.

따라서 우연히 플랫폼 업데이트가 2개 이상의 AZ에서 동시에 발생하는 경우 이러한 AZ의 CG가 동시에 다운되어 NGroup에 사용할 수 없게 될 수 있습니다.

NGroups에서 기밀 컨테이너를 사용하는 방법

NGroups는 기밀 ACI 컨테이너 그룹을 지원합니다. 기밀 인스턴스는 컨테이너 그룹 프로필 내에서 다음 속성을 사용하여 정의됩니다.

{ 
    "location": "{{location}}", 
    "properties": { 
        "sku": "Confidential",
        "confidentialComputeProperties": { 
            "ccePolicy": "<base 64 encoded policy>" 
          }, 
        "containers": [ ... ], 
        "restartPolicy": "Always", 
        "shutdownGracePeriod": "PT1H", 
        "ipAddress": { ... }, 
        "timeToLive": "PT1H", 
        "osType": "Linux" 
    }     
} 

기밀 컨테이너 의 ACI 설명서를 참조하세요. 자습서: Azure Container Instances에서 기밀 컨테이너에 대한 배포 준비

샘플

컨테이너 그룹 프로필 샘플

{
    "properties": {
        "sku": "Standard",
        "containers": [
            {
                "name": "web",
                "properties": {
                    "image": "mcr.microsoft.com/azuredocs/aci-helloworld",
                    "ports": [
                        {
                            "protocol": "TCP",
                            "port": 80
                        }
                    ],
                    "targetState": "Running",
                    "resources": {
                        "requests": {
                            "memoryInGB": 1,
                            "cpu": 1
                        }
                    }
                }
            }
        ],
        "restartPolicy": "Always",
        "shutdownGracePeriod": "PT2H",
        "ipAddress": {
            "ports": [
                {
                    "protocol": "TCP",
                    "port": 80
                }
            ],
            "type": "Public"
        },
        "osType": "Linux",
        "revision": 1
    },
    "id": "/subscriptions/{{subId}}/resourceGroups/{{rgName}}/providers/Microsoft.ContainerInstance/containerGroupProfiles/{{cgProfile1}}",
    "name": "{{cgProfile1}}",
    "type": "Microsoft.ContainerInstance/containerGroupProfiles",
    "location": "{{location}}"
}

영역이 있는 NGroup 샘플

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "apiVersion": {
      "type": "string",
      "maxLength": 32
    },
    "NGroupsName": {
      "type": "string",
      "maxLength": 64
    },
    "containerGroupProfileName": {
      "type": "string",
      "maxLength": 64
    },
    "resourceTags": {
      "type": "object"
    },
    "desiredCount": {
      "type": "int"
    }
  },
  "variables": {
    "description": "This ARM template can be parameterized for a basic CRUD scenario for NGroups. It is self contained with cgProfile and NGroups resource",
    "cgProfileName": "[parameters('containerGroupProfileName')]",
    "NGroupsName": "[parameters('NGroupsName')]",
    "resourcePrefix": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/')]"
  },
  "resources": [
    {
      "apiVersion": "[parameters('apiVersion')]",
      "type": "Microsoft.ContainerInstance/containerGroupProfiles",
      "name": "[variables('cgProfileName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "sku": "Standard",
        "containers": [
          {
            "name": "web",
            "properties": {
              "image": "mcr.microsoft.com/azuredocs/aci-helloworld",
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "resources": {
                "requests": {
                  "memoryInGB": 1.0,
                  "cpu": 1.0
                }
              }
            }
          }
        ],
        "restartPolicy": "Always",
        "ipAddress": {
          "ports": [
            {
              "protocol": "TCP",
              "port": 80
            }
          ],
          "type": "Public"
        },
        "osType": "Linux"
      }
    },
    {
      "apiVersion": "[parameters('apiVersion')]",
      "type": "Microsoft.ContainerInstance/NGroups",
      "name": "[variables('NGroupsName')]",
      "tags": "[parameters('resourceTags')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.ContainerInstance/containerGroupProfiles/', variables('cgProfileName'))]"
      ],
      "identity": {
        "type": "systemAssigned"
      },
      "properties": {
        "elasticProfile": {
          "desiredCount": "[parameters('desiredCount')]",
          "maintainDesiredCount": true
        },
        "containerGroupProfiles": [
          {
            "resource": {
              "id": "[concat(variables('resourcePrefix'), 'Microsoft.ContainerInstance/containerGroupProfiles/', variables('cgProfileName'))]"
            }
          }
        ]
      },
      "zones": [ "1", "2", "3" ]
    }
  ]
}