본문으로 건너뛰기
버전: 1.0.3

3.3. 잡

어떨 때 쓰는가

  • 배치 작업이 제 시각에 돌았는지 확인할 때
  • 실패한 배치의 로그를 볼 때
  • 정기 작업을 잠시 멈추거나 지금 한 번 실행할 때

Job 과 CronJob

자원하는 일
Job한 번 실행하고 끝나는 작업
CronJob정해진 시각에 Job 을 되풀이해 만드는 것

데이터 정리, 백업, 보고서 생성처럼 계속 떠 있을 필요가 없는 작업에 씁니다.

Deployment 와 다른 점은 끝나는 것을 정상으로 본다 는 것입니다. Deployment 의 파드가 종료되면 다시 띄우지만, Job 의 파드는 성공적으로 끝나면 그대로 둡니다.

CronJob 목록

워크로드 > Cron 작업 으로 들어갑니다.

CronJob 목록
설명
이름CronJob 이름
네임스페이스속한 네임스페이스
일정실행 시각 규칙
중지됨일시 중지 상태인지
마지막 실행가장 최근 실행 시각
경과 시간만든 뒤 지난 시간

마지막 실행 시각이 일정과 맞지 않으면 중지 상태이거나 이전 실행이 아직 끝나지 않은 것입니다.

일정 표기 읽기

일정은 다섯 자리로 적습니다. 왼쪽부터 분, 시, 일, 월, 요일 입니다.

CronJob 일정 표기
표기
0 2 * * *매일 새벽 2시
*/10 * * * *10분마다
0 0 * * 0매주 일요일 0시
0 3 1 * *매달 1일 새벽 3시
0 9-18 * * 1-5평일 9시부터 18시까지 매시 정각
기호
*모든 값
*/NN 마다
A-BA 부터 B 까지
A,BA 와 B

시간대 주의

시각은 클러스터 기준입니다. 표준시(UTC)로 도는 환경에서는 한국 시각과 9시간 차이가 납니다. 0 2 * * * 가 한국 시각 오전 11시에 도는 식입니다.

설치 담당자에게 클러스터 시간대를 확인하십시오. 한국 시각으로 새벽 2시에 돌리려면 UTC 환경에서는 0 17 * * * 로 적어야 합니다.

동시 실행 정책

이전 실행이 아직 끝나지 않았는데 다음 일정이 오면 어떻게 할지 정합니다. 상세 화면에서 확인할 수 있습니다.

정책동작
Allow그냥 함께 돌립니다 (기본값)
Forbid이전 것이 끝날 때까지 건너뜁니다
Replace이전 것을 중단하고 새로 시작합니다

같은 데이터를 고치는 배치는 ForbidReplace 로 두십시오. 기본값인 Allow 로 두면 두 실행이 같은 데이터를 동시에 건드릴 수 있습니다.

만들기 — YAML

apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
namespace: my-app
spec:
schedule: "0 3 * * *" # 매일 03:00 (다섯 자리)
timeZone: "Asia/Seoul" # 없으면 UTC 기준입니다
concurrencyPolicy: Forbid # 이전 실행이 안 끝났으면 건너뜁니다
startingDeadlineSeconds: 300 # 5분 안에 시작 못 하면 그 회차는 포기합니다
successfulJobsHistoryLimit: 3 # 성공 기록 3개만 남깁니다
failedJobsHistoryLimit: 3 # 실패 기록 3개만 남깁니다
jobTemplate:
spec:
backoffLimit: 2 # 실패 시 2번까지 다시 시도합니다
activeDeadlineSeconds: 3600 # 1시간을 넘기면 중단합니다
template:
spec:
restartPolicy: OnFailure # Job 은 Always 를 쓸 수 없습니다
containers:
- name: report
image: registry.example.com/report:1.0
command: ["/bin/sh", "-c", "generate-report.sh"]
항목설명
schedule다섯 자리 입니다. CronHPA(여섯 자리)와 다릅니다(3.5 장)
timeZone적지 않으면 UTC 기준이라 한국 시각과 9시간 차이가 납니다
concurrencyPolicy위 표 참고
startingDeadlineSeconds클러스터가 바빠 제때 시작하지 못했을 때 포기할 시한
backoffLimit한 회차 안에서 재시도할 횟수. 0 이면 재시도하지 않습니다
activeDeadlineSeconds이 시간을 넘기면 중단합니다. 무한 대기 방지
restartPolicyOnFailure(재시작) 또는 Never(파드를 새로 만듦)

timeZone 을 빠뜨리기 쉽습니다. 새벽 3시로 적었는데 낮 12시에 도는 일이 생깁니다.

기록 보관 개수를 정해 두십시오. 기본값이 성공 3·실패 1 이지만, 짧은 주기로 도는 배치는 Job 과 파드가 계속 쌓여 목록을 채웁니다.

한 번만 도는 작업이면 CronJob 이 아니라 Job 을 씁니다.

apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
namespace: my-app
spec:
backoffLimit: 0 # 마이그레이션은 재시도하면 위험합니다
ttlSecondsAfterFinished: 86400 # 끝나고 하루 뒤 자동 삭제
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: registry.example.com/migrate:1.0

데이터를 고치는 작업은 backoffLimit: 0 으로 두십시오. 재시도가 같은 변경을 두 번 적용할 수 있습니다.

실행 결과 확인

상세 화면에서 그동안 만들어진 Job 목록을 봅니다.

  1. Job 이름을 누릅니다.
  2. 그 Job 이 만든 파드로 이어집니다.
  3. 파드에서 로그를 확인합니다(3.1 장).

Job 목록이 비어 있으면 아직 한 번도 실행되지 않았거나, 완료된 것이 정리 설정에 따라 지워진 것입니다.

실패한 실행 다루기

실패한 Job 의 파드는 남아 있어 로그를 볼 수 있습니다. 성공한 실행의 파드는 설정에 따라 자동으로 지워지기도 합니다.

Job 은 실패하면 정해진 횟수만큼 다시 시도합니다. 상세 화면의 재시도 한도를 확인하십시오. 한도를 넘으면 Job 전체가 실패로 표시되고 더 이상 시도하지 않습니다.

증상확인할 것
계속 실패파드 로그. 대개 입력 데이터나 연결 대상 문제
시작조차 안 됨이벤트. 자원 부족이나 이미지 문제
오래 걸려 다음 일정과 겹침동시 실행 정책

임시 실행과 중지

하고 싶은 일방법
일정과 무관하게 지금 한 번 실행상세 화면의 실행 버튼
당분간 실행하지 않기편집에서 중지 항목을 켭니다
다시 실행하기중지 항목을 끕니다

중지 중에 지나간 일정은 나중에 몰아서 실행되지 않습니다. 다시 켜면 다음 일정부터 정상 동작합니다.

배포 직전이나 점검 중에는 배치를 중지해 두는 편이 안전합니다.

기록이 쌓일 때

완료된 Job 을 몇 개까지 남길지 상세 화면에서 설정합니다. 기본값을 넘으면 오래된 것부터 지워집니다.

성공 기록과 실패 기록의 보관 개수를 따로 정할 수 있습니다. 실패 기록은 조사에 필요하므로 성공보다 넉넉히 두는 편이 좋습니다.