태스크 종속성 구성하기

태스크 종속성 구성하기 (Configure task dependencies)

Nomad 태스크 종속성은 prestart 태스크를 정의하는 기능을 제공해요.

Prestart 태스크에는 init 태스크와 사이드카 태스크라는 두 가지 패턴이 있어요. init 태스크는 메인 워크로드가 시작되기 전에 완료까지 실행되어야 하는 태스크예요. 주로 에셋을 다운로드하거나 추출-변환-적재(ETL) 작업에 필요한 테이블을 만드는 데 사용돼요. 사이드카 태스크는 메인 워크로드가 시작되기 전에 시작되어 메인 워크로드의 수명 동안 실행돼요. 일반적인 사이드카 태스크로는 로그 포워더, 프록시, 플랫폼 추상화가 있어요. 이 튜토리얼은 init 태스크를 보여줘요.

다음과 같이 hook을 prestart로, sidecar를 false로 설정한 lifecycle 스탠자를 추가해 init 태스크를 만들 수 있어요.

      lifecycle {
        hook    = "prestart"
        sidecar = false
      }

하나 이상의 init 태스크를 사용해 조건이 충족될 때까지 작업의 메인 태스크 실행을 지연시킴으로써 복잡한 작업 종속성 트리를 모델링할 수 있어요. 이 경우 서비스가 Consul에 사용 가능하고 광고될 때까지요.

이 튜토리얼에서는 여러 Nomad 객체로 작업해요:

  • mock-app — 두 태스크를 포함하는 작업 파일
    • await-mock-service — "mock-service"라는 서비스가 Consul DNS API를 통해 광고될 때까지 무한정 대기하는 init 태스크. 발견되면 성공적으로 종료해요.
    • mock-app-container — "mock-service" 서비스에 의존하는 메인 워크로드 태스크
  • mock-service — "mock-service"라는 서비스를 광고하는 태스크 하나를 포함하는 작업. 편의를 위해 Nomad 작업으로 제공되지만, CLI나 API처럼 Consul에 "mock-service"라는 서비스를 등록하는 어떤 수단으로도 대체할 수 있어요.

이 가이드에서 다음 작업을 완료해요:

  • "mock-app" 작업 배포
  • "mock-app-container" 태스크가 pending 상태로 시작되지 않은 상태로 유지되는지 확인
  • "mock-service" 작업 시작
  • "await-mock-service" 컨테이너가 성공적으로 완료되고 "mock-app-container" 태스크가 시작되는지 확인

출처: 문서

본문

전제 조건 (Prerequisites)

이 튜토리얼을 완료하려면 다음이 필요해요:

  • Nomad 클러스터와 최소한 하나의 Consul 서버
  • Nomad v0.11.0 이상

기존 Nomad 클러스터가 없다면 Nomad 설치 가이드로 배포하는 방법을 배울 수 있어요. 마찬가지로 기존 Consul 데이터센터가 없다면 Consul 설치 가이드로 Consul을 배포하는 방법을 배울 수 있어요.

mock-app 작업 파일 만들기 (Create the mock-app job file)

이 예제는 config 스탠자의 루핑 스크립트를 사용해 서비스 페이로드를 모킹해요.

다음 내용으로 mock-app.nomad.hcl이라는 HCL 파일을 만들어요.

job "mock-app" {
  datacenters = ["dc1"]
  type        = "service"

  group "mock-app" {
    # disable deployments
    update {
      max_parallel = 0
    }

    task "await-mock-service" {
      driver = "docker"

      config {
        image        = "busybox:1.28"
        command      = "sh"
        args         = ["-c", "echo -n 'Waiting for service'; until nslookup mock-service.service.consul 2>&1 >/dev/null; do echo '.'; sleep 2; done"]
        network_mode = "host"
      }

      resources {
        cpu    = 200
        memory = 128
      }

      lifecycle {
        hook    = "prestart"
        sidecar = false
      }
    }

    task "mock-app-container" {
      driver = "docker"

      config {
        image   = "busybox"
        command = "sh"
        args    = ["-c", "echo The app is running! && sleep 3600"]
      }

      resources {
        cpu    = 200
        memory = 128
      }
    }
  }
}

