Virtual Machine Scale Sets에 애플리케이션 상태 확장 사용

애플리케이션 상태 모니터링은 배포 관리 및 업그레이드에 대한 중요한 신호입니다. Azure Virtual Machine Scale Sets는 배포를 업그레이드하기 위해 개별 인스턴스의 상태 모니터링을 사용하는 자동 OS 이미지 업그레이드자동 VM 게스트 패치를 포함한 롤링 업그레이드를 지원합니다. 또한 애플리케이션 상태 확장을 사용하여 확장 집합에 있는 각 인스턴스의 애플리케이션 상태를 모니터링하고 자동 인스턴스 복구를 사용하여 인스턴스 복구를 수행할 수 있습니다.

이 문서에서는 두 가지 형식의 애플리케이션 상태 확장인 이진 성능 상태 또는 리치 성능 상태를 사용하여 Virtual Machine Scale Sets에 배포된 애플리케이션의 상태를 모니터링하는 방법을 설명합니다.

필수 조건

이 문서에서는 사용자가 다음에 대해 잘 알고 있다고 가정합니다.

  • Azure 가상 머신 확장
  • Virtual Machine Scale Sets 수정

주의

애플리케이션 상태 확장은 VM에 정상 레이블을 지정하기 위해 구성된 포트 tcp 또는 요청 경로 http/https에서 일관된 프로브 응답을 수신할 것으로 예상합니다. VM에서 실행 중인 애플리케이션이 없거나 프로브 응답을 구성할 수 없는 경우 VM은 비정상(이진 성능 상태) 또는 알 수 없음(리치 성능 상태)으로 표시됩니다.

참고 항목

Virtual Machine Scale Sets에는 애플리케이션 상태 확장 또는 상태 프로브 중 하나의 상태 모니터링 원본만 사용할 수 있습니다. 두 옵션을 모두 사용하도록 설정한 경우 인스턴스 복구 또는 자동 OS 업그레이드와 같은 오케스트레이션 서비스를 사용하기 전에 하나를 제거해야 합니다.

애플리케이션 상태 확장을 사용하는 경우

애플리케이션 상태 확장은 Virtual Machine Scale Sets 인스턴스 내에 배포되고, 확장 집합 인스턴스 내부에서 애플리케이션 상태를 보고합니다. 확장은 로컬 애플리케이션 엔드포인트를 조사하고 애플리케이션에서 받은 TCP/HTTP(S) 응답을 기반으로 상태를 업데이트합니다. 이 상태는 Azure에서 비정상 인스턴스에 대한 복구를 시작하고 인스턴스가 업그레이드 작업에 적합한지 확인하는 데 사용됩니다.

확장은 VM 내에서 상태를 보고하며 Azure Load Balancer 상태 프로브와 같은 외부 프로브를 사용할 수 없는 상황에서 사용할 수 있습니다.

이진 성능 상태 및 리치 성능 상태

애플리케이션 상태 확장에는 이진 성능 상태리치 성능 상태라는 두 가지 옵션을 사용할 수 있습니다. 다음 표에는 두 옵션 간의 몇 가지 주요 차이점이 나와 있습니다. 일반적인 권장 사항은 이 섹션의 끝부분을 참조하세요.

