작업 명세의 check_restart 블록

작업 명세의 check_restart 블록 (check_restart block in the job specification)

| 배치 | job -> group -> task -> service -> **check_restart** | | | job -> group -> task -> service -> check -> **check_restart** | | | | | | |

check_restart 블록은 Nomad에게 비정상 서비스 체크가 있는 태스크를 언제 재시작할지 지시해요. Nomad 또는 Consul의 헬스 체크가 check_restart 블록에 지정된 limit 동안 비정상이면, 태스크 그룹의 restart 정책에 따라 재시작돼요. check_restart 설정은 check에 적용되지만, 서비스의 모든 체크에 적용하도록 service에도 배치할 수 있어요. check_restart가 check와 service 모두에 설정되면 블록은 병합되며 check 값이 우선해요.

job "mysql" {
  group "mysqld" {

    restart {
      attempts = 3
      delay    = "10s"
      interval = "10m"
      mode     = "fail"
    }

    task "server" {
      service {
        tags = ["leader", "mysql"]

        port = "db"

        check {
          type     = "tcp"
          port     = "db"
          interval = "10s"
          timeout  = "2s"
        }

        check {
          type     = "script"
          name     = "check_table"
          command  = "/usr/local/bin/check_mysql_table_status"
          args     = ["--verbose"]
          interval = "60s"
          timeout  = "5s"

          check_restart {
            limit = 3
            grace = "90s"
            ignore_warnings = false
          }
        }
      }
    }
  }
}

출처: 문서

본문

  • limit (int: 0) — 헬스 체크가 limit번 실패하면 태스크를 재시작해요. 예를 들어 1은 첫 번째 실패 시 재시작하게 해요. 기본값 0은 헬스 체크 기반 재시작을 비활성화해요. 실패는 연속적이어야 해요. 단일 통과 체크가 횟수를 재설정하므로, 깜빡이는(flapping) 서비스는 재시작되지 않을 수 있어요.

  • grace (string: "1s") — 태스크가 시작되거나 재시작된 후 그 상태를 확인하기 전에 기다리는 지속 시간.

  • ignore_warnings (bool: false) — 기본적으로 critical과 warning 상태가 모두 있는 체크는 비정상으로 간주돼요. ignore_warnings = true로 설정하면 warning 상태를 passing처럼 취급하며 재시작을 트리거하지 않아요. Consul 서비스 제공자에서만 사용 가능해요.

예제 동작 (Example behavior)

위의 mysql 예제를 사용하면 다음과 같은 동작이 있어요:

check_restart {
  # ...
  grace = "90s"
  # ...
}

server 태스크가 처음 시작되어 Consul에 등록되면, 그 상태는 90초 동안 확인되지 않아요. 이는 서버가 시작할 시간을 주기 위함이에요.

check_restart {
  limit = 3
  # ...
}

유예 기간 후 스크립트 체크가 실패하면, 재시작이 트리거되기 전에 통과할 시간은 180초(60s interval * 3 limit)예요. 재시작이 트리거되면 태스크 그룹의 restart 정책이 제어를 맡아요:

restart {
  # ...
  delay    = "10s"
  # ...
}

restart 블록은 태스크의 재시작 동작을 제어해요. 이 경우 태스크를 중지한 다음 다시 시작하기 전에 10초를 기다려요.

태스크가 재시작되면 Nomad는 태스크의 상태를 확인하기 시작하기 전에 다시 grace 기간을 기다려요.

restart {
  attempts = 3
  # ...
  interval = "10m"
  mode     = "fail"
}

체크가 계속 실패하면 태스크는 interval 내에서 attempts 횟수까지 재시작돼요. limit 내에서 restart 시도에 도달하면 mode가 동작을 제어해요. 이 경우 태스크는 실패하고 더 이상 재시작되지 않아요. 자세한 내용은 restart 블록을 참조하세요.

더 알아보기 (Learn more)