잡 스펙의 `group` 블록

잡 스펙의 group 블록

group 블록은 같은 Nomad 클라이언트에 함께 배치(co-located)되어야 하는 일련의 태스크를 정의해요. 그룹 안의 어떤 태스크든 같은 클라이언트에 배치돼요.

출처: 문서

본문

배치 job -> **group**
job "docs" {
  group "example" {
    # ...
  }
}

매개변수 (Parameters)

  • constraint ([Constraint]: nil) - 추가 제약 조건을 정의하기 위해 여러 번 제공할 수 있어요.

  • affinity ([Affinity]: nil) - 선호하는 배치 기준을 정의하기 위해 여러 번 제공할 수 있어요.

  • spread ([Spread]: nil) - 노드 속성 또는 메타데이터 전반에 걸쳐 할당을 분산하는 기준을 정의하기 위해 여러 번 제공할 수 있어요. 자세한 내용은 Nomad spread 레퍼런스를 참고하세요.

  • count (int) - 이 그룹 아래 실행되어야 하는 인스턴스 수. 이 값은 음수가 아니어야 해요. 기본값은 scaling 블록에 지정된 min 값이고, 없으면 1이에요.

  • consul ([Consul]: nil) - 그룹에 특화된 Consul 설정 옵션. 태스크가 자체 consul 블록을 갖고 있지 않는 한 이 옵션은 그룹의 모든 태스크와 서비스에 적용돼요.

  • ephemeral_disk ([EphemeralDisk]: nil) - 그룹의 임시 디스크 요구 사항. 임시 디스크는 sticky로 표시할 수 있고 라이브 데이터 마이그레이션을 지원해요.

  • disconnect ([disconnect]: nil) - 네트워크 분할이 발생했을 때 이 그룹의 모든 태스크에 대해 서버와 클라이언트의 disconnect 전략을 지정해요. 클라이언트가 연결을 끊으면 태스크는 연결되지 않은 채로 두거나, 중지하거나, 교체할 수 있어요. 클라이언트가 연결을 되찾은 경우의 재조정 정책도 여기 지정돼요.

  • max_run_duration (string: "") - 이 그룹의 각 할당이 실행될 수 있는 최대 기간. batch와 sysbatch 잡에서만 유효해요. 이 기간을 초과하면 그룹의 모든 태스크가 종료되고 할당이 클라이언트 설명 allocation exceeded max_run_duration과 함께 complete로 표시돼요.

타이머는 개별 태스크 상태와 무관하게 클라이언트에서 할당이 생성되는 즉시 시작돼요. 따라서 구성된 타임아웃보다 시작에 더 오래 걸리는 태스크도 종료돼요 — 이미지나 아티팩트 다운로드를 끝내지 못한 할당도 포함이에요.

prestart와 poststart 라이프사이클 태스크 실행 시간은 max_run_duration에 포함돼요. 이 타임아웃으로 할당이 중지되면 poststop 태스크는 시작되지 않아요.

태스크 재시작은 타이머를 초기화하지 않아요 — 데드라인이 정해지면 잡 업데이트에서 max_run_duration 자체가 바뀌지 않는 한 다시 계산되지 않아요. 따라서 모든 재시작 시도는 같은 예산에서 시간을 소비해요. Nomad 클라이언트 프로세스가 카운트다운 도중 재시작되면, 각 태스크 러너의 보존된 StartedAt 타임스탬프에서 원래 데드라인이 재구성되어 남은 예산이 초기화되는 대신 존중돼요.

타임아웃이 발생하면 할당은 failed가 아니라 complete로 표시되므로 그룹의 reschedule 정책이 트리거되지 않아요. 할당이 독립적인 이유로 재스케줄링되면(예: 타임아웃 전 노드 실패), 교체 할당은 0부터 자체 max_run_duration 타이머를 시작해요.

  • meta ([Meta]: nil) - 사용자 정의 메타데이터로 주석을 다는 키-값 맵.

  • migrate ([Migrate]: nil) - 드레이닝 중인 노드에서 마이그레이션하는 그룹 전략. count가 1보다 큰 서비스 잡만 migrate 블록을 지원해요.

  • network ([Network]: <optional>) - 그룹의 네트워크 요구 사항과 설정(정적·동적 포트 할당 포함).

  • reschedule ([Reschedule]: nil) - 재스케줄링 전략을 지정할 수 있게 해요. 그룹 할당 상태 중 하나가 "failed"가 되면 Nomad가 다른 노드에 태스크를 스케줄링하려고 시도해요.

  • restart ([Restart]: nil) - 이 그룹의 모든 태스크 재시작 정책. 생략하면 잡 타입별 기본 정책이 있으며, restart 블록 문서에서 찾을 수 있어요.

  • service ([Service]: nil) - Nomad 또는 Consul과의 서비스 디스커버리 통합. Nomad는 할당이 시작될 때 각 서비스를 자동으로 등록하고, 할당이 파괴될 때 등록을 해제해요.

  • shutdown_delay (string: "0s") - 그룹 태스크를 중지할 때 기다리는 시간. 이 지연은 Consul 또는 Nomad 서비스 등록 해제와 각 태스크에 종료 신호를 보내는 사이에 발생해요. 이상적으로는 서비스가 종료 신호를 받으면 헬스 체크에 실패해야 해요. 반대로 shutdown_delay는 종료 전에 진행 중인 요청이 완료될 시간을 주기 위해 설정할 수도 있어요. 그룹 레벨 shutdown_delay는 그룹 서비스가 정의되어 있는지와 무관하게 실행되고, 이 서비스에만 적용돼요. 또한 태스크는 태스크 서비스 등록 해제와 태스크 중지 사이에 기다리는 자체 shutdown_delay를 가질 수 있어요.

  • task ([Task]: <required>) - 이 그룹 안에서 실행할 태스크 하나 이상. 그룹의 일부로 태스크를 추가하기 위해 여러 번 지정할 수 있어요.

  • update ([Update]: nil) - 태스크의 업데이트 전략. 생략하면 기본 업데이트 전략이 적용돼요.

  • vault ([Vault]: nil) - 이 그룹의 모든 태스크가 필요로 하는 Vault 정책 묶음. job 레벨에 설정된 vault 블록을 덮어써요.

  • volume ([Volume]: nil) - 그룹 안의 태스크가 필요로 하는 볼륨.

예시 (Examples)

다음 예시는 group 블록만 보여줘요. group 블록은 위에 나열된 배치에서만 유효하다는 점을 기억하세요.

count 지정 (Specifying Count)

이 예시는 이 그룹 안의 태스크 인스턴스 5개가 실행되어야 함을 지정해요:

group "example" {
  count = 5
}

제약 조건이 있는 태스크 (Tasks with constraint)

이 예시는 그룹에 제약 조건이 있는 두 개의 축약된 태스크를 보여줘요. 태스크를 64비트 운영체제로 제한해요.

group "example" {
  constraint {
    attribute = "${attr.cpu.arch}"
    value     = "amd64"
  }

  task "cache" {
    # ...
  }

  task "server" {
    # ...
  }
}

메타데이터 (Metadata)

이 예시는 그룹에 임의의 사용자 정의 메타데이터를 보여줘요:

group "example" {
  meta {
    my-key = "my-value"
  }
}

네트워크 (Network)

이 예시는 bridge 네트워킹 모드를 사용하고 두 포트를 동적으로, 한 포트를 정적으로 할당하는 network 블록의 네트워크 제약 조건을 보여줘요:

group "example" {
  network {
    mode = "bridge"
    port "http" {}
    port "https" {}
    port "lb" {
      static = "8889"
    }
  }
}

서비스 디스커버리 (Service discovery)

이 예시는 Consul에 서비스를 만들어요. Nomad에서 서비스 디스커버리에 대해 더 읽으려면 Nomad 서비스 디스커버리 문서를 참고하세요.

group "example" {
  network {
    port "api" {}
  }

  service {
    name = "example"
    port = "api"
    tags = ["default"]

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

  task "api" { ... }
}

더 알아보기 (Learn more)