기능 이진 성능 상태 리치 성능 상태
사용 가능한 성능 상태 사용 가능한 두 가지 상태: 정상, 비정상 사용 가능한 네 가지 상태: 정상, 비정상, 초기화, 알 수 없음1
상태 신호 보내기 상태 신호는 HTTP/HTTPS 응답 코드 또는 TCP 연결을 통해 전송됩니다. HTTP/HTTPS 프로토콜의 상태 신호는 프로브 응답 코드와 응답 본문을 통해 전송됩니다. TCP 프로토콜을 통한 상태 신호는 이진 성능 상태와 동일하게 유지됩니다.
비정상 인스턴스 식별 애플리케이션에서 정상 신호가 수신되지 않으면 인스턴스는 자동으로 비정상 상태가 됩니다. 비정상 인스턴스는 확장 구성 문제(예: 엔드포인트에 연결할 수 없음) 또는 애플리케이션 문제(예: 200이 아닌 상태 코드)를 나타낼 수 있습니다. 애플리케이션이 비정상 프로브 응답을 내보내는 경우에만 인스턴스가 비정상 상태로 전환됩니다. 사용자는 비정상 애플리케이션2이 있는 인스턴스를 식별하고 플래그를 지정하는 사용자 지정 논리를 구현할 책임이 있습니다. 잘못된 확장 설정(예: 엔드포인트에 연결할 수 없음)이 있거나 잘못된 상태 프로브 응답이 있는 인스턴스는 알 수 없음 상태2에 속합니다.
새로 만들어진 인스턴스의 초기화 상태 초기화 상태를 사용할 수 없습니다. 새로 만들어진 인스턴스가 안정적인 상태로 설정되기까지 다소 시간이 걸릴 수 있습니다. 초기화 상태를 사용하면 새로 만들어진 인스턴스를 롤링 업그레이드 또는 인스턴스 복구 작업에 적합하게 만들기 전에 안정적인 성능 상태로 설정할 수 있습니다.
HTTP/HTTPS 프로토콜 지원됨 지원됨
TCP 프로토콜 지원됨 제한된 지원 – TCP 프로토콜에서는 알 수 없음 상태를 사용할 수 없습니다. TCP의 성능 상태 동작은 리치 성능 상태 프로토콜 표를 참조하세요.

1 TCP 프로토콜에서는 알 수 없음 상태를 사용할 수 없습니다. 2 HTTP/HTTPS 프로토콜에만 적용 가능합니다. TCP 프로토콜은 이진 성능 상태에서와 마찬가지로 비정상 인스턴스를 식별하는 동일한 프로세스를 따릅니다.

일반적으로 다음과 같은 경우에는 이진 성능 상태를 사용해야 합니다.

  • 비정상 인스턴스를 식별하고 플래그를 지정하는 사용자 지정 논리를 구성하는 데 관심이 없습니다.
  • 새로 만들어진 인스턴스에는 초기화 유예 기간이 필요하지 않습니다.

다음과 같은 경우에는 리치 성능 상태를 사용해야 합니다.

  • HTTP/HTTPS 프로토콜을 통해 상태 신호를 보내고 프로브 응답 본문을 통해 상태 정보를 제출할 수 있습니다.
  • 비정상 인스턴스를 식별하고 표시하기 위해 사용자 지정 논리를 사용하려고 합니다.
  • 새로 만들어진 인스턴스에 대해 초기화 유예 기간을 설정하여 인스턴스가 롤링 업그레이드 또는 인스턴스 복구에 적합하도록 만들기 전에 안정된 성능 상태를 유지하려고 합니다.

이진 성능 상태

이진 성능 상태 보고에는 정상비정상이라는 두 가지 성능 상태가 포함되어 있습니다. 다음 표에서는 성능 상태 구성 방법에 대한 간략한 설명을 제공합니다.

HTTP/HTTPS 프로토콜

프로토콜 성능 상태 설명
http/https 정상 정상 신호를 보내려면 애플리케이션이 200 응답 코드를 반환해야 합니다.
http/https 비정상 애플리케이션에서 200 응답 코드가 수신되지 않으면 인스턴스는 비정상으로 표시됩니다.

TCP 프로토콜

프로토콜 성능 상태 설명
TCP 정상 정상 신호를 보내려면 제공된 애플리케이션 엔드포인트를 사용하여 성공적인 핸드셰이크가 이루어져야 합니다.
TCP 비정상 제공된 애플리케이션 엔드포인트에서 핸드셰이크가 실패하거나 불완전하게 발생한 경우 인스턴스는 비정상으로 표시됩니다.

비정상 상태를 초래할 수 있는 몇 가지 시나리오는 다음과 같습니다.

  • 애플리케이션 엔드포인트가 200이 아닌 상태 코드를 반환하는 경우
  • 애플리케이션 상태를 제공하기 위해 가상 머신 인스턴스 내에 구성된 애플리케이션 엔드포인트가 없는 경우
  • 애플리케이션 엔드포인트가 잘못 구성된 경우
  • 애플리케이션 엔드포인트에 연결할 수 없는 경우

