-
[따배쿠] Controller - Jobkubernetes 2024. 12. 6. 10:00
Job
- 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도하는 Job
- Kubernetes는 Pod를 running 중인 상태로 유지
- Batch 처리하는 Pod는 작업이 완료되면 종료
- Batch 처리에 적합한 컨트롤러로 Pod의 성공적인 완료를 보장
- 비정상 종료 시 다시 실행
- 정상 종료시 완료
- 즉, Job 컨트롤러는 Batch 작업 시 유용하다!
작동 방식
- 파드 생성: Job Controller는 지정된 작업을 수행하기 위해 필요한 수의 파드를 생성합니다. 이 파드는 작업이 완료될 때까지 실행됩니다.
- 완료 상태 확인: 작업이 성공적으로 완료되면 Job Controller는 해당 파드를 종료하고, 작업의 결과를 기록합니다
- 재시도 메커니즘: 작업이 실패할 경우, Job Controller는 설정된 재시도 정책에 따라 파드를 재생성하여 작업을 다시 시도할 수 있습니다
Job Definition
- restartPolicy?
- Kubernetes에서 restartPolicy는 포드의 모든 컨테이너에 적용되며, 다음과 같은 세 가지 옵션이 있습니다.
- Always: 컨테이너가 종료되더라도 항상 재시작합니다. 주로 지속적인 서비스가 필요한 경우에 사용됩니다.
- OnFailure: 컨테이너가 비정상적으로 종료된 경우에만 재시작합니다. 정상적으로 종료된 경우에는 재시작하지 않습니다.
- Never: 컨테이너가 종료되더라도 절대 재시작하지 않습니다. 주로 일회성 작업이나 테스트에 사용됩니다.
- Kubernetes에서 restartPolicy는 포드의 모든 컨테이너에 적용되며, 다음과 같은 세 가지 옵션이 있습니다.
- backoffLimit?
- job이 실패하면, Pod를 몇 번 재실행 할 것 인지 결정 ex) backofflimit : 3
- 별도 미설정 시, 기본 backoffLimit 횟수는 6회
예시
# job-exam.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/6# vi 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 50; echo 'Bye'" restartPolicy: Never # restartPolicy: OnFailure # backoffLimit: 3
이 Job은 CentOS 7 이미지를 사용하여 "Hello World"를 출력하고 50초 동안 대기한 후 "Bye"를 출력하는 작업을 수행한다. restartPolicy : Never 필드에 의해서, 컨테이너가 종료되더라도 재시작하지 않는다.
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml job.batch/centos-job created root@master:~/Getting-Start-Kubernetes/6# kubectl get pods NAME READY STATUS RESTARTS AGE centos-job-rbstx 1/1 Running 0 3s
root@master:~# kubectl get jobs NAME STATUS COMPLETIONS DURATION AGE centos-job Complete 1/1 82s 3h43m
# 삭제
root@master:~# kubectl delete jobs.batch centos-job job.batch "centos-job" deleted
예시2
# job-exam.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/6# cat 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: ["bashrc"] args: - "-c" - "echo 'Hello World'; sleep 50; echo 'Bye'" # restartPolicy: Never restartPolicy: OnFailure backoffLimit: 3
command에 Error가 발생하게 끔 bashrc로 수정해주고
restartPolicy : OnFailure 활성화
backoffLimit : 3 활성화 후, 생성해보자
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml job.batch/centos-job created
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-4qrhs 0/1 CrashLoopBackOff 2 (28s ago) 46s 192.168.104.24 node2 <none> <none> root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-4qrhs 0/1 Terminating 3 47s 192.168.104.24 node2 <none> <none> root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide No resources found in default namespace.
Pod가 정상적으로 완료되지 않으면 Job Controller에 의해 다시 restart되는데
backoffLimit = 3에 따라, Pod Restart를 3번 시도하게 되는데, 3번 다 실패하면 더 이상 실행하지 않는다.
예시3 (completion)
# job-exam.yaml 파일 작성
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 5; echo 'Bye'" restartPolicy: Never # restartPolicy: OnFailure # backoffLimit: 3
completion을 3으로 지정 후, 배포해보자
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs NAME STATUS COMPLETIONS DURATION AGE centos-job Running 1/3 13s 13s root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs NAME STATUS COMPLETIONS DURATION AGE centos-job Complete 3/3 27s 31s root@master:~/Getting-Start-Kubernetes/6# kubectl get pods NAME READY STATUS RESTARTS AGE centos-job-2wksx 0/1 Completed 0 30s centos-job-dhk2z 0/1 Completed 0 21s centos-job-n6pxw 0/1 Completed 0 39s
Pod 3개가 정상적으로 완료되었다.
예시4 (parallelism)
# job-exam.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/6# cat 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 5; echo 'Bye'" restartPolicy: Never # restartPolicy: OnFailure # backoffLimit: 3
- completions: 5
이 Job이 성공적으로 완료되어야 하는 파드의 수입니다. 즉, 총 5개의 성공적인 파드가 필요합니다. - parallelism: 2
동시에 실행할 수 있는 파드의 최대 수입니다. 이 경우 최대 2개의 파드가 동시에 실행됩니다.
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml job.batch/centos-job created root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-cmjkt 0/1 Completed 0 8s 192.168.104.34 node2 <none> <none> centos-job-vh7r8 0/1 Completed 0 8s 192.168.104.35 node2 <none> <none> root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-cmjkt 0/1 Completed 0 13s 192.168.104.34 node2 <none> <none> centos-job-tnr9j 1/1 Running 0 4s 192.168.104.37 node2 <none> <none> centos-job-vh7r8 0/1 Completed 0 13s 192.168.104.35 node2 <none> <none> centos-job-xv7xz 1/1 Running 0 4s 192.168.104.36 node2 <none> <none>
pod 2개가 Completed 되자마자, 또 다른 2개가 Running 되는 것을 확인 가능하다.
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-cmjkt 0/1 Completed 0 20s 192.168.104.34 node2 <none> <none> centos-job-tnr9j 0/1 Completed 0 11s 192.168.104.37 node2 <none> <none> centos-job-vh7r8 0/1 Completed 0 20s 192.168.104.35 node2 <none> <none> centos-job-xv7xz 0/1 Completed 0 11s 192.168.104.36 node2 <none> <none> centos-job-zfbrj 0/1 ContainerCreating 0 2s <none> node2 <none> <none> <none> root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-cmjkt 0/1 Completed 0 25s 192.168.104.34 node2 <none> <none> centos-job-tnr9j 0/1 Completed 0 16s 192.168.104.37 node2 <none> <none> centos-job-vh7r8 0/1 Completed 0 25s 192.168.104.35 node2 <none> <none> centos-job-xv7xz 0/1 Completed 0 16s 192.168.104.36 node2 <none> <none> centos-job-zfbrj 1/1 Running 0 7s 192.168.104.38 node2 <none> <none>
또 2개가 Completed되자 마자, 1개가 Running 되는 것을 확인 가능하다.
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-cmjkt 0/1 Completed 0 27s 192.168.104.34 node2 <none> <none> centos-job-tnr9j 0/1 Completed 0 18s 192.168.104.37 node2 <none> <none> centos-job-vh7r8 0/1 Completed 0 27s 192.168.104.35 node2 <none> <none> centos-job-xv7xz 0/1 Completed 0 18s 192.168.104.36 node2 <none> <none> centos-job-zfbrj 0/1 Completed 0 9s 192.168.104.38 node2 <none> <none>
총 5개 Pod가 성공적으로 Completed 되었다.
예시5 (activeDeadlineSeconds)
# job-exam.yaml 파일 생성
root@master:~/Getting-Start-Kubernetes/6# vi 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
activeDeadlineSeconds란, Job이 활성 상태로 유지될 수 있는 최대 시간을 초 단위로 설정한 것이다.
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f job-exam.yaml job.batch/centos-job created root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES centos-job-47sl5 1/1 Terminating 0 7s 192.168.104.39 node2 <none> <none> root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide No resources found in default namespace.
이 Job은 CentOS 7 이미지를 사용하여 "Hello World"를 출력한 후 25초 동안 대기하고 "Bye"를 출력하는 작업을 수행합니다. 그러나 activeDeadlineSeconds가 5초로 설정되어 있어, Job이 시작된 후 5초가 지나면 Kubernetes가 Job을 종료하게 됩니다.
activeDeadlineSeconds 필드는 Job이 시작된 후 최대 실행 시간을 설정합니다.
이 경우 5초로 설정되어 있으므로, Job이 5초 이내에 완료되지 않으면 강제로 종료됩니다.
따라서, Job의 명령어는 25초 동안 실행되므로, Job은 5초 후에 종료됩니다.
'kubernetes' 카테고리의 다른 글
[따배쿠] Service - 개요 (1) 2024.12.07 [따배쿠] Controller - Cronjob (0) 2024.12.07 [따배쿠] Controller - StatefulSet (0) 2024.12.05 [따배쿠] Controller - DaemonSet (0) 2024.12.05 [따배쿠] Controller - Deployment (0) 2024.12.05