레플리카셋
과 데몬셋
은 작업의 완료를 고려하지 않고 계속 테스크를 실행한다. 이런 파드의 프로세스는 종료되면 다시 시작된다. 그러나 완료 가능한 태스크에서는 프로세스가 종료된 후 다시 시작하면 안된다.
Job (출처: aws.plainenglish.io/kubernetes-deep-dive-job-and-cronjob-5ffed1c5fa4e)
🔎 컨트롤러: 기본 오브젝트를 생성하고 이를 관리하는 역할로, 대표적으로 ReplicaSet, DeamonSet, StatefulSet, Job, Deployment 등이 있다.
잡은 하나 이상의 파드를 지정하고 지정된 수의 파드를 성공적으로 실행하고 종료하도록 한다. 즉, 내부에서 실행중인 프로세스가 성공적으로 완료되면 컨테이너가 다시 시작되지 않도록 하는 파드를 실행할 수 있다.
백업이나 특정 배치 파일들처럼 한번 실행하고 종료되는 성격의 작업에 사용될 수 있다.
노드 장애가 발생하면 잡이 관리하는 해당 노드의 파드는 레플리카셋의 파드와 같은 방식으로 다른 노드로 재스케줄된다. 잡은 프로세스 자체에 오류가 발생한 경우 컨테이너를 다시 시작하도록 구성할 수 있다.
apiVersion: batch/v1 # 잡은 batch api 그룹의 버전 v1에 있다
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never # 파드의 재시작 정책 설정
backoffLimit: 4 # 재시도 횟수 설정
activeDeadlineSeconds: 100 # 파드의 실행시간 설정
파이(π)의 2000자리까지 계산해서 출력한다.
🔎 restartPolicy 옵션: 파드의 재시작 정책을 설정한다.
🔎 backoffLimit 옵션: 잡에 실패할 경우 다시 실행시킬 재시도 횟수를 지정한다. 기본값은 6이다. 보통 잡 컨트롤러가 재시작을 관리할 떄마다 시간 간격을 늘린다. 처음 재시작 실패후 10초를 기다린 후 시도하고 그 다음은 20초, 40초 이런 방식으로 계속 재시작 대기 시간을 늘린다.
🔎 activeDeadlineSeconds 옵션: 파드의 실행 시간을 지정한다. 파드가 이보다 오래 실행되면 시스템은 파드를 종료하려고 시도하고 잡을 실패한 것으로 표시한다.
$ kubectl apply -f job.yaml
$ kubectl describe jobs/pi
Name: pi
Namespace: default
Selector: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
job-name=pi
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4,"template":...
Parallelism: 1
Completions: 1
Start Time: Mon, 02 Dec 2019 15:20:11 +0200
Completed At: Mon, 02 Dec 2019 15:21:16 +0200
Duration: 65s
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
job-name=pi
Containers:
pi:
Image: perl
Port: <none>
Host Port: <none>
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 14m job-controller Created pod: pi-5rwd7
위와 같이 Start Time
, Completed At
, Duration
, Pod Statuses
항목을 보면 65초 동안 파드를 성공적으로 실행하고 정상적으로 종료했다는 것을 확인할 수 있다.
# 원주욜 계산 결과 확인
$ kubectl logs pi-5rwd7
3.14159265358979323846264338327950288419716939937510582097494459230781640628620...
잡은 두 개 이상의 파드 인스턴스를 만들고 병렬 또는 순차적으로 실행하도록 구성할 수 있다. 잡 스펙의 completions
와 parallelism
속성을 설정해 수행한다.
정상적으로 실행 종료되어야 하는 파드 개수를 정의한다. 기본값은 1이다.
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 5 # 실행 종료되어야 하는 파드 수 설정
template:
spec:
...
이 잡은 다섯 개의 파드를 차례대로 실행한다. 처음에는 하나의 파드를 만들고 파드 컨테이너가 완료되면 두 번째 파드를 만들고 다섯 개의 파드가 성공적으로 완료될 때까지 계속한다. 파드 중 하나가 실패하면 잡이 새 파드를 생성하기 때문에 전체적으로 보면 다섯 개 이상의 파드를 생성할 수 있다.
동시에 몇 개의 파드가 실행되어도 괜찮은지를 정의한다. 기본값은 1이고 0으로 설정하면 잡을 정지할 수 있다.
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 5
parallelism: 2 # 잡 병렬성 관리
template:
spec:
...
이 잡은 2개의 파드를 만들어 병렬로 실행하며 5개의 파드를 성공적으로 완료해야 한다. 그 중 하나가 끝나면 잡은 다섯 개의 파드가 성공적으로 끝날 때까지 다음 파드를 실행한다.
잡이 정상적으로 실행 종료되면 파드가 새로 생성되지도 삭제되지도 않는다. 또한 잡도 남아 있다. 파드나 잡이 삭제되지 않고 남아 있으면 로그에서 에러나 경고를 확인할 수 있고 잡의 상태도 계속해서 확인할 수 있다.
.spec.activeDeadlineSeconds
필드에 시간을 설정하면, 지정된 시간에 해당 잡 실행을 강제로 끝내면서 모든 파드 실행도 종료한다.
🧩 잡 삭제
잡을 삭제하면 관련된 파드들도 같이 삭제된다.
$ kubectl delete job 잡이름
잡의 일반적인 사용 패턴은 다음과 같다.
작업마다 잡을 하나씩 생성해 사용하는 것보다는 모든 작업을 관리하는 잡 하나를 사용하는 것이 좋다. 잡을 생성하는 오버헤드가 크기 때문에, 작업이 많아질수록 잡 하나가 여러개 작업을 처리하는 것이 좋다.
작업 개수만큼의 파드를 생성하는 것보다 파드 하나가 여러 개의 작업을 처리하는 것이 좋다. 파드를 생성하는 오버헤드도 크기 때문에 작업이 많아질수록 파드 하나가 여러 개 작업을 처리하는 것이 유리하다.
CronJob (출처: junior-developer.tistory.com/66)
잡 리소스는 생성될 때 즉시 파드를 실행한다. 그러나 많은 배치 작업은 앞으로 특정 시간에 실행되거나 지정된 간격으로 반복적인 실행이 필요한 경우가 있다. 리눅스 같은 OS에서 이런 작업은 cron 작업으로 알려져있다. k8s도 이와 동일한 작업을 지원한다.
잡을 시간 기준으로 관리한다. 지정한 시간에 한번만 잡을 실행하거나, 지정한 시간동안 주기적으로 잡을 반복하는 작업에서 사용한다.
설정된 스케줄에 따라 크론잡에 구성된 잡 템플릿에 따라 잡 리소스를 생성한다. 잡 리소스가 생성되면 하나 이상의 파드 복제본이 생성되고 잡의 파드 템플릿에 따라 시작된다. 기본적으로 CronJob은 Job과의 설정과 크게 다르지 않다. 다른 점은 스케줄로 주기를 설정하는 부분이다.
apiVersion: batch/v1 # API 그룹은 batch이다.
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" # 매 1분마다 실행
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
매 1분마다 현재 시간과 hello 메시지를 출력한다.
# ┌───────────── 분 (0 - 59)
# │ ┌───────────── 시 (0 - 23)
# │ │ ┌───────────── 일 (1 - 31)
# │ │ │ ┌───────────── 월 (1 - 12)
# │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일부터 토요일까지;
# │ │ │ │ │ 특정 시스템에서는 7도 일요일)
# │ │ │ │ │ 또는 sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │
# * * * * *
> "2시간마다"라고 지정하고 싶으면, 간단히 */2를 사용하면 된다.
항목 | 설명 | 상응 표현 |
---|---|---|
@yearly | 매년 1월 1일 자정에 실행 | 0 0 1 1 * |
@monthly | 매월 1일 자정에 실행 | 0 0 1 * * |
@weekly | 매주 일요일 자정에 실행 | 0 0 * * 0 |
@daily | 매일 자정에 실행 | 0 0 * * * |
@hourly | 매시 0분에 시작 | 0 * * * * |
🧩 크론 잡의 스케줄 설정 확인
$ kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * false 1 11s 15s
SUSPEND
: 크론잡이 정지되었는지 나타낸다.ACTIVE
: 현재 실행중인 잡이 있는지를 나타낸다.LAST SCHEDULE
: 마지막으로 잡을 실행한 후 어느정도 시간이 지났는지 나타낸다.🧩 크론 잡이 실행한 잡 확인
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
hello-4111706356 0/1 0s
hello-4111706356 0/1 0s 0s
hello-4111706356 1/1 5s 5s
크론잡 이름이 hello 뒤에 숫자가 붙은 잡들이 실행된 것을 확인할 수 있다.
COMPLETIONS
: 작업이 성공적으로 완료한 횟수/총 작업 횟수DURATION
: 작업을 성공적으로 완료하는 데 걸린 시간$ kubectl delete cronjobs 크론잡이름
크론잡이 생성했던 잡과 파드까지 한꺼번에 삭제된다.
잡(Job)은 1회성 작업을 할 때 사용하며, 크론잡(CronJob)은 주기적인 배치 작업을 실행할 때 사용한다.
References