[Kubernetes] Ch2. 워크로드 API 카테고리 - (4) Job, CronJob
Job (잡)
잡은 컨테이너를 사용하여 한 번만 실행되는 리소스다
N개의 병렬로 실행하면서 지정한 횟수의 컨테이너 실행(정상종료)를 보장하는 리소스다
잡과 레플리카셋의 차이점?
가장 큰 차이점은 기동 중인 파드가 정지되는 것을 전제로 만들어졌는지다
기본적으로 레플리카셋 정지는 예상치 못한 에러다
반면 잡의 경우는 파드의 정지가 정상 종료되는 작업에 적합하다
ex) 파일 업로드, 배치처리
잡 생성
apiVersion: batch/v1
kind: Job
metadata:
name: sample-job
spec:
completions: 1
parallelism: 1
backoffLimit: 10
template:
spec:
containers:
- image: amsy810/tools:v2.06
name: tools-container
command: ["sleep"]
args: ["60"]
restartPolicy: Never
60초 동안 sleep하는 잡이다
레이블과 셀렉터는 따로 지정하지 않는 것을 추천한다
(쿠버네티스가 유니크한 uuid를 자동으로 생성)
# 생성 직후
kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
sample-job-zgh2v 1/1 Running 0 23s
# 60초 후 완료된 잡
kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
sample-job-zgh2v 0/1 Completed 0 70s
restartPolicy
spec.template.spec.restartPolicy
Never
잡 용도로 생성한 파드 내부 프로세스가 정지되면 신규 파드를 생성하여 잡을 계속 실행하려고 한다
OnFailure
잡 용도로 생성된 파드 내부 프로세스가 정지되면 RESTARTS 카운터가 증가하고, 사용했던 파드를 다시 사용하여 잡을 실행하려고 한다
태스크와 작업 큐 병렬 실행
completions : 성공횟수
parallelism : 병렬성
backoffLimit : 실패를 허용하는 횟수
One Shot Task : 1회만 실행하는 태스크
completions=1 / parallelism=1 / backoffLimit=0 으로 지정
반드시 1회만 실행한다
Multi Task : 병렬로 실행하는 태스크
completions와 parallelism를 변경하여 병렬 태스크를 생성할 수 있다
ex) completions=5 / parallelism=3 지정한 경우, 파드가 5회 정상 종료할 때까지 세 개 병렬로 실행한다
Mulit WorkQueue: N개 병렬로 실행하는 작업 큐
큰 처리 전체가 정상 종료할 때까지 몇 개의 병렬 수로 계속 실행하고 싶은 경우
completions은 지정하지 않고 parallelism만 지정한다
이 경우 parallelism로 지정한 병렬 수로 파드를 실행하고, 그중 하나라도 정상 종료하면 그 이후는 파드를 생성하지 않는다
Single WorkQueue: 한 개씩 실행하는 작업 큐
Multi WorkQueue 응용으로 성공 횟수(Completions)를 지정하지 않고 병렬 수(Parallelism)에 1을 지정한 경우에는 한 번 정상 종료할 때까지 한 개씩 실행하는 작업 큐(Single WorkQueue)가 된다
CronJob (크론잡)
기존의 스케줄잡이라는 이름이 크론잡으로 명칭이 변경되었다
크론잡은 스케줄링된 시간에 잡을 생성한다
크론잡이 잡을 관리하고 잡이 파드를 관리하는 3계층 구조이다
크론잡 생성
apiVersion: batch/v1
kind: CronJob
metadata:
name: sample-job
spec:
schedule: "* /1* * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
크론잡 일시 정지
점검이나 어떤 이유로 잡 생성을 원하지 않는 경우에는 suspend(일시정지)를 할 수 있다
크론잡에서 spec.suspend가 true로 설정되어 있으면 스케줄 대상에서 제외된다 (기본값은 false)
크론잡을 임의의 시점에 실행
—from 옵션을 사용하여 크론잡으로 잡을 생성할 수 있다
스케줄링 시간 이외의 시점에 실행시키고 싶을 때 사용한다
kubectl create job sample-job-from-cronjob --from cronjob/sample-cronjob