태스크 종속성 구성하기
태스크 종속성 구성하기 (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)
lifecycle스탠자service스탠자- Consul 서비스 정의
- Consul DNS 인터페이스