Jobs
- Job 은 하나 이상의 pod들이 성공적으로 종료되기 전까지 실행을 반복하는 오브젝트 컨트롤러이다.
- 작업을 수행하는 pod 이 성공적으로 완료되면 pod이 맡은 임무를 성공적으로 완료한 것으로 간주하여 pod을 종료시킨다.
- 또한 Job은 pod들을 병렬적으로 수행하도록 설정할 수 있다.
- Job은 데몬셋, 레플리카셋과 달리 레이블 셀렉터를 사용자가 직접 지정하지 않으며, 컨트롤러에 의해 부여된 고유값인 UID를 레이블 셀렉터로 사용한다.
- Job은 pod
1. 직렬적으로 작업 처리하기 (Non-parallel Job)
apiVersion: batch/v1 ## batch 그룹의 v1 api 사용
kind: Job # Job object 선언
metadata:
name: myapp-job
spec:
template: # Pod 템플릿 내용 정의하기
metadata:
labels: # 여기서의 label은 셀렉터가 아님
app: myapp-job
spec:
restartPolicy: OnFailure
containers:
- name: pi
image: perl:latest
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(1000)"]
Job 에 의해서 pod이 생성되었으며 pod 의 작업이 모두 수행되어서 작업이 완료된 상태로 표시된다.
log를 찍어보면 pod 실행 후 파이에 대한 값이 출력된것을 확인할 수 있다.
2. 병렬적으로 작업 처리하기 (Parallel Job)
apiVersion: batch/v1
kind: Job
metadata:
name: myapp-job-bara
spec:
completions: 3 # 완료할 job의 횟수 3번
parallelism: 3 # 병렬처리할 job의 개수
template:
metadata:
labels:
app: myapp-job-para
spec:
restartPolicy: OnFailure # 다 수행한 job을 다시 실행할 필요는 없음
containers:
- name: pi
image: perl:latest
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(1000)"]
parallelism 필드에 병렬 처리를 할 job의 개수를 적어 준다. 세개의 job을 병렬적으로 실행하는 설정이다.
Job이 실행되는 상황을 보면 pod 3개가 돌아가면서 작업이 진행되고 있다. 즉 병렬처리 되는 것을 확인할 수 있다.
3. Job으로 Pod과 Contianer의 Failure (비정상 종료) 핸들링하기
다음과 같이 Job으로 종료를 핸들링하는 설정파일을 작성할 수 있다.
apiVersion: batch/v1
kind: Job
metadata:
name: myapp-job-atvdl
spec:
backoffLimit: 3 # 재실행 시도 횟수
activeDeadlineSeconds: 3 # 데드라인
template:
metadata:
labels:
app: myapp-job-atvdl
spec:
restartPolicy: OnFailure
containers:
- name: pi
image: perl:latest
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(1000)"]
backoffLimit : Job에 대해 Failure로 처리하기 이전에 재실행을 해 볼 횟수이다. 값을 지정하지 않으면 기본값은 6번이다.
activeDeadLineSeconds : Job을 종료해야 하는 데드라인을 설정하는 것이며 데드라인을 넘어가면 실패한 것으로 간주한다. 데드라인을 넘긴 pod은 종료시키고 재실행시키지 않는다. activeDeadLineSeconds에 의해 종료된 pod은 backoffLimit 설정이 되어있다고 해도 재시작 되지 않는다. 이는 activeDeadLineSeconds의 우선순위가 backoffLimit보다 높기 때문이다.
위의 Job을 실행했을 때 다음과 같은 결과가 나온다. 3초가 경과되서 강제 종료되고 pod도 삭제되었다.
실패처리된 pod은 삭제되고, 재실행되지 않으므로 현재 네임스페이스에 실행중인 pod이 없는 것이다.
CronJob
위의 Job을 한번이 아니라 여러번 반복적으로 수행하고 싶을 때 CronJob 오브젝트 컨트롤러를 사용할 수 있다.
apiVersion: batch/v1 # CronJob이 사용하는 api
kind: CronJob
metadata:
name: myapp-cj
spec:
schedule: "* * * * *" # CronJob 실행 주기를 설정
jobTemplate:
spec:
template:
metadata:
labels:
app: myapp-cj
spec:
restartPolicy: OnFailure # 실패시 재시작
containers:
- name: sleep
image: busybox # utility 를 모아놓은 이미지
command: ["sleep", "60"] # system에서 60초 동안 대기 (sleep)
리눅스 환경의 작업 스케줄링을 하는 Cron 에서 job의 주기를 사용하는 방식과 동일하다
schedule 다음의 필드 순서는 분 시 일 월 요일 이다.
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │ OR sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │
# * * * * *
* 를 모두 지정해주었으므로 Job을 1분마다 실행하도록 설정한 것이다.
실제로 CronJob을 생성했을 때 CronJob의 스케줄링에 의해 pod이 1분마다 생성되고 , 60초동안 대기하고 있다.
참고자료
https://kubernetes.io/docs/concepts/workloads/controllers/job/
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 Volume의 종류와 특징 (0) | 2023.02.17 |
---|---|
[Kubernetes] Service 의 종류 (0) | 2023.02.16 |
[Kubernetes] DaemonSet (데몬셋) (0) | 2023.02.13 |
[Kubernetes] Replication Controller (레플리케이션 컨트롤러) (0) | 2023.02.11 |
[Kubernetes] 컨테이너 프로브 (Container Probe) (0) | 2023.02.11 |