다음을 통해 공유


Azure Container Apps의 상태 프로브

Azure Container Apps 상태 프로브를 사용하면 Container Apps 런타임에서 컨테이너 앱의 상태를 정기적으로 검사할 수 있습니다.

TCP 또는 HTTP(S)를 단독으로 사용하여 프로브를 설정할 수 있습니다.

Container Apps는 다음 프로브를 지원합니다.

프로브 설명
Startup 클래스 애플리케이션이 성공적으로 시작되었는지 확인합니다. 이 검사는 활동성 프로브와는 별개이며 애플리케이션의 초기 시작 단계에서 실행됩니다.
활동성 애플리케이션이 여전히 실행 중이고 응답성이 있는지 확인합니다.
준비 복제본이 들어오는 요청을 처리할 준비가 되었는지 확인합니다.

Azure Container Apps에서 지원되는 프로프 사양의 전체 목록은 Azure REST API 사양을 참조하세요.

HTTP 프로브

HTTP 프로브를 사용하면 정상 상태를 보고하기 전에 애플리케이션 종속성의 상태를 확인하는 사용자 지정 논리를 구현할 수 있습니다.

성공 여부를 나타내기 위해 HTTP 상태 코드가 200보다 크거나 같고 400보다 작은 HTTP 상태 코드로 응답하도록 상태 프로브 엔드포인트를 구성합니다. 이 범위를 벗어나는 다른 응답 코드는 오류를 나타냅니다.

다음 예제에서는 JavaScript에서 활동성 엔드포인트를 구현하는 방법을 보여 줍니다.

const express = require('express');
const app = express();

app.get('/liveness', (req, res) => {
  let isSystemStable = false;
  
  // check for database availability
  // check filesystem structure
  //  etc.

  // set isSystemStable to true if all checks pass

  if (isSystemStable) {
    res.status(200); // Success
  } else {
    res.status(503); // Service unavailable
  }
})

TCP 프로브

TCP 프로브는 서버와의 연결이 설정될 때까지 대기하여 성공을 나타냅니다. 애플리케이션에 대한 연결을 설정할 수 없는 경우 프로브가 실패합니다.

제한 사항

  • 컨테이너당 각 프로브 유형 중 하나만 추가할 수 있습니다.
  • exec 프로브는 지원되지 않습니다.
  • 포트 값은 정수여야 하며, 명명된 포트는 지원되지 않습니다.
  • gRPC는 지원되지 않습니다.

예제

다음 코드 목록에서는 컨테이너에 대한 상태 프로브를 정의하는 방법을 보여 줍니다.

... 자리 표시자는 생략된 코드를 나타냅니다. 전체 ARM 템플릿 세부 정보는 Container Apps ARM 템플릿 API 사양을 참조하세요.

{
  ...
  "containers":[
    {
      "image":"nginx",
      "name":"web",
      "probes": [
        {
          "type": "liveness",
          "httpGet": {
            "path": "/health",
            "port": 8080,
            "httpHeaders": [
              {
                "name": "Custom-Header",
                "value": "liveness probe"
              }]
          },
          "initialDelaySeconds": 7,
          "periodSeconds": 3
        },
        {
          "type": "readiness",
          "tcpSocket": {
            "port": 8081
          },
          "initialDelaySeconds": 10,
          "periodSeconds": 3
        },
        {
          "type": "startup",
          "httpGet": {
            "path": "/startup",
            "port": 8080,
            "httpHeaders": [
              {
                "name": "Custom-Header",
                "value": "startup probe"
              }]
          },
          "initialDelaySeconds": 3,
          "periodSeconds": 3
        }]
    }]
  ...
}

선택적 failureThreshold 설정은 실행이 실패할 경우 Container Apps가 프로브 실행을 시도하는 횟수를 정의합니다. failureThreshold 양을 초과하는 시도는 각 프로브 형식에 대해 서로 다른 결과를 초래합니다.

기본 구성

수신을 사용하도록 설정하면 각 형식에 대해 정의되지 않은 경우 다음 기본 프로브가 주 앱 컨테이너에 자동으로 추가됩니다.

프로브 유형 기본값
Startup 클래스 프로토콜: TCP
포트: 수신 대상 포트
시간 제한: 3초
기간: 1초
초기 지연 시간: 1초
성공 임계값: 1
실패 임계값: 240
활동성 프로토콜: TCP
포트: 수신 대상 포트
준비 프로토콜: TCP
포트: 수신 대상 포트
시간 제한: 5초
기간: 5초
초기 지연 시간: 3초
성공 임계값: 1
실패 임계값: 48

여러 수정 모드에서 컨테이너 앱을 실행하는 경우 수정 버전을 배포한 후 해당 수정 버전으로 트래픽을 이동하기 전에 준비 상태 프로브가 성공을 나타낼 때까지 기다립니다. 단일 수정 모드에서는 준비 상태 프로브가 성공적인 상태를 반환하면 트래픽이 자동으로 이동됩니다.

수정 버전의 다른 모든 복제본이 정상이더라도 해당 복제본이 준비 상태 프로브 검사에 실패하면 수정 상태가 비정상 상태로 표시됩니다. Container Apps는 다시 정상 상태가 되거나 실패 임계값을 초과할 때까지 해당 복제본을 다시 시작합니다. 실패 임계값을 초과하는 경우 수정 버전을 다시 시작해 보십시오. 그러나 수정 버전이 올바르게 구성되지 않았다는 의미일 수 있습니다.

Java에서 일반적인 앱 시작 시간이 길어지는 상황에서는 컨테이너가 충돌하지 않도록 프로브를 사용자 지정해야 하는 경우가 많습니다.

다음 예제에서는 시작 시간을 연장하기 위해 활동성 및 준비 상태 프로브를 구성하는 방법을 보여 줍니다.

"probes": [
       {
        "type": "liveness",
        "failureThreshold": 3,
        "periodSeconds": 10,
        "successThreshold": 1,
        "tcpSocket": {
          "port": 80
        },
        "timeoutSeconds": 1
       },
       {
         "type": "readiness",
         "failureThreshold": 48,
         "initialDelaySeconds": 3,
         "periodSeconds": 5,
         "successThreshold": 1,
         "tcpSocket": {
           "port": 80
          },
          "timeoutSeconds": 5
       }]

다음 단계