본문 바로가기

Kubenetes/Kubernetes Controller

잡 리소스 및 스케줄링

작업을 완료한 후 종료되는 테스크만 실행하길 원하는 경우가 있다. 하지만 레플리케이션컨트롤러, 레플리카셋 및 데몬셋은 작업의 완료를 고려하지 않고 계속적으로 태스크를 실행한다.

 

따라서 쿠버네티스는 잡 리소스를 통해 내부에서 실행 중인 프로세스가 성공적으로 완료되면 컨테이너가 다시 시작되지 않도록 하는 포드를 실행할 수 있다. 일단 그렇게 되면 포드가 완료된 것으로 간주한다.

 

잡에서 관리하는 포드는 성공적으로 끝날 때까지 재스케줄된다.

[잡 리소스의 정의]

 

export.yaml

apiVersion: batch/v1                      # 잡은 Batch API 그룹의 버전 v1에 있다.
kind: Job
metadata:
   name: batch-job
spec:                                     # 포드셀렉터를 지정하지 않았다. 
   tmeplate:                              # 포드 템플릿의 라벨을 기반으로 만들어진다
     metadata:
       labels:
         app: batch-job
     spec:
       restartPolicy: OnFailure           # 잡은 항상 기본 재시작 정책을 사용할 수 없다.
       containers:
       - name: main
         image: luksa/batch-job

 

- 포드의 스펙에서 컨테이너에서 실행 중인 프로세스가 종료 될 때 쿠버네티스가 수행해야 하는 작업을 지정 가능

- 이 작업은 restartPolicy 포드의 스펙 속성을 통해 수행

- 기본 값은 Allway

- Job Pod는 무제한 실행하지 않으므로 기본 정책을 사용할 수 없으므로 restartPolicy  정책을 OnFailure 또는 Never로 명시해야 함.

 

[Pod를 실행하는 잡 보기]

 

kubectl create 명령으로 잡을 만든 후에는 즉시 포드를 시작해야 함

$ kubectl get jobs
NAME             DESIRED        SUCCESSFUL      AGE
batch-job        1              0               2s

$ kubectl get po
NAME               READY    STATUS      RESTARTS    AGE
batch-job-28qf4    1/1      Running      0          4s

 

2분이 지나면 포드는 더 이상 포드 목록에 나타나지 않고 잡은 완료된 것으로 표시됨

--show-all(또는 -a) 스위치를 사용하지 않으면 기본적으로 포드를 나열할 때 완료된 포드가 표시되지 않음

 

$ kubectl get po -a

NAME             READY   STATUS        RESTARTS    AGE
batch-job-28qf4.  0/1    Completed      0          2m

 

포드가 완료될 때 삭제되지 않은 이유는 로그를 검사할 수 있도록 하기 위해서이다.

$ kubectl logs batch-job-28qf4

Fri Apr 29 09:53:22 UTC 2020 Batch job starting

Fri Apr 29 10:00:22 UTC 2020 Finished successfully

 

포드는 삭제하거나 생성한 잡을 삭제하면 삭제된다.

 

ㅁ 잡에서 다수의 포드 인스턴스 실행

 

- 잡은 두개 이상의 포드 인스턴스를 만들고 병렬 또는 순차적으로 실행하도록 구성할 수 있다.

- Job 스펙의 completions와 parallelism 속성을 설정해 수정

 

multi-completion-batch-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
   name: multi-completion-batch-job
spec:
   completions: 5
   tmeplate:                              # 포드 템플릿의 라벨을 기반으로 만들어진다
     metadata:
       labels:
         app: batch-job
     spec:
       restartPolicy: OnFailure           # 잡은 항상 기본 재시작 정책을 사용할 수 없다.
       containers:
       - name: main
         image: luksa/batch-job

이 잡은 5개의 포드를 차례로 실행한다. 

처음에 하나의 포드를 만들고 포드 컨테이너가 완료되면 두번째 포드를 만들고 5번째 포드가 성공적으로 완료될 때까지 계속한다.

 

[병렬로 잡 포드 실행]

 

단일 잡 포드를 하나씩 실행하는 대신 잡이 여러 개의 포드를 동시에 실행하도록 할 수 있다. 

multi-completion-parallel-batch-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
   name: multi-completion-batch-job
spec:
   completions: 5
   parallelism: 2
   template:                            # 포드 템플릿의 라벨을 기반으로 만들어진다
     metadata:
       labels:
         app: batch-job
     spec:
       restartPolicy: OnFailure           # 잡은 항상 기본 재시작 정책을 사용할 수 없다.
       containers:
       - name: main
         image: luksa/batch-job

 

위 yaml을 실행하면 아래와 같이 결과가 나온다.

 

$ kubectl get po
NAME                               READY    STATUS    RESTARTS     AGE
multi-completion-batch-job-limnk    1/1     Running   0            21s
multi-completion-batch-job-qx4nq    1/1     Running   0            21s

위 중 하나가 끝나면 잡은 5개의 포드가 성공적으로 끝날 때까지 다음 포드를 실행함.

 

[잡 스케일링]

 

잡이 실행하는 동안에도 잡의 병렬처리속성을 변경할 수 있다.

 

$ kubectl scale job multi-completion-batch-job --replicas 3

job :"multi-completion-batch" scaled

 

[잡 포드를 완료하는 데 허용되는 시간 제한]

 

포드의 실행 시간은 activeDeadlineSeconds 속성을 설정해 제한 가능

포드가 그보다 오래 실행되면 시스템은 포드를 종료하려고 시도하고 잡을 실패한 것으로 표시한다.

 

[Cronjob 만들기]

 

기본적인 리눅스와 유닉스 같이 운영체계에서와 같이 cron 작업을 CronJob 리소스를 사용하여 구성

설정된 스케줄에 따라 쿠버네티스는 CronJob 객체에 구성된 잡 템플릿에 따라 잡 리소스를 생성

 

cronjob.yaml

apiVersion: batch/v1beta1            #API 그룹은 batch이며 버전은 v1beta1이다.
kind: CronJob
metadata:
   name: batch-job-every-fifteen-minutes
spec:
   schedule: "0, 15, 30, 45 * * * *" # 이 작업은 매일 매시간 0, 15, 30, 45분에 실행해야 한다.
   jobTemplate:
      spec:
         template:
            metadata:
               labels:
                  app: periodic-batch-job
            spec:
               restartPolicy: OnFailure
               containers:
                  - name: main
                    image: luksa/batch-job
                    

 

[StartingDeadline]

 

StartingDeadlineSeconds 옵션을 통해 일정 시간을 넘어서 잡이 시작할 수 없다는 엄격한 요구 사항을 갖을 수 있다.

apiVersion: batch/v1beta1
kind: CronJob
spec:
   schedule: "0, 15, 30, 45 * * * *"
   startingDeadlineSeconds: 15          # 마지막으로 포드는 스케줄된 시간 이후로 15초 안에 시작해야 한다.
   ...