Kubernetes

Kubernetes 기초 - Controller(6)

사실 나도 모름 2023. 12. 15. 02:37
  1. ReplicationController
  2. ReplicaSet
  3. Deployment
  4. DaemonSet
  5. StatefulSet
  6. Job         ←  오늘 볼 내용
  7. CronJob

6. Job

Job 컨트롤러는 쿠버네티스에서 일회성 작업을 수행하는데 사용되는 컨트롤러다.

주로 한 번 실행되고 완료되면 종료되는 작업에 사용된다.

Job은 성공 또는 실패한 작업을 트래킹하고, 성공적으로 완료된 경우에는 파드를 종료한다.

 

 

파드는 일련의 프로세스 동작이 마무리가 되면 파드를 종료된다.

하지만 쿠버네티스는 기본적으로 파드를 Running 상태로 유지하려고 하는 특성에 의해 파드가 종료되더라도 재시작한다.

# 5초 멈췄다가 종료되는 파드
kubectl run test --image=centos:7 --command sleep 5

위와 같이 쿠버네티스는 파드의 running 상태를 보장하기 위해 무한히 재시작한다

 

 

하지만 Job 컨트롤러를 사용하면 다음과 같은 조건을 따르기 때문에 일회성 작업에 유용하다.

  • Batch 처리하는 파드는 작업이 완료되면 종료된다.
  • Batch 처리에 적합한 컨트롤러로 파드의 성공적인 완료를 보장한다.
    • 비정상 종료 시 다시 실행
    • 정상 종료 시 완료

 

 

 


예제 - 1

job-exam.yaml 파일 생성
# job-exam.yaml
apiVersion: batch/v1
kind: Job
metadata: 
  name: centos-job
spec:
#  completions: 5
#  parallelism: 2
#  activeDeadlineSeconds: 15
  template:
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bash"]
        args:
        - "-c"
        - "echo 'Hello World'; sleep 50; echo 'Bye'"
      restartPolicy: Never
  • completions : 실행해야 할 job의 수가 몇 개인지 지정
  • parallelism : 병렬성. 동시 running 되는 pod의 수
  • activeDeadlineSeconds : 지정 시간 내에 job을 완료
  • restartPolicy: Never : 컨테이너 실행 중 에러가 발생하면 컨테이너를 재시작하지 않음(파드를 재시작 함)

 

 

job 컨트롤러 실행
# 파일 실행
kubectl create -f job-exam.yaml

job 으로 인해 파드 하나 실행 중

 

 

 

컨테이너 에러 시

파드를 계속 생성한다

 

 

 

파드 비정상 종료 시

 

만약 위 상태에서 파드를 종료시켜버린다면 어떻게 될까?

아직 모든 커맨드가 종료되지 않은 상태에서 갑자기 종료되는 것이기에 비정상 종료로 취급하여 job 컨트롤러는 파드를 다시 생성한다.

# 파드 중도 종료
kubectl delete pod <파드 이름>

종료된 파드 뒤에 다시 생성

 

 

 

정상 종료 시

 

파드가 모든 커맨드를 완수하고 프로세스가 종료되었을 경우를 보자.

# job 상태 확인
kubectl get jobs

99초 만에 완료

 

파드가 실행된 이후 99초만에 모든 작업을 수행완료했다.

Job은 이와 같이 파드의 작업이 완료될 수 있도록 보장해준다.

하지만 완료된 파드를 제거하지는 않는다.

작업이 완료된 파드

 

위와 같이 작업이 완료되어  STATUS에 Completed가 되었음에도 파드는 종료되지 않고 계속 남아다.

파드를 종료하지 않고 남겨두는 이유는 파드에서 작업이 실행되면서 발생한 로그 정보, 상태 정보 등을 확인할 수 있도록 하기 위함이다.

 

제거할 때는 파드를 제거하는 것이 아니라 job 컨트롤러를 지워야 모든 리소스가 정리된다.

 


예제 - 2

job-exam.yaml 파일 수정

 

아까와 비슷하지만 몇몇 라인의 내용이 수정되었다.

# job-exam.yaml
apiVersion: batch/v1
kind: Job
metadata: 
  name: centos-job
spec:
#  completions: 5
#  parallelism: 2
#  activeDeadlineSeconds: 15
  template:
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bashc"]
        args:
        - "-c"
        - "echo 'Hello World'; sleep 50; echo 'Bye'"
#      restartPolicy: Never
      restartPolicy: OnFailure
  backoffLimit: 3

 

위 yaml 파일은 의도적으로 오타를 내어 오류가 발생하게 한 것이다.

추가된 라인의 의미는 다음과 같다.

  • restartPolicy: OnFailure : 컨테이너의 실행 중 에러가 발생하면 컨테이너를 재시작(파드 재시작 X)
  • backoffLimit: 3 : restartPolicy가 OnFailure로 설정되어 있을 때 에러가 발생하면 3번 까지 재시작(기본값 6)

 

 

job 컨트롤러 실행

3번의 실패 후 종료

 

컨테이너에 에러가 발생했을 경우 3번까지 재시작하지만 3번이 지나도 성공하지 못하면 job 컨트롤러는 파드를 제거한다.

 


예제 - 3

job-exam.yaml 파일 수정

 

job에서는 컨테이너의 작업의 완료를 보장하는데 같은 작업을 여러번 할 수 있게 하는 방법도 있다.

마치 replicas 처럼 같은 파드를 여러 개 실행하는데 completions를 설정하면 하나씩 하나씩 실행시키게 된다.

한번에 여러 개의 파드를 생성하여 한번에 병렬 처리를 하고 싶다면 parallelism을 사용하면 된다.

yaml 파일에서 주석처리한 것을 빼고 실습해보자.

# 파일 수정
apiVersion: batch/v1
kind: Job
metadata:
  name: centos-job
spec:
  completions: 5
  parallelism: 2
#  activeDeadlineSeconds: 15
  template:
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bash"]
        args:
        - "-c"
        - "echo 'Hello World'; sleep 5; echo 'Bye'"
      restartPolicy: Never
#      restartPolicy: OnFailure
#  backoffLimit: 3

 

위 코드는 작업 컨테이너를 5번 실행하되 한번에 2개씩 실행하도록 한다.

parallelism에 의해 동시에 실행되는 파드는 항상 2개로 유지될 것이다.

 

 

job 컨트롤러 실행

이렇게 동작한다.

 


예제 - 4

job-exam.yaml 파일 수정

 

작업을 실행할 때 일정 시간이 지나도 작업이 완료되지 않으면 강제로 종료시켜버리는 방법도 있다.

바로 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 25; echo 'Bye'"
      restartPolicy: Never
#      restartPolicy: OnFailure
#  backoffLimit: 3

 

위 코드는 5초동안 작업이 완료되지 않으면 종료시키는 코드다.

 

 

 

job 컨트롤러 실행

5초만에 파드 종료

 

우리는 컨테이너에서 sleep으로 25초를 입력했지만 activeDeadlineSeconds로 인해 완료되기도 전에 종료가 되어버렸다.

특정 애플리케이션이 혹여 오류가 발생해서 긴 시간 대기상태에 빠진 경우를 해결하기 위해 좋은 방법이다.

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Service(1)  (0) 2023.12.18
Kubernetes 기초 - Controller(7)  (0) 2023.12.15
Kubernetes 기초 - Controller(5)  (0) 2023.12.14
Kubernetes 기초 - Controller(4)  (0) 2023.12.14
Kubernetes 기초 - Controller(3)  (0) 2023.12.14