[Retry, k8s] 08. 워크로드 API - 잡
카테고리: KUBERNETES
태그: kubernetes
[Retry, k8s] 08. 워크로드 API - 잡
🔔 잡
잡은 컨테이너를 사용하여 한 번만 실행되는 리소스, 더 정확히 말하면 N개의 병렬로 실행하면서 지정한 횟수의 컨테이너 실행(정상 종료)를 보장하는 리소스이다.
-
잡과 레프리카셋 간의 차이점은 “기동 중인 파드가 정지되는 것을 전제로 만들어 졌는지”에 있다.
-
레플리카셋 등에서는 정상 종료 횟수 등을 셀 수 없기 때문에 배치 처리인 경우에는 잡을 적극적으로 사용하자.
📜 잡 생성
레플리카셋과 마찬가지로 레이블과 섹렉터는 명식적으로 지정할 수 있지만, 쿠버네티스는 유니크한 uuid를 자동으로 생성하기 때문에 잡에서는 명시적으로 지정하는 것을 추천하지 않는다.
cat <<EOF > sample-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: sample-job
spec:
completions: 1
parallelism: 1
backoffLimit: 10
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["slepp"]
args: ["60"]
restartPolicy: Never
EOF
$ kubectl apply -f sample-job.yaml
job.batch/sample-job created
# 잡 목록 표시
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
sample-job 0/1 48s 48s
# 잡이 생성한 파드 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pod/sample-job-8wwpf 1/1 Running 0 37s
# 잡 목록 표시(파드 실행 완료 후)
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pod/sample-job-8wwpf 0/1 Completed 0 101s
📜 restartPolicy에 따른 동작 차이
-
【restartPolicy: Never의 경우】
- 파드에 장애가 발생하면 신규 파드가 생성
apiVersion: batch/v1
kind: Job
metadata:
name: sample-job-never-restart
spec:
completions: 1
parallelism: 1
backoffLimit: 10
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sh", "-c"]
args: ["$(sleep 3600)"]
restartPolicy: Never
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
sample-job-never-restart-42fsr 1/1 Running 0 11s
# 컨테이너상의 sleep 프로세스 정지
$ kubectl exec -it sample-job-never-restart-42fsr -- sh -c 'kill -9 `pgrep sleep`'
# 생성된 파드가 기동됨
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
sample-job-never-restart-42fsr 0/1 Error 0 45s
sample-job-never-restart-p8cbz 1/1 Running 0 3s
-
【restartPolicy: OnFailure의 경우】
- 동일한 파드를 사용하여 잡을 다시 시작
apiVersion: batch/v1
kind: Job
metadata:
name: sample-job-onfailure-restart
spec:
completions: 1
parallelism: 1
backoffLimit: 10
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sh", "-c"]
args: ["$(sleep 3600)"]
restartPolicy: OnFailure
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-job-onfailure-restart-lgtjw 1/1 Running 0 8s
# 컨테이너상의 sleep 프로세스 정지
$ kubectl exec -it sample-job-onfailure-restart-lgtjw -- sh -c 'kill -9 `pgrep sleep`'
# 같은 파드 재시작
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-job-onfailure-restart-lgtjw 1/1 Running 1 (6s ago) 38s
📜 태스크와 작업 큐 병렬 실행
completions(성공 횟수를 지정), parallelism(병렬성을 지정), backoffLimit(실패를 허용하는 횟수를 지정)
(a) 1회만 실행하는 태스크 - completions=1/parallelism=1/backoffLimit=0
apiVersion: batch/v1
kind: Job
metadata:
name: sample-oneshot-task-job
spec:
completions: 1
parallelism: 1
backoffLimit: 0
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sleep"]
args: ["30"]
restartPolicy: Never
(b) N개 병렬로 실행시키는 태스크 - completions=N/parallelism=M/backoffLimit=P
# 파드가 5회 정상 종료할 때까지 세 개 병렬로 실행한다.
apiVersion: batch/v1
kind: Job
metadata:
name: sample-multi-task-job
spec:
completions: 5
parallelism: 3
backoffLimit: 5
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sleep"]
args: ["30"]
restartPolicy: Never
(c) N개 병렬로 실행하는 작업 큐 - completions=미지정/parallelism=M/backoffLimit=P
# 파드가 5회 정상 종료할 때까지 세 개 병렬로 실행한다.
apiVersion: batch/v1
kind: Job
metadata:
name: sample-multi-workqueue-job
spec:
# completions: 1
parallelism: 3
backoffLimit: 1
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sleep"]
args: ["30"]
restartPolicy: Never
-
태스크와 작업 큐는 잡을 표시할 때 COMPLETIONS의 출력 형식이 다르다. (태스크: 0/5, 작업 큐: 0/1 of 3)
-
이는 세 개 병렬로 실행 중 하나가 정상 종료하면 되지만 아직 하나도 정상 종료되지 않은 것을 나타낸다.
kubectl get job
NAME COMPLETIONS DURATION AGE
sample-multi-task-job 0/5 12s 12s
sample-multi-workqueue-job 0/1 of 3 6s 6s
(d) 한 개씩 실행하는 작업 큐 - completions=미지정/parallelism=1/backoffLimit=P
apiVersion: batch/v1
kind: Job
metadata:
name: sample-single-workqueue-job
spec:
# completions: 1
parallelism: 1
backoffLimit: 1
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sleep"]
args: ["30"]
restartPolicy: Never
- 성공 횟수(completions)는 나중에 변경할 수 없는 파라미터이지만, 병렬 수(parallelism)는 변경이 가능하다.
$ kubectl get job
NAME COMPLETIONS DURATION AGE
sample-single-workqueue-job 0/1 11s 11s
$ kubectl patch job sample-single-workqueue-job -p '{"spec": {"parallelism": 2}}'
job.batch/sample-single-workqueue-job patched
$ kubectl get job
NAME COMPLETIONS DURATION AGE
sample-single-workqueue-job 1/1 of 2 34s 55s
📜 일정 기간 경과 후 잡 삭제
잡은 종료 후에 삭제되지 않고 남느데, spec.ttlSecondsAfterFinished 통해 잡이 종료한 후에 일정 기간(초) 경과 후 삭제하도록 설정할 수 있다.
apiVersion: batch/v1
kind: Job
metadata:
name: sample-job-ttl
spec:
ttlSecondsAfterFinished: 30
completions: 1
parallelism: 1
backoffLimit: 10
template:
spec:
containers:
- name: tools-container
image: amsy810/tools:v2.0
command: ["sleep"]
args: ["60"]
restartPolicy: Never
# job 상태 모니터링
$ kubectl get job sample-job-ttl --watch --output-watch-events
EVENT NAME COMPLETIONS DURATION AGE
ADDED sample-job-ttl 0/1 52s 52s
MODIFIED sample-job-ttl 1/1 64s 94s
DELETED sample-job-ttl 1/1 64s 94s
댓글 남기기