들어가며: 잡이란?
크론잡이란?
크론잡 정의
크론잡 실행 내용
크론잡 고유의 설정과 유의점
크론잡으로 동작시키는 컨테이너를 개발할 때 주의점
들어가며: 잡(Job)이란?
잡(Job) 컨트롤러는 파드(컨테이너)의 애플리케이션(잡)의 실행이 완료/종료되는 것에 초점을 맞춘 컨트롤러입니다.
레플리케이션 컨트롤러, 레플리카셋, 데몬셋은 파드의 애플리케이션이 계속적으로 잘 동작하는 것을 초점으로 맞춘 것에 대비됩니다. 즉, 애플리케이션이 실행되고 실행이 완료되면 파드의 할 일이 끝난 것으로 간주하고 파드를 종료시킵니다.
잡 컨트롤러는 임시(Ad-hoc) 작업 및 배치(Batch) 작업에 유용하게 사용될 수 있습니다.
만약 애플리케이션이 실행되고 있는 중에 노드가 죽거나 파드의 실행이 완료되지 않았다면, 파드를 다시 스케줄링하여 재실행하게 구성할 수 있습니다.
잡에는 단일잡, 다중잡, 병렬잡 등의 특징이 있는데 자세한 내용은 잡 포스팅을 참고하시기 바랍니다.
이처럼 크론잡은 정기적으로 실시되기 때문에 새벽에 DB를 백업을 명령하거나 업데이트를 주기적으로 확인하거나 메일이나 메시지를 주기적으로 보낼 때 사용합니다.
이 문서에서 사용한 실행예제는 클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트를 참고하였습니다.
크론잡(CronJob)이란?
잡 컨트롤러는 잡이 한 번만 실행이 되지만 크론잡 컨트롤러는 주기적으로 잡을 반복 실행할 필요가 있을 때 사용하는 컨트롤러입니다.
리눅스 시스템의 crontab 도구와 기능이 같습니다.
배치 APIGROUP에 속하는 배치 애플리케이션 입니다.
크론잡 정의
# 43_cronjob_j8s.yaml.template
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: batch-app
spec:
schedule: "*/1 * * * *" # min hour day-of-month month day-of-week
jobTemplate:
spec:
template:
spec:
containers:
- name: batch-app
image: ${ECR_HOST}/k8sbook/batch-app:1.0.0
imagePullPolicy: Always
env:
- name: DB_URL
valueFrom:
secretKeyRef:
key: db-url
name: db-config
- name: DB_USERNAME
valueFrom:
secretKeyRef:
key: db-username
name: db-config
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
key: db-password
name: db-config
- name: CLOUD_AWS_CREDENTIALS_ACCESSKEY
valueFrom:
secretKeyRef:
key: aws-accesskey
name: batch-secret-config
- name: CLOUD_AWS_CREDENTIALS_SECRETKEY
valueFrom:
secretKeyRef:
key: aws-secretkey
name: batch-secret-config
- name: CLOUD_AWS_REGION_STATIC
valueFrom:
configMapKeyRef:
key: aws-region
name: batch-app-config
- name: SAMPLE_APP_BATCH_BUCKET_NAME
valueFrom:
configMapKeyRef:
key: bucket-name
name: batch-app-config
- name: SAMPLE_APP_BATCH_FOLDER_NAME
valueFrom:
configMapKeyRef:
key: folder-name
name: batch-app-config
- name: SAMPLE_APP_BATCH_RUN
valueFrom:
configMapKeyRef:
key: batch-run
name: batch-app-config
restartPolicy: OnFailure
- apiVersion: 크론잡의 API 버전
- kind: 크론잡이라는 리소스 타입을 설정
- metadata
- name: 크론잡의 이름
- spec
- schedule: 크론잡 스케줄 정의 (1분마다 실행한다는 의미)
- jobTemplate: 반복 실행되는 잡의 내용
- containers: 컨테이너 이름, 이미지, 환경 변수와 값의 저장소 설정
- env: 환경 변수는 deployment와 달리 여러 개의 시크릿과 컨피그맵에서 값을 가져옴
- restartPolicy: 크론잡을 재시작하는 조건 설정 [Always - (default) 종료/실패 시 항상 재시작 , Onfailure - 실패 시 재시작 (정상 종료 시 재시작x), Never - 재시작 하지 않음]
크론잡에서의 실행 내용
파드를 직접 생성하면 노드가 죽을 시 다른 노드에 생성되지 않고 Service Down 문제가 일어납니다. 이와 같은 문제로 파드를 직접 사용하는 경우는 없어 일반적으로 Deployment, ReplicaSet 과 함께 사용하게 됩니다.
디플로이먼트(레플리카셋)을 생성하면 노드가 죽을 시 파드는 다른 노드에 Recreate 됩니다.
그리고, 파드의 이상이 생긴다면 Restart 하게 됩니다.
이처럼, 하나의 서비스를 지속적으로 운영해야 할 때 디플로이먼트(레플리카셋)을 사용하게 됩니다.
이때, Recreate 와 Restart의 차이점은 Recreate 는 파드의 IP 이름 등이 변경되지만, Restart는 파드는 그대로 있고 파드 안에 컨테이너만 재시동하는 것입니다
크론잡(잡)을 생성하면 노드가 죽을 시 파드는 다른 노드에 Recreate 됩니다.
그리고, 파드 프로세스가 종료된다면 파드는 Finish(종료) 됩니다.
이때 종료는 파드가 사라지는게 아니라 파드는 그래도 있고 사용하는 자원만 반환하는 것 입니다.
크론잡 고유의 설정과 유의점
크론잡은 설정한 스케줄에 따라 잡을 생성하고 잡 정의에 따라 프로그램을 실행합니다.
크론잡 고유의 설정 항목으로 중요한 것은 .spec.schedule 과 .spec.concurrencyPolicy 입니다.
.spec.schedule
잡 실행의 스케줄을 정의하는 것이며 cron과 같이 스페이스로 구분한 문자열로 설정
크론잡에서 설정한 시각은 마스터 노드의 타임존에 따라 달라집니다.
EKS의 경우 타임존으로 UTC 를 사용하므로 주의가 필요합니다.
예시 | 설명 |
* * * * * echo | “1분 마다” |
0 * * * * echo | “1시간 마다” |
30 7 * * 1 echo | “매주 월요일 7:30분” |
0 0 25 12 * echo | “매년 크리스마스 마다” |
0 9-18 * * * echo | “9시부터 18시 까지” |
0 9,12,18 * * * echo | “아침 점심 저녁으로만” |
*/3 * * * * echo | “3으로 나눠 떨어질 때(매 3분마다) (0분 3분 6분 9분…)” |
메타문자 | 설명 |
* | 조건에 대해 무조건 참(True)을 의미 |
- | 범위를 지정할 수 있음 |
, | 다수의 값을 지정할 수 있음 |
/ | 조건에 대한 주기를 지정할 수 있음 |
.spec.concurrencyPolicy
동시 실행 제어로 이전 스케줄링된 잡 실행이 미완료인 상태에서 다음 스케줄 시각에 도달했을 때 어떻게 동작할지를 설정
No | 설정값 | 동작 |
1 | Allow | 동시 실행 허가(Default) |
2 | Forbid | 실행 중인 잡을 남기고 신규 잡 생성은 건너뛰기 |
3 | Replace | 실행 중인 잡을 종료하고 신규로 잡 생성 |
예제 애플리케이션에서는 Forbid 로 설정했기 때문에 이전 실행한 잡이 남아 있을 경우 다음 스케줄 시각이 되어도 새로운 잡이 생성되지 않습니다.
크론잡으로 동작시키는 컨테이너를 개발할 때의 주의점
쿠버네티스 공식 문서를 참고하겠습니다.
이는 기본적으로 CronJob은 한 번의 실행 시점에 Job 하나가 생성되고, 드물기는 하지만 CronJob에서 Job 여러 개가 생성되는(또는 하나도 생성되지 않는) 경우도 있어 Job은 멱등성을 갖도록 작성해야 한다는 의미이다.
cf) 멱등성? 여러번 수행해도 동일한 결과값을 나올 수 있도록 제공되는 형태
(Job이 멱등성을 갖는다는 것은 같은 조건일 경우 Job을 몇 번을 실행해도 같은 상태가 된다는 의미)
이러한 쿠버네티스의 제한 사항이 없다고 해도 batch 애플리케이션은 멱등성을 갖도록 만드는 것이 운영을 고려했을 때 많은 장점을 가지기에 애플리케이션 설계 시 유의해야 합니다.
'Kubernetes > 05. 컨트롤러 종류 및 설명' 카테고리의 다른 글
[쿠버네티스] EKS를 활용한 디플로이먼트와 하위에 생성되는 레플리카셋 (0) | 2021.08.21 |
---|---|
[쿠버네티스] k8s 잡(Job) 컨트롤러란? 단일잡, 다중잡, 병렬잡 (0) | 2021.06.28 |
[쿠버네티스] k8s 레플리카셋(ReplicaSet) 이란? & 레플리케이션 컨트롤러와의 비교 (0) | 2021.06.27 |
[쿠버네티스] k8s 스테이트풀셋을 이용한 MySQL 백업 복제본 구성 (4) | 2021.06.25 |
[쿠버네티스] 쿠버네티스 스테이트풀셋 (StatefulSet) 소개 및 관리 (2) | 2021.06.25 |