티스토리 뷰
Job Controller
쿠버네티스의 가장 기본적인 특징은 Pod를 항상 Running 중인 상태로 보장해준다는 것이다. 하지만 배치 처리처럼 특정 시점에만 Pod가 필요하다면 Job 컨트롤러를 사용하는 것이 해답이 될 수 있다.
Job Controller에 의해서 Pod를 실행시키면 해당 Job에 대한 결과(정상인지에 대한 여부)를 점검해서 비정상으로 종료되었을 경우에는 다시 재시작해준다는 특징이 있다.
실습
예시 1) restartPolicy: Never
- job-exam.yaml 파일
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
# completions: 5
# parallelism: 2
# activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 25; echo 'Bye'"
restartPolicy: Never
# restartPolicy: OnFailure
# backoffLimit: 3
출처: https://github.com/237summit/Getting-Start-Kubernetes/blob/main/6/job-exam.yaml
- 위 job 컨트롤러를 실행시키고 바로 해당 Pod를 삭제한다.
- 위 job이 실행 중에 해당 Pod를 삭제한 것이므로 비정상 종료에 해당한다.
- 비정상 종료이기 때문에 같은 Pod를 하나 더 실행시키고 있음을 확인할 수 있다.
- 작업이 완료된 Pod는 삭제하지 않고 보존한다. 완료된 Pod를 삭제하지 않는 이유는 해당 Pod가 남긴 로그 등을 남겨두기 위해서이다.
- 만약 완료된 Pod를 지우고 싶다면 당연히 컨트롤러(Job)를 지워야 한다.
예시 2) restartPolicy: OnFailure + 비정상 종료
비정상 종료를 발생시키기 위해 command 부분에 오타를 주었다. (bash -> besh)
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
# completions: 5
# parallelism: 2
# activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["besh"]
args:
- "-c"
- "echo 'Hello World'; sleep 25; echo 'Bye'"
# restartPolicy: Never
restartPolicy: OnFailure
backoffLimit: 3
- restartPolicy가 onFailure로 되어 있으면 컨테이너가 비정상적으로 종료되었을 때 컨테이너를 재시작시킨다. 주의할 것은 Pod를 재시작시키는 것은 아니다. Never로 정의했을 경우에는 Pod를 재시작하지만 onFailure로 설정하면 컨테이너를 재시작한다.
- backoffLimit는 restartPolicy가 onFailure로 되어 있을 때 '컨테이너'를 몇 번 재시작할지를 결정한다. 위 설정에서는 실패로 끝났을 경우 3번 컨테이너를 재시작하고 그래도 작업이 성공하지 않으면 더 이상 진행하지 않는다. (실행 중인 Job이 없어짐)
- restartPolicy가 OnFailure이기 때문에 Pod를 새로 생성하지는 않았지만 컨테이너를 재시작(위 그림에서 RESTARTS 필드 확인) 했음을 확인할 수 있다.
- backoffLimit를 3으로 설정했기 때문에 기존 컨테이너를 종료하고 이후 총 3번의 컨테이너 재시작이 발생했음을 확인할 수 있다.
예시 3) restartPolicy: Never + 비정상 종료
- 위 그림은 restartPolicy를 Never로 바꾸고 backoffLimit를 주석 처리했을 때의 결과를 보여준다.
- Job Definition 파일에서 command 부분에 bash를 besh로 오타를 주었고 이 때문에 Pod 상태가 StartError로 변경되었다. 이때 restartPolicy가 Never이기 때문에 컨테이너를 재시작하는 게 아니라 'Pod를 새로 생성'하는 과정을 반복하고 있음을 확인할 수 있다.
예시 4) completions
- Job Controller에는 replicas 필드가 사용되지 않는다. 하지만 Job을 몇 번 실행시킬지에 대한 설정은 completions을 통해 가능하다.
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
completions: 3
# parallelism: 2
# activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 3; echo 'Bye'"
restartPolicy: Never
# restartPolicy: OnFailure
# backoffLimit: 3
- completions를 3으로 설정했기 때문에 3개의 Pod가 정상적인 종료(Completed) 후 더 이상 Pod는 실행되지 않았다.
- 위 그림에서 볼 수 있듯이 3개의 Pod가 '순차적으로' 실행되었다. 만약 completions으로 설정한 Pod개수가 병렬적으로 실행되기를 원한다면 parallelism을 사용하면 된다.
예시 5) parallelism
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
completions: 5
parallelism: 2
# activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 3; echo 'Bye'"
restartPolicy: Never
# restartPolicy: OnFailure
# backoffLimit: 3
- parallelism을 2로 설정하면 completions으로 설정한 5개의 Pod 중에서 2개씩 병렬로 실행한다.
- 위 그림에서 Pod의 AGE를 보면 알 수 있듯이 2개 -> 2개 -> 1개 순서로 실행하고 완료했음을 확인할 수 있다.
예시 6) activeDeadlineSeconds
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
# completions: 5
# parallelism: 2
activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 10; echo 'Bye'"
restartPolicy: Never
# restartPolicy: OnFailure
# backoffLimit: 3
- activeDeadlineSeconds로 설정한 시간 안에 끝나지 않으면 강제로 Completion 된다.
- sleep을 10초 걸어주었기 때문에 activeDeadlineSeconds로 설정한 5초 동안에 작업이 끝나지 못했다. 따라서 강제로 Completed 되었음을 확인할 수 있다.
- activeDeadlineSeconds는 너무 오래 걸릴 것으로 예상되는 작업이 긴 시간 동안 Running 상태로 두는 것을 방지하기 위해 사용된다.
Reference
- 따배쿠, https://youtu.be/AxplqT55Kdg
- k8s docs Job controller, https://kubernetes.io/docs/concepts/workloads/controllers/job/
- k8s docs Pod LifeCycle, https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
'[ DevOps ] > [ k8s ]' 카테고리의 다른 글
[k8s] Kustomize (0) | 2022.12.05 |
---|---|
[k8s] Controller - CronJob (0) | 2022.10.01 |
[k8s] Controller - StatefulSet(sf) (0) | 2022.09.22 |
[k8s] Controller - DaemonSet (0) | 2022.09.16 |
[k8s] Controller - Deployment와 Rolling Update (0) | 2022.09.11 |
- Total
- Today
- Yesterday
- helm
- 컨트롤러
- 코틀린
- RDB
- ci/cd
- jvm
- Stream
- golang
- container
- db
- spring
- CICD
- LFCS
- docker
- GitOps
- rolling update
- Linux
- 쿠버네티스
- kafka
- K8s
- Controller
- Kubernetes
- 우분투
- Java
- argocd
- Non-Blocking
- github actions
- go
- 카프카
- ubuntu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |