3.3. 잡
어떨 때 쓰는가
- 배치 작업이 제 시각에 돌았는지 확인할 때
- 실패한 배치의 로그를 볼 때
- 정기 작업을 잠시 멈추거나 지금 한 번 실행할 때
Job 과 CronJob
| 자원 | 하는 일 |
|---|---|
| Job | 한 번 실행하고 끝나는 작업 |
| CronJob | 정해진 시각에 Job 을 되풀이해 만드는 것 |
데이터 정리, 백업, 보고서 생성처럼 계속 떠 있을 필요가 없는 작업에 씁니다.
Deployment 와 다른 점은 끝나는 것을 정상으로 본다 는 것입니다. Deployment 의 파드가 종료되면 다시 띄우지만, Job 의 파드는 성공적으로 끝나면 그대로 둡니다.
CronJob 목록
워크로드 > Cron 작업 으로 들어갑니다.

| 열 | 설명 |
|---|---|
| 이름 | CronJob 이름 |
| 네임스페이스 | 속한 네임스페이스 |
| 일정 | 실행 시각 규칙 |
| 중지됨 | 일시 중지 상태인지 |
| 마지막 실행 | 가장 최근 실행 시각 |
| 경과 시간 | 만든 뒤 지난 시간 |
마지막 실행 시각이 일정과 맞지 않으면 중지 상태이거나 이전 실행이 아직 끝나지 않은 것입니다.
일정 표기 읽기
일정은 다섯 자리로 적습니다. 왼쪽부터 분, 시, 일, 월, 요일 입니다.
| 표기 | 뜻 |
|---|---|
0 2 * * * | 매일 새벽 2시 |
*/10 * * * * | 10분마다 |
0 0 * * 0 | 매주 일요일 0시 |
0 3 1 * * | 매달 1일 새벽 3시 |
0 9-18 * * 1-5 | 평일 9시부터 18시까지 매시 정각 |
| 기호 | 뜻 |
|---|---|
* | 모든 값 |
*/N | N 마다 |
A-B | A 부터 B 까지 |
A,B | A 와 B |
시간대 주의
시각은 클러스터 기준입니다. 표준시(UTC)로 도는 환경에서는 한국 시각과 9시간 차이가
납니다. 0 2 * * * 가 한국 시각 오전 11시에 도는 식입니다.
설치 담당자에게 클러스터 시간대를 확인하십시오. 한국 시각으로 새벽 2시에 돌리려면 UTC
환경에서는 0 17 * * * 로 적어야 합니다.
동시 실행 정책
이전 실행이 아직 끝나지 않았는데 다음 일정이 오면 어떻게 할지 정합니다. 상세 화면에서 확인할 수 있습니다.
| 정책 | 동작 |
|---|---|
| Allow | 그냥 함께 돌립니다 (기본값) |
| Forbid | 이전 것이 끝날 때까지 건너뜁니다 |
| Replace | 이전 것을 중단하고 새로 시작합니다 |
같은 데이터를 고치는 배치는 Forbid 나 Replace 로 두십시오. 기본값인 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 | 이 시간을 넘기면 중단합니다. 무한 대기 방지 |
restartPolicy | OnFailure(재시작) 또는 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 목록을 봅니다.
- Job 이름을 누릅니다.
- 그 Job 이 만든 파드로 이어집니다.
- 파드에서 로그를 확인합니다(3.1 장).
Job 목록이 비어 있으면 아직 한 번도 실행되지 않았거나, 완료된 것이 정리 설정에 따라 지워진 것입니다.