리치 성능 상태

리치 성능 상태 보고에는 초기화, 정상, 비정상알 수 없음의 네 가지 성능 상태가 포함되어 있습니다. 다음 표에서는 각 성능 상태가 구성되는 방법에 대한 간략한 설명을 제공합니다.

HTTP/HTTPS 프로토콜

프로토콜 성능 상태 설명
http/https 정상 정상 신호를 보내기 위해 애플리케이션은 다음과 같은 프로브 응답을 반환해야 합니다. 프로브 응답 코드: 상태 2xx, 프로브 응답 본문: {"ApplicationHealthState": "Healthy"}
http/https 비정상 비정상 신호를 보내기 위해 애플리케이션은 다음과 같은 프로브 응답을 반환해야 합니다. 프로브 응답 코드: 상태 2xx, 프로브 응답 본문: {"ApplicationHealthState": "Unhealthy"}
http/https 초기화 중 인스턴스는 확장 시작 시간에 자동으로 초기화 상태로 전환됩니다. 자세한 내용은 초기화 상태를 참조하세요.
http/https Unknown 알 수 없음 상태는 다음과 같은 시나리오에서 발생할 수 있습니다. 애플리케이션에서 2xx가 아닌 상태 코드를 반환하는 경우, 프로브 요청 시간이 초과되는 경우, 애플리케이션 엔드포인트에 연결할 수 없거나 잘못 구성된 경우, 응답 본문의 ApplicationHealthState에 누락되거나 잘못된 값이 제공되거나 유예 기간이 만료되는 경우. 자세한 내용은 알 수 없음 상태를 참조하세요.

TCP 프로토콜

프로토콜 성능 상태 설명
TCP 정상 정상 신호를 보내려면 제공된 애플리케이션 엔드포인트를 사용하여 성공적인 핸드셰이크가 이루어져야 합니다.
TCP 비정상 제공된 애플리케이션 엔드포인트에서 핸드셰이크가 실패하거나 불완전하게 발생한 경우 인스턴스는 비정상으로 표시됩니다.
TCP 초기화 중 인스턴스는 확장 시작 시간에 자동으로 초기화 상태로 전환됩니다. 자세한 내용은 초기화 상태를 참조하세요.

초기화 상태

이 상태는 리치 성능 상태에만 적용됩니다. 초기화 상태는 확장 시작 시간에 한 번만 발생하며 확장 설정 gracePeriodnumberOfProbes로 구성할 수 있습니다.

확장 시작 시 애플리케이션 상태는 다음 두 가지 시나리오 중 하나가 발생할 때까지 초기화 상태로 유지됩니다.

  • 동일한 성능 상태(정상 또는 비정상)가 numberOfProbes를 통해 구성된 대로 연속적으로 보고됩니다.
  • gracePeriod가 만료됩니다.

동일한 성능 상태(정상 또는 비정상)가 연속적으로 보고되면 애플리케이션 성능이 초기화 상태에서 보고된 성능 상태(정상 또는 비정상)로 전환됩니다.

예시

numberOfProbes = 3이면 다음을 의미합니다.

  • 초기화에서 정상 상태로 전환하려면 애플리케이션 상태 확장이 HTTP/HTTPS 또는 TCP 프로토콜을 통해 3개의 연속 정상 신호를 수신해야 합니다.
  • 초기화에서 비정상 상태로 전환하려면 애플리케이션 상태 확장이 HTTP/HTTPS 또는 TCP 프로토콜을 통해 연속 3개의 비정상 신호를 수신해야 합니다.

애플리케이션이 연속 상태를 보고하기 전에 gracePeriod가 만료되면 인스턴스 상태는 다음과 같이 결정됩니다.

  • HTTP/HTTPS 프로토콜: 애플리케이션 상태가 초기화에서 알 수 없음으로 전환됩니다.
  • TCP 프로토콜: 애플리케이션 상태가 초기화에서 비정상으로 전환됩니다.

알 수 없음 상태

