작업을 완료한 후 종료되는 테스크만 실행하길 원하는 경우가 있다. 하지만 레플리케이션컨트롤러, 레플리카셋 및 데몬셋은 작업의 완료를 고려하지 않고 계속적으로 태스크를 실행한다.
따라서 쿠버네티스는 잡 리소스를 통해 내부에서 실행 중인 프로세스가 성공적으로 완료되면 컨테이너가 다시 시작되지 않도록 하는 포드를 실행할 수 있다. 일단 그렇게 되면 포드가 완료된 것으로 간주한다.
[잡 리소스의 정의]
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초 안에 시작해야 한다.
...
'Kubenetes > Kubernetes Controller' 카테고리의 다른 글
StatefulSet (0) | 2021.02.13 |
---|---|
Deployment - 애플리케이션 업데이트 (0) | 2021.02.13 |
레플리카셋(Replicaset) (0) | 2021.02.11 |
레플리케이션 컨트롤러 (Replication Controller) (0) | 2021.02.11 |