[k8s] Controller - Job

2022. 9. 27. 21:16[ DevOps ]/[ k8s ]

 

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