이 상태는 리치 성능 상태에만 적용됩니다. 알 수 없음 상태는 "http" 또는 "https" 프로브에 대해서만 보고되며 다음 시나리오에서 발생합니다.

  • 애플리케이션이 2xx가 아닌 상태 코드를 반환하는 경우
  • 프로브 요청 시간이 초과된 경우
  • 애플리케이션 엔드포인트에 연결할 수 없거나 잘못 구성된 경우
  • 응답 본문의 ApplicationHealthState에 대해 누락되거나 잘못된 값이 제공된 경우
  • 유예 기간이 만료된 경우

알 수 없음 상태의 인스턴스는 비정상 인스턴스와 유사하게 처리됩니다. 사용하도록 설정하면 알 수 없음 인스턴스에서 인스턴스 복구가 수행되고 인스턴스가 정상 상태로 돌아갈 때까지 롤링 업그레이드가 일시 중지됩니다.

다음 표는 롤링 업그레이드인스턴스 복구에 대한 상태 해석을 보여 줍니다.

성능 상태 롤링 업그레이드 해석 인스턴스 복구 트리거
초기화 중 상태가 정상, 비정상 또는 알 수 없음이 될 때까지 기다립니다. 아니요
정상 정상 아니요
비정상 비정상
Unknown 비정상

이진 성능 상태에 대한 확장 스키마

애플리케이션 상태 확장에 대한 스키마를 보여 주는 JSON은 다음과 같습니다. 확장을 사용하려면 적어도 각각 연결된 포트 또는 요청 경로가 있는 “tcp”, “http” 또는 “https” 요청이 필요합니다.

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "1.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
} 

속성 값

이름 값/예제 데이터 형식
apiVersion 2018-10-01 날짜
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux(Linux), ApplicationHealthWindows(Windows) string
typeHandlerVersion 1.0 string

설정

이름 값/예제 데이터 형식
프로토콜 http 또는 https 또는 tcp string
port 프로토콜이 http 또는 https인 경우 선택 사항이고 프로토콜이 tcp면 필수 사항입니다. int
requestPath 프로토콜이 http 또는 https인 경우 필수 사항이고 프로토콜이 tcp면 허용되지 않습니다. string
intervalInSeconds (선택 사항) 기본값은 5초입니다. 각 상태 프로브 사이의 간격입니다. 예를 들어 intervalInSeconds == 5인 경우 프로브는 5초마다 한 번씩 로컬 애플리케이션 엔드포인트로 전송됩니다. int
numberOfProbes (선택 사항) 기본값은 1입니다. 성능 상태를 변경하는 데 필요한 연속 프로브 수입니다. 예를 들어 numberOfProbles == 3인 경우 성능 상태를 "비정상"에서 "정상" 상태로 변경하려면 "정상" 신호 3개가 연속으로 있어야 합니다. 성능 상태를 "비정상" 상태로 변경하는 경우에도 동일한 요구 사항을 충족해야 합니다. int

리치 성능 상태에 대한 확장 스키마

다음 JSON은 리치 성능 상태 확장에 대한 스키마를 보여 줍니다. 확장을 사용하려면 적어도 각각 연결된 포트 또는 요청 경로가 있는 "http" 또는 "https" 요청이 필요합니다. TCP 프로브도 지원되지만 프로브 응답 본문을 통해 ApplicationHealthState를 설정할 수 없으며 알 수 없음 상태에 액세스할 수 없습니다.

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "2.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1,
            "gracePeriod": 600
          }
        }
      }
    ]
  }
} 

속성 값

이름 값/예제 데이터 형식
apiVersion 2018-10-01 날짜
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux(Linux), ApplicationHealthWindows(Windows) string
typeHandlerVersion 2.0 string

설정

