CronJobs

이 페이지에서는 Google Kubernetes Engine에서 CronJob을 실행하는 방법을 설명합니다. CronJob은 Kubernetes의 기본 기능입니다. 자세한 내용은 CronJob에 대한 Kubernetes 문서를 참조하세요.

개요

CronJob을 사용하여 지정한 시간에 한 번 또는 주기적으로 태스크를 실행할 수 있습니다. CronJob은 백업, 보고, 이메일 전송, 삭제 태스크와 같이 자동으로 수행되는 태스크에 적합합니다.

CronJob은 해당 태스크를 완료하기 위해 작업 객체를 사용합니다. CronJob은 작업을 실행할 때마다 작업 객체를 만듭니다. CronJob은 작업과 같은 방식으로 생성, 관리, 확장, 삭제됩니다. 작업에 대한 자세한 내용은 작업 실행을 참조하세요.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

CronJob 만들기

다음은 현재 시간과 문자열을 1분마다 출력하는 CronJob의 예시입니다.

# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/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 [FILENAME]을 사용하여 이를 클러스터에 적용합니다.

다음 섹션에서는 CronJob 실행 시점실제 실행 항목에 대해 더 자세히 다룹니다.

CronJob 실행 시점 지정

spec.schedule 필드는 Unix 표준 crontab 형식을 사용하여 CronJob 실행 시점과 빈도를 정의합니다. 모든 CronJob 시간은 UTC 형식입니다. 공백으로 구분된 5개의 필드가 있습니다. 이러한 필드는 다음을 나타냅니다.

  1. 분(0~59)
  2. 시간(0~23)
  3. 일(1~31)
  4. 월(1~12)
  5. 요일(0~6)

spec.schedule 필드에는 다음과 같은 특수문자를 사용할 수 있습니다.

  • ?는 1개의 문자와 일치하는 와일드카드 값입니다.
  • *는 0개 이상의 문자와 일치하는 와일드카드 값입니다.
  • /를 사용하면 필드의 간격을 지정할 수 있습니다. 예를 들어 첫 번째 필드(분 필드)의 값이 */5이면 이는 '5분마다'를 의미합니다. 다섯 번째 필드(요일 필드)가 0/5로 설정되면 이는 '다섯 번째 일요일마다'를 의미합니다.

CronJob의 실행 항목 지정

spec.jobTemplate는 컨테이너 이미지, 컨테이너가 실행하는 명령어, CronJob의 재시작 정책 등 CronJob이 수행하는 작업을 설명합니다.

기한 지정

선택사항인 startingDeadlineSeconds 필드는 어떤 이유로든 예약된 시간을 놓친 경우 CronJob을 시작하는 데 걸리는 최대 시간(초)을 나타냅니다. 시간을 놓친 CronJob은 실패로 간주됩니다.

기한을 지정하려면 매니페스트 파일에서 CronJob의 spec 필드에 startingDeadlineSeconds 값을 추가합니다. 예를 들어 다음 매니페스트는 CronJob이 100초 후 시작되도록 지정합니다.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

startingDeadlineSeconds 값을 지정하지 않으면 CronJob에 만료 기한이 없습니다. 이로 인해 동일한 CronJob이 동시에 여러 번 실행될 수 있습니다. 이 유형의 문제를 방지하려면 동시 실행 정책 지정을 참조하세요.

동시 실행 정책 지정

선택사항인 spec.concurrencyPolicy 필드는 CronJob 컨트롤러에서 생성된 작업이 동시에 실행될 경우 이를 처리하는 방법을 지정합니다. 값을 설정하지 않으면 기본적으로 여러 개의 동시 작업이 허용됩니다.

concurrencyPolicy는 다음 값을 허용합니다.

의미
Allow 동시 작업을 허용합니다. 기본값입니다.
Forbid 동시 작업을 금지하며, 새 작업은 이전 작업이 완료되거나 기한이 지난 후에 시작할 수 있습니다.
Replace 동시 작업을 금지하며 이전 작업은 새 작업으로 인해 취소됩니다.

후속 실행 일시 중단

선택사항인 spec.suspend 필드가 true로 설정되면 새 작업이 실행되지 않지만 현재 실행은 완료할 수 있습니다.

기록 제한 지정

CronJob은 작업을 실행할 때마다 Pod를 만듭니다. CronJob 최근 실행의 종료 상태와 개별 Pod의 로그 확인은 CronJob 기록 보기에서 다룹니다.

spec.successfulJobsHistoryLimitspec.failedJobsHistoryLimit의 값을 지정하면 저장된 CronJob 실행의 성공과 실패 횟수를 구성할 수 있습니다. 기본적으로 successfulJobsHistoryLimit은 3으로 설정되고 failedJobsHistoryLimit은 1로 설정됩니다.

성공 또는 실패한 작업에 대한 데이터 보관을 사용 중지하려면 해당 값을 0으로 설정합니다. 단, 이 경우 디버깅 오류가 더 어려워질 수 있습니다.

CronJob 조사

CronJob의 구성을 확인하려면 kubectl describe를 사용합니다.

kubectl describe cronjob [CRON_JOB]

CronJob 기록 보기

CronJob은 Pod 내에서 실행됩니다. 기본적으로 Kubernetes는 CronJob의 마지막 3개의 성공 실행과 마지막 1개의 실패 작업을 나타내는 종료된 Pod의 로그를 보존합니다. 이러한 기본값은 변경하거나 사용 중지할 수 있습니다.

CronJob의 기록을 보려면 먼저 모든 Pod를 나열하세요. 완료된 CronJob은 Completed 상태로 표시되고, 실패한 작업은 RunContainerError, CrashLoopBackOff 또는 실패를 나타내는 또 다른 상태로 표시됩니다.

kubectl get pods

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의 로그를 보려면 Pod 이름에 kubectl get logs를 사용합니다.

kubectl get logs hello-failed-1556555820-wrvt2

container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"

CronJob 삭제

CronJob을 삭제하려면 kubectl delete를 사용합니다.

kubectl delete cronjob [CRON_JOB]

CronJob을 삭제하면 Kubernetes 가비지 수집기가 연관된 작업을 삭제하고 새로운 작업이 시작되지 않도록 방지합니다.

다음 단계