CronJobs


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개의 필드가 있습니다. 이러한 필드는 다음을 나타냅니다.

  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이 수행하는 작업을 설명합니다. 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.successfulJobsHistoryLimitspec.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 가비지 수집기가 연관된 작업을 삭제하고 새로운 작업이 시작되지 않도록 방지합니다.

다음 단계