이름 값/예제 데이터 형식
프로토콜 http 또는 https 또는 tcp string
port 프로토콜이 http 또는 https인 경우 선택 사항이고 프로토콜이 tcp면 필수 사항입니다. int
requestPath 프로토콜이 http 또는 https인 경우 필수 사항이고 프로토콜이 tcp면 허용되지 않습니다. string
intervalInSeconds (선택 사항) 기본값은 5초입니다. 각 상태 프로브 사이의 간격입니다. 예를 들어 intervalInSeconds == 5인 경우 프로브는 5초마다 한 번씩 로컬 애플리케이션 엔드포인트로 전송됩니다. int
numberOfProbes (선택 사항) 기본값은 1입니다. 성능 상태를 변경하는 데 필요한 연속 프로브 수입니다. 예를 들어 numberOfProbles == 3인 경우 상태를 "비정상"/"알 수 없음"에서 "정상" 상태로 변경하려면 "정상" 신호 3개가 연속으로 있어야 합니다. 성능 상태를 "비정상" 또는 "알 수 없음" 상태로 변경하는 경우에도 동일한 요구 사항을 충족해야 합니다. int
gracePeriod 선택 사항, 기본값 = intervalInSeconds * numberOfProbes; 최대 유예 기간은 7200초입니다. int

애플리케이션 상태 확장 배포

다음 예에 자세히 설명된 대로 확장 집합에 애플리케이션 상태 확장을 배포하는 방법에는 여러 가지가 있습니다.

이진 성능 상태

다음 예제에서는 Windows 기반 확장 집합의 확장 집합 모델에서 myHealthExtension이라는 애플리케이션 상태 확장을 extensionProfile에 추가합니다.

이 예를 사용하면 PUT 대신 PATCH 호출을 수행하여 기존 확장을 리치 성능 상태에서 이진 성능 상태로 변경할 수도 있습니다.

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>", 
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "1.0",
    "settings": {
      "protocol": "<protocol>",
      "port": <port>,
      "requestPath": "</requestPath>"
    }
  }
}

이미 배포된 확장을 편집하려면 PATCH를 사용합니다.

VM을 업그레이드하여 확장을 설치합니다.

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

리치 성능 상태

다음 예에서는 Windows 기반 확장 집합의 확장 집합 모델에 있는 extensionProfile애플리케이션 상태 - 리치 상태 확장(myHealthExtension으로 이름 지정)을 추가합니다.

이 예를 사용하면 PUT 대신 PATCH 호출을 수행하여 기존 확장을 이진에서 리치 성능 상태로 업그레이드할 수도 있습니다.

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>",
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "2.0",
    "settings": {
      "protocol": "<protocol>",
      "port": <port>,
      "requestPath": "</requestPath>",
      "intervalInSeconds": <intervalInSeconds>,
      "numberOfProbes": <numberOfProbes>,
      "gracePeriod": <gracePeriod>
    }
  }
}

이미 배포된 확장을 편집하려면 PATCH를 사용합니다.

VM을 업그레이드하여 확장을 설치합니다.

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

문제 해결

VMHealth 보기 - 단일 인스턴스

Get-AzVmssVM 
  -InstanceView `
  -ResourceGroupName <rgName> `
  -VMScaleSetName <vmssName> `
  -InstanceId <instanceId> 

VMHealth 보기 - 일괄 처리 호출

이는 균일한 오케스트레이션을 사용하는 Virtual Machine Scale Sets에만 사용할 수 있습니다.

GET on `/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachineScaleSets/<vmssName>/virtualMachines/?api-version=2022-03-01&$expand=instanceview`

성능 상태가 표시되지 않음

Azure Portal 또는 GET 호출을 통해 성능 상태가 표시되지 않으면 VM이 최신 모델로 업그레이드되었는지 확인합니다. VM이 최신 모델이 아닌 경우 VM을 업그레이드하면 상태가 표시됩니다.

확장 실행 출력 로그

확장 실행 출력은 다음 디렉터리에 있는 파일에 기록됩니다.

C:\WindowsAzure\Logs\Plugins\Microsoft.ManagedServices.ApplicationHealthWindows\<version>\
/var/lib/waagent/Microsoft.ManagedServices.ApplicationHealthLinux-<extension_version>/status
/var/log/azure/applicationhealth-extension

또한 로그는 정기적으로 애플리케이션 상태를 캡처합니다.

다음 단계

Virtual Machine Scale Sets에 애플리케이션을 배포하는 방법에 대해 알아봅니다.