CronJob은 Google Kubernetes Engine(GKE) 버전 1.21 이상에서 일반 안정화 버전(GA) 상태입니다. 이 문서에서는 GKE에서 CronJob을 실행하는 방법을 설명합니다. CronJob은 Kubernetes의 내장 기능입니다. 자세한 내용은 CronJob에 대한 Kubernetes 문서를 참조하세요.
개요
CronJob은 반복 일정으로 Kubernetes 작업을 만듭니다. CronJob을 사용하면 백업 작성, 보고서 만들기, 이메일 전송, 삭제 태스크와 같은 일반 태스크를 자동화할 수 있습니다.
CronJob은 작업과 같은 방식으로 생성, 관리, 확장, 삭제됩니다. 생성되는 정확한 작업 객체 수는 몇 가지 요인에 따라 달라집니다. 자세한 내용은 CronJob 제한사항을 참조하세요.
작업에 대한 자세한 내용은 작업 실행을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
CronJob 만들기
매니페스트 파일을 사용하여 CronJob을 만들 수 있습니다. 예를 들어 다음 YAML 매니페스트는 현재 시간 및 문자열을 1분 간격으로 출력하고, CronJob 매개변수에 대해 기본값을 보유합니다.
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello, World!"
restartPolicy: OnFailure
이 CronJob을 만들려면 YAML 매니페스트를 파일에 저장하고 이를 클러스터에 적용합니다.
kubectl apply -f PATH_TO_FILE
PATH_TO_FILE
을 YAML 매니페스트의 경로로 바꿉니다.
CronJob 구성
CronJob을 만들 때 다음 매개변수를 지정할 수 있습니다.
CronJob 실행 시점 지정
spec.schedule
필드는 Unix 표준 crontab
형식을 사용하여 CronJob 실행 시점과 빈도를 정의합니다. 모든 CronJob 시간은 UTC 형식입니다. 공백으로 구분된 5개의 필드가 있습니다.
이러한 필드는 다음을 나타냅니다.
- 분(0~59)
- 시간(0~23)
- 일(1~31)
- 월(1~12)
- 요일(일요일부터 0~6)
spec.schedule
필드에는 다음과 같은 특수문자를 사용할 수 있습니다.
?
는 1개의 문자와 일치하는 와일드카드 값입니다.*
는 0개 이상의 문자와 일치하는 와일드카드 값입니다./
를 사용하면 필드의 간격을 지정할 수 있습니다. 예를 들어 첫 번째 필드(분 필드)의 값이*/5
이면 이는 '5분마다'를 의미합니다. 다섯 번째 필드(요일 필드)가0/5
으로 설정되면 이는 '다섯 번째 일요일마다'를 의미합니다.
CronJob의 실행 항목 지정
spec.jobTemplate
는 컨테이너 이미지, 컨테이너가 실행하는 명령어, CronJob의 재시작 정책 등 CronJob이 수행하는 작업을 설명합니다. spec.jobTemplate
에 포함할 항목에 대한 자세한 내용은 Kubernetes CronJob 문서를 참조하세요.
기한 지정
선택사항인 startingDeadlineSeconds
필드는 어떤 이유로든 예약된 시간을 놓친 경우 CronJob을 시작하는 데 걸리는 최대 시간(초)을 나타냅니다. 시간을 놓친 CronJob은 실패로 간주됩니다.
기한을 지정하려면 매니페스트 파일에서 CronJob의 spec
필드에 startingDeadlineSeconds
값을 추가합니다. 예를 들어 다음 매니페스트는 CronJob이 100초 후 시작되도록 지정합니다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
jobTemplate:
spec:
...
동시 실행 정책 지정
선택사항인 spec.concurrencyPolicy
필드는 CronJob 컨트롤러에서 생성된 작업이 동시에 실행될 경우 이를 처리하는 방법을 지정합니다. 값을 설정하지 않으면 기본적으로 여러 개의 동시 작업이 허용됩니다.
concurrencyPolicy
는 다음 값을 허용합니다.
값 | 의미 |
---|---|
Allow |
동시 작업을 허용합니다. 기본 옵션으로, |
Forbid |
동시 작업을 금지하며, 새 작업은 이전 작업이 완료되거나 기한이 지난 후에 시작할 수 있습니다. |
Replace |
동시 작업을 금지하며 이전 작업은 새 작업으로 인해 취소됩니다. |
후속 실행 정지
선택사항인 spec.suspend
필드가 true
로 설정되면 새 작업이 실행되지 않지만 현재 실행은 완료할 수 있습니다.
기록 제한 지정
CronJob은 작업을 실행할 때마다 Pod를 만듭니다. CronJob 최근 실행의 종료 상태와 개별 Pod의 로그 확인은 CronJob 기록 보기에서 다룹니다.
spec.successfulJobsHistoryLimit
및 spec.failedJobsHistoryLimit
의 값을 지정하면 저장된 CronJob 실행의 성공과 실패 횟수를 구성할 수 있습니다. 기본적으로 successfulJobsHistoryLimit
은 3으로 설정되고 failedJobsHistoryLimit
은 1로 설정됩니다.
예를 들어 다음 매니페스트는 최대 5개의 성공적인 CronJob 실행과 최대 10개의 실패한 CronJob 실행을 저장하도록 GKE에 지시합니다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
각 값을 0
으로 설정하여 성공 또는 실패한 CronJob 실행 기록 보관을 사용 중지할 수 있습니다. 기록 보관을 사용 중지하면 오류 디버깅이 더 어려워질 수 있습니다. 예를 들어 다음 매니페스트는 GKE가 실패한 CronJob 실행만 저장하도록 지시합니다.
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
CronJob 조사
CronJob의 구성을 확인하려면 kubectl describe
를 사용합니다.
kubectl describe cronjob CRONJOB_NAME
CRONJOB_NAME
을 검사할 CronJob의 이름으로 바꿉니다.
CronJob 기록 보기
CronJob은 Pod 내에서 실행됩니다. 기본적으로 Kubernetes는 CronJob의 마지막 3개의 성공 실행과 가장 최근의 실패 작업을 나타내는 종료된 Pod의 로그를 보존합니다. CronJob 기록 제한을 변경하여 이러한 기본값을 변경하거나 사용 중지할 수 있습니다.
CronJob의 기록을 보려면 먼저 모든 Pod를 나열합니다. 완료된 CronJob은 Completed
상태로 표시되고, 실패한 작업은 RunContainerError
, CrashLoopBackOff
또는 실패를 나타내는 또 다른 상태로 표시됩니다.
NAME READY STATUS RESTARTS AGE
hello-1556555640-9bc5r 0/1 Completed 0 3m6s
hello-1556555700-cm6wk 0/1 Completed 0 2m6s
hello-1556555760-62wf5 0/1 Completed 0 66s
hello-1556555820-rl8kl 0/1 Completed 0 5s
hello-failed-1556555820-wrvt2 0/1 RunContainerError 1 5s
특정 CronJob의 로그를 보려면 다음 명령어를 실행합니다.
kubectl logs POD_NAME
POD_NAME
을 검사하려는 포드 이름으로 바꿉니다.
출력은 다음과 비슷합니다.
container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"
CronJob 삭제
CronJob을 삭제하려면 다음 명령어를 실행하세요.
kubectl delete cronjob CRONJOB_NAME
CronJob을 삭제하면 Kubernetes 가비지 수집기가 연관된 작업을 삭제하고 새로운 작업이 시작되지 않도록 방지합니다.
다음 단계
- CronJob에 대한 Kubernetes 문서 읽기
- 일회성 작업 실행 방법 자세히 알아보기