작업 만들고 제출하기
작업 만들고 제출하기 (Create and submit a job)
노마드에서 작업(job)과 그 모든 요구사항의 설명은 "job file"이라는 단일 파일에 유지돼요. 이 job file은 로컬 디스크에 존재하며, job file을 소스 컨트롤에 커밋하는 것을 강력히 권장해요.
노마드에서 작업을 제출하는 일반적인 흐름은 다음과 같아요:
- 작업 명세(job specification)에 따라 job file 작성
- 노마드 서버로 변경사항 계획(plan)하고 검토
- job file을 노마드 서버에 제출
- (선택 사항) 작업 상태와 로그 검토
시작할 수 있는 매우 기본적인 예시가 여기 있어요.
출처: 문서
본문
job file 작성하기
노마드는 작업 명세에서 쉬움과 표현력 사이의 균형을 잡으려 해요. 노마드는 또한 샘플 job file을 생성하는 nomad init 명령도 제공해요. 노마드 작업 명세에 대한 더 자세한 정보는 노마드 문서를 참고해 주세요.
다음은 작은 docker 컨테이너 웹 서버를 실행하는 샘플 job file이에요.
job "docs" {
datacenters = ["dc1"]
group "example" {
network {
port "http" {
static = "5678"
}
}
task "server" {
driver = "docker"
config {
image = "hashicorp/http-echo"
ports = ["http"]
args = [
"-listen",
":5678",
"-text",
"hello world",
]
}
}
}
}
이 job file은 로컬 워크스테이션에 일반 텍스트로 존재해요. 이 job file이 마음에 들면 스케줄러 결정을 계획하고 검토할 거예요. 특히 팀에서 작업하고 있다면 job file을 소스 컨트롤에 커밋하는 것이 일반적으로 모범 사례예요.
작업 계획하기
job file을 작성했다면 노마드가 실행할 때 만들 변경사항을 미리 보려 할 거예요. nomad job plan 명령은 스케줄러의 드라이 런(dry-run)을 호출하고 어떤 스케줄링 결정이 이루어질지 출력해요.
$ nomad job plan docs.nomad.hcl
+ Job: "docs"
+ Task Group: "example" (1 create)
+ Task: "server" (forces create)
Scheduler dry-run:
- All tasks successfully allocated.
Job Modify Index: 0
To submit the job with version verification run:
nomad job run -check-index 0 docs.nomad.hcl
When running the job with the check-index flag, the job will only be run if the
job modify index given matches the server-side version. If the index has
changed, another user has modified the job and the plan's results are
potentially invalid.
옵션 없이 드라이 런만 실행됐을 뿐 어떤 조치도 취하지 않았다는 점을 유의하세요. 이 작업은 실행되지 않고 있으며, 완전한 드라이 런이며 어떤 할당도 발생하지 않았어요.
작업 제출하기
계획의 출력이 수용 가능하다고 가정하고, 이제 노마드에 작업을 실행하도록 요청해요. 이는 nomad job run 명령으로 수행돼요. 계획 명령이 제공한 modify index를 선택적으로 제공해 계획과 지금 사이에 이 작업에 어떤 변경도 발생하지 않았음을 보장할 수 있어요.
$ nomad job run docs.nomad.hcl
==> Monitoring evaluation "0d159869"
Evaluation triggered by job "docs"
Allocation "5cbf23a1" created: node "1e1aa1e0", group "example"
Evaluation status changed: "pending" -> "complete"
==> Evaluation "0d159869" finished with status "complete"
이제 작업이 스케줄링되었으니 실행 중일 수도 아닐 수도 있어요. 작업이 올바르게 시작되었는지 확인하려면 할당 상태와 로그를 검사해야 해요. 다음 섹션의 inspect state는 이 작업의 상태를 검사하는 방법을 자세히 설명해요.
작업 업데이트 및 계획
작업을 업데이트할 때는 항상 plan 명령을 먼저 실행한 뒤 run 명령을 실행하는 것이 좋아요. 예를 들어:
@@ -2,6 +2,8 @@ job "docs" {
datacenters = ["dc1"]
group "example" {
+ count = "2"
+
task "server" {
driver = "docker"
이 변경사항을 디스크에 저장한 뒤 nomad job plan 명령을 실행해요:
$ nomad job plan docs.nomad.hcl
+/- Job: "docs"
+/- Task Group: "example" (1 create, 1 in-place update)
+/- Count: "1" => "2" (forces create)
Task: "server"
Scheduler dry-run:
- All tasks successfully allocated.
Job Modify Index: 131
To submit the job with version verification run:
nomad job run -check-index 131 docs.nomad.hcl
When running the job with the check-index flag, the job will only be run if the
job modify index given matches the server-side version. If the index has
changed, another user has modified the job and the plan's results are
potentially invalid.
예약된 포트 충돌 (Reserved port collisions)
이 작업은 정적 포트를 사용하므로 노마드 클러스터에 있는 클라이언트 수에 따라 일부 인스턴스를 배치할 수 없을 수도 있어요. 계획 출력에 다음이 포함되어 있다면:
Dimension "network: reserved port collision" exhausted on x nodes
이는 클러스터의 모든 실행 가능한 클라이언트가 요청된 포트에 이미 또는 앞으로 무언가를 배치하여, 일부 할당이 실행할 공간이 없다는 것을 나타내요. 이를 해결하려면 요청된 count를 줄이거나, 클라이언트를 추가하거나, 작업 명세에서 정적 포트를 동적 포트로 전환해야 해요.
작업 실행하기
이제 출력이 괜찮다고 가정하고 nomad job run 명령을 실행해요. -check-index 파라미터를 포함하면 plan과 run 단계 사이에 작업이 변경되지 않았음을 보장해요.
$ nomad job run -check-index 131 docs.nomad.hcl
==> Monitoring evaluation "42d788a3"
Evaluation triggered by job "docs"
Allocation "e7b8d4f5" created: node "012ea79b", group "example"
Allocation "5cbf23a1" modified: node "1e1aa1e0", group "example"
Evaluation status changed: "pending" -> "complete"
==> Evaluation "42d788a3" finished with status "complete"
카나리(canary) 빌드와 빌드-그린(build-green) 배포 같은 고급 작업 업데이트 전략에 대한 자세한 내용은 작업 업데이트 전략 문서를 참고해 주세요.