작업은 "await-mock-service"와 "mock-app"이라는 두 태스크를 포함해요. "await-mock-service" 태스크는 "mock-service" 서비스가 Consul에 광고될 때까지 busy-wait하도록 구성돼요. 이 가이드의 경우 이는 mock-service.nomad.hcl 작업을 실행할 때까지 일어나지 않아요. 더 현실적인 경우에는 Consul에 자신을 광고하는 어떤 서비스 종속성이 될 수 있어요.

더 많은 await 스타일 워크로드를 포함해 이 패턴을 사용해 더 복잡한 서비스 종속성 체인을 모델링할 수 있어요.

이름 해석이 올바르게 작동하는지 확인하기 (Ensure that name resolution works properly)

"await-mock-service" 태스크가 Docker 컨테이너 안에서 nslookup을 사용하므로, 컨테이너가 Consul DNS API 엔드포인트에 대해 조회를 수행할 수 있는지 확인해야 해요. 이 튜토리얼은 컨테이너가 Nomad 클라이언트 노드의 DNS 해석 경로를 사용할 수 있도록 network_mode = host를 사용해요.

nslookup 애플리케이션은 표준 DNS 포트(53)에서만 조회를 수행해요. 포트 53에서 Consul DNS API 포트(기본 8600)로 요청을 전달하는 애플리케이션을 사용해야 할 수도 있어요. 이 포워딩을 수행하는 여러 방법은 DNS 전달 Learn 가이드에서 배울 수 있어요.

mock-app.nomad.hcl 파일의 "await-mock-service" 태스크의 config 스탠자에 dns_servers 값을 추가해 위 기준을 충족하는 DNS 서버로 조회를 직접 보낼 수도 있어요.

mock-app 작업 실행하기 (Run the mock-app job)

nomad run mock-app.nomad.hcl을 실행해요.

$ nomad run mock-app.nomad.hcl

작업이 실행되고 출력에서 할당 ID를 제공해요.

$ nomad run mock-app.nomad.hcl
==> Monitoring evaluation "01c73d5a"
    Evaluation triggered by job "mock-app"
    Allocation "3044dda0" created: node "f26809e6", group "mock-app"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "01c73d5a" finished with status "complete"

mock-app-container가 pending인지 확인하기 (Verify mock-app-container is pending)

제공된 할당 ID로 nomad alloc status 명령을 실행해요.

$ nomad alloc status 3044dda0

nomad alloc status 명령은 리소스에 대한 유용한 정보를 제공해요. 이 가이드에서는 각 태스크의 상태에 집중해요. 각 태스크의 상태는 Task "await-mock-service" is "running" 같은 줄로 출력돼요.

$ nomad alloc status 3044dda0
ID                  = 3044dda0-8dc1-1bac-86ea-66a3557c67d3
Eval ID             = 01c73d5a
Name                = mock-app.mock-app[0]
Node ID             = f26809e6
Node Name           = nomad-client-2.node.consul
Job ID              = mock-app
Job Version         = 0
Client Status       = running
Client Description  = Tasks are running
Desired Status      = run
Desired Description = <none>
Created             = 43s ago
Modified            = 42s ago

Task "await-mock-service" (prestart) is "running"
Task Resources
CPU        Memory          Disk     Addresses
3/200 MHz  80 KiB/128 MiB  300 MiB

Task Events:
Started At     = 2020-03-18T17:07:26Z
Finished At    = N/A
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type        Description
2020-03-18T13:07:26-04:00  Started     Task started by client
2020-03-18T13:07:26-04:00  Task Setup  Building Task Directory
2020-03-18T13:07:26-04:00  Received    Task received by client

Task "mock-app-container" is "pending"
Task Resources
CPU      Memory   Disk     Addresses
200 MHz  128 MiB  300 MiB

Task Events:
Started At     = N/A
Finished At    = N/A
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type      Description
2020-03-18T13:07:26-04:00  Received  Task received by client

await-mock-service 태스크가 실행 중이고 "mock-app-container" 태스크가 pending이라는 점에 주목하세요. "mock-app-container" 태스크는 "await-mock-service" 태스크가 성공적으로 완료될 때까지 pending 상태로 유지돼요.

mock-service 작업 파일 만들기 (Create the mock-service job file)

다음 내용으로 mock-service.nomad.hcl이라는 파일을 만들어요.

job "mock-service" {
  datacenters = ["dc1"]
  type        = "service"

  group "mock-service" {
    task "mock-service" {
      driver = "docker"

      config {
        image   = "busybox"
        command = "sh"
        args    = ["-c", "echo The service is running! && while true; do sleep 2; done"]
      }

      resources {
        cpu    = 200
        memory = 128
      }

      service {
        name = "mock-service"
      }
    }
  }
}

이 작업은 Consul에서 "mock-service" 서비스를 광고해요. 실행되면 await-mock-service 태스크가 성공적으로 완료되고 "mock-app-container" 태스크가 시작됩니다.

mock-service 작업 시작하기 (Start mock-service job)

nomad run mock-service.nomad.hcl을 실행해요.

$ nomad run mock-service.nomad.hcl

Nomad가 작업을 시작하고 스케줄링 정보에 대한 정보를 반환해요.

$ nomad run mock-service.nomad
==> Monitoring evaluation "f31f8eb1"
    Evaluation triggered by job "mock-service"
    Allocation "d7767adf" created: node "f26809e6", group "mock-service"
    Evaluation within deployment: "3d86e09a"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "f31f8eb1" finished with status "complete"

mock-app-container가 실행 중인지 확인하기 (Verify mock-app-container is running)

마지막으로 태스크 상태를 확인하기 위해 nomad alloc status 명령의 출력을 다시 확인해요. "mock-app" 작업을 실행할 때의 할당 ID를 사용해요.

$ nomad alloc status 3044dda0

다시 "await-mock-service"와 "mock-app-container"의 태스크 상태 줄에 집중해요.

ID                  = 3044dda0-8dc1-1bac-86ea-66a3557c67d3
Eval ID             = 01c73d5a
Name                = mock-app.mock-app[0]
Node ID             = f26809e6
Node Name           = nomad-client-2.node.consul
Job ID              = mock-app
Job Version         = 0
Client Status       = running
Client Description  = Tasks are running
Desired Status      = run
Desired Description = <none>
Created             = 21m38s ago
Modified            = 7m27s ago

Task "await-mock-service" (prestart) is "dead"
Task Resources
CPU        Memory          Disk     Addresses
0/200 MHz  80 KiB/128 MiB  300 MiB

Task Events:
Started At     = 2020-03-18T17:07:26Z
Finished At    = 2020-03-18T17:21:35Z
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type        Description
2020-03-18T13:21:35-04:00  Terminated  Exit Code: 0
2020-03-18T13:07:26-04:00  Started     Task started by client
2020-03-18T13:07:26-04:00  Task Setup  Building Task Directory
2020-03-18T13:07:26-04:00  Received    Task received by client

Task "mock-app-container" is "running"
Task Resources
CPU        Memory          Disk     Addresses
0/200 MHz  32 KiB/128 MiB  300 MiB

Task Events:
Started At     = 2020-03-18T17:21:37Z
Finished At    = N/A
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type        Description
2020-03-18T13:21:37-04:00  Started     Task started by client
2020-03-18T13:21:35-04:00  Driver      Downloading image
2020-03-18T13:21:35-04:00  Task Setup  Building Task Directory
2020-03-18T13:07:26-04:00  Received    Task received by client

"await-mock-service" 태스크가 dead이고 "Recent Events" 표에서 "Exit Code: 0"으로 종료된 것을 주목하세요. 이는 성공적으로 완료되었음을 나타내요. "mock-app-container" 태스크는 이제 "running" 상태로 전환되어 컨테이너가 실행 중이에요.

다음 단계 (Next steps)

이 가이드를 완료했으므로 Nomad 태스크 종속성을 사용해 작업 간 종속성을 모델링하는 방법을 실험해 봤어요.

추가 자료 (Further reading)

더 알아보기 (Learn more)