Job 매니페스트에는 아래 세가지 주요 필드를 설정할 수 있다.

필드명 의미 비고
completions 성공 횟수 실행 중 변경 불가능
parallelism 병렬성 동시에 실행하고자 하는 잡 갯수. 실행 중 변경 가능
backoffLimit 실패 허용 횟수 0 지정시 실패를 허용하지 않음. 실행 중 변경 가능

 

이를 기반으로 전형적인 네 가지 워크로드를 Job 으로 실행해보자

 

1. 1회만 실행하는  태스크

completions 1
parallelism 1
backoffLimit 0

 

성공 유무와 관계없이(backoffLimit: 0) 1회만 실행된다.

 

2. N 개를 병렬로 M 번 성공시까지 실행하는 태스크

completions M
parallelism N
backoffLimit P

 

실패는 P번 까지 허용하며, 동시에 N개의 파드를 기동하여 잡을 실행하며, 성공 횟수가 M 번이 될 때 까지 실행한다. 주의할 점은, 남은 성공횟수가 N 이하인 경우 남은 성공횟수 만큼만의 파드만 기동한다는 점이다.

예를들어, completions: 5, parallelism: 3 을 지정하면 아래와 같은 순서로 진행된다.

  • 3개의 파드가 동시 실행된다.(병렬성 3)
  • 3개의 파드가 성공적으로 실행 완료된다.(목표 성공횟수 성공횟수 2/5)
  • 남은 성공 횟수가 2 이므로, 3개가 아닌 2개의 파드가 동시 실행된다.(즉, 동시 실행되는 파드의 수는 남은 성공횟수보다 클 수 없다.)

또한, parallelism 을 completions 이상으로 설정하더라도 마찬가지로 남은 성공횟수가 completions 가 되어버리기 때문에 결국에는 completions 갯수만큼의 파드가 기동된다.

 

3. N 개를 병렬로 실행하는 작업큐

위에서 말한 Task 잡은 일정 성공 횟수에 도달할 때 까지 파드 종료 -> 시작을 반복하며 진행한다. 하지만 성공 횟수가 정해지지 않고 메시지 큐에 쌓인 모든 Topic 을 처리할 때 까지 N 개의 병렬성을 가지고 N 개의 파드를 계속 유지하면서 작업을 처리해야 하는 경우가 있다. 이때는 아래처럼 설정한다.

completions 지정하지 않음
parallelism N
backoffLimit P

 

이렇게 Job 을 실행하면 N 개의 파드가 병렬로 실행된다. 그 중 하나라도 정상 종료되면 전체 Job 이 종료되게 되며 더이상의 추가 파드 실행은 없다. 당연히 이미 실행중인 파드는 자체적으로 작업이 종료될 때 까지 유지된다.

 

작업큐의 잡을 이용하려면 대상 작업을 쌓기 위한 메시지 큐를 따로 두어야 한다. Job 이 관리하는 파드 내의 애플리케이션에서는 현재 진행중인 작업이 종료되기 전에 그 메시지 큐로부터 반복하여 Topic 을 가져오는 처리를 구현해두어야 한다. Topic 이 존재하면 현재 작업이 종료되어도 파드를 성공 종료처리하지 않고, 바로 이어서 해당 작업을 진행한다. 이를 반복하다가 메시지 큐가 빈 것을 확인하면 그때서야 파드를 정상 종료 처리하도록 구현하여야 전체 병렬 작업들을 마무리할 수 있게 된다.

이렇게 메시지 큐가 빈 이후에 다시 새로운 Topic 이 등록되는 경우를 위해서는 나중에 따로 설명할 Cron Job 을 이용하여 Job 을 정기적으로 실행하여 병렬 작업큐가 다시 기동될 수 있도록 구현해둔다.

메시지 큐에 쌓인 메시지 양에 따라 Job 의 parallelism 을 동적으로 변경할 수 있도록 작성하여 오토 스케일링하는 것도 가능하다.

 

작업큐는 completions 를 지정하지 않는다고 하였는데, 이렇게 작성하면 COMPLETIONS 가 태스크와 다르게 표시된다.

# COMPLETIONS 표시 형식 확인
$ kubectl get jobs multi-workqueue-job
NAME                  STATUS    COMPLETIONS   DURATION   AGE
multi-workqueue-job   Running   0/1 of 3      6s         6s

# 실행중인 파드 확인
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
multi-workqueue-job-6hdcg   1/1     Running   0          11s
multi-workqueue-job-jgxbt   1/1     Running   0          11s
multi-workqueue-job-tl4s2   1/1     Running   0          11s

# 파드 실행 완료 확인
$ kubectl get pods
NAME                        READY   STATUS      RESTARTS   AGE
multi-workqueue-job-6hdcg   0/1     Completed   0          21m
multi-workqueue-job-jgxbt   0/1     Completed   0          21m
multi-workqueue-job-tl4s2   0/1     Completed   0          21m

# COMPLETIONS 표시 형식 확인
$ kubectl get jobs multi-workqueue-job
NAME                  STATUS     COMPLETIONS   DURATION   AGE
multi-workqueue-job   Complete   3/1 of 3      33s        21m

 

4. 1개씩 실행하는 작업큐

병렬 작업큐에서 parallelism 만 1로 변경한 것으로, 병렬성이 없는 작업큐라고 보면 된다.

completions 지정하지 않음
parallelism N
backoffLimit P

 

parallelism 은 Job 실행중에 변경할 수 있으므로, N개의 병렬 작업큐로 전환할 수 있다. kubectl patch 를 사용하거나, 매니페스트 수정 후 apply 를 진행하면 된다.(이력관리를 위해서 apply 권장)

# 확인을 위해 parallelism: 1 로 변경
$ kubectl patch job multi-workqueue-job -p '{"spec": {"parallelism": 1}}'
job.batch/multi-workqueue-job patched

$ kubectl get jobs
NAME                  STATUS     COMPLETIONS   DURATION   AGE
multi-workqueue-job   Complete   3/1           33s        79m

$ kubectl patch job multi-workqueue-job -p '{"spec": {"parallelism": 2}}'
job.batch/multi-workqueue-job patched

$ kubectl get jobs
NAME                  STATUS     COMPLETIONS   DURATION   AGE
multi-workqueue-job   Complete   3/1 of 2      33s        80m

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,