crontab 과 유사하게 Cron 표현식을 사용해 실행 주기를 지정.분 시 일 월 요일0 * * * * → 매 시 정각/5 * * * * → 5분마다 실행0 2 * * 1 → 매주 월요일 새벽 2시apiVersion: batch/v1
kind: CronJob
metadata:
name: sample-cronjob
spec:
schedule: "*/5 * * * *" # 5분마다 실행
suspend: false # false → 정상 동작 / true → 일시 중지
concurrencyPolicy: Forbid # 이전 Job이 끝나야 새 Job 실행
startingDeadlineSeconds: 100 # 실행 지연 허용 시간
successfulJobsHistoryLimit: 3 # 성공 Job 3개까지 기록 유지
failedJobsHistoryLimit: 1 # 실패 Job 1개까지 기록 유지
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello from CronJob"
.spec.schedule.spec.jobTemplate.spec.suspendtrue → CronJob 실행 일시 중지 (새 Job 생성 안 됨)false → 정상 동작 (기본값).spec.startingDeadlineSeconds.spec.concurrencyPolicyAllow: 동시에 여러 Job 실행 허용 (기본값)Forbid: 이전 Job이 끝날 때까지 대기Replace: 실행 중 Job을 종료하고 새 Job으로 교체.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimithistoryLimit)를 넘어가면 오래된 Job은 삭제됨concurrencyPolicy로 제어 필요* * *) → 관리 비용과 부하가 증가기존에는 Job이 Pod를 다시 생성할 때 주로 실패하거나 종료 중(Terminating)인 경우에 새 Pod가 생성되었습니다. 하지만 v1.34부터는 Pod 교체 정책(Pod Replacement Policy) 이 정식으로 GA(General Availability) 상태에 도달하여, CronJob이 생성하는 Job에도 더 세밀한 제어가 가능해졌습니다.
TerminatingOrFailed (기본값) Pod가 종료 중이거나 실패한 경우 새 Pod 생성 가능Failed Pod가 완전히 실패(Failed) 상태일 때만 새 Pod 생성cronjob-success.yaml)apiVersion: batch/v1
kind: CronJob
metadata:
name: success-cronjob
annotations:
email: "gjrjr4545@gmail.com"
spec:
schedule: "*/2 * * * *" # 2분마다 실행
concurrencyPolicy: Forbid # 중복 실행 방지
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: success
image: busybox:1.36.1
args:
- /bin/sh
- -c
- "date; echo 'Success CronJob executed successfully'"
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
resources:
requests:
cpu: "50m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"
kubectl apply -f cronjob-success.yaml
kubectl get cronjobs,pods,jobs
kubectl describe cronjob success-cronjob
# 성공한 파드 조회
kubectl get pods -A --field-selector=status.phase=Succeeded
kubectl logs <pod이름>




apiVersion: batch/v1
kind: CronJob
metadata:
name: fail-cronjob
annotations:
email: "gjrjr4545@gmail.com"
spec:
schedule: "*/2 * * * *" # 2분마다 실행
concurrencyPolicy: Forbid # 중복 실행 방지
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: fail
image: busybox:1.36.1
args:
- /bin/sh
- -c
- "echo 'Fail CronJob executed'; exit 1"
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
resources:
requests:
cpu: "50m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"
kubectl apply -f cronjob-fail.yaml
kubectl get cronjob,pods,jobs
kubectl describe cronjob fail-cronjob
kubectl logs <pod이름>


apiVersion: batch/v1
kind: CronJob
metadata:
name: replacement-cronjob
annotations:
email: "gjrjr4545@gmail.com"
spec:
schedule: "*/3 * * * *" # 3분마다 실행
jobTemplate:
spec:
podReplacementPolicy: Failed # v1.34 GA 기능
template:
spec:
restartPolicy: OnFailure
containers:
- name: fail-test
image: busybox:1.36.1
args:
- /bin/sh
- -c
- "echo 'Test Replacement Policy'; exit 1"
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
resources:
requests:
cpu: "50m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"
kubectl apply -f cronjob-replacement.yamlkubectl get cronjobs
kubectl get pods -w
kubectl describe cronjob replacement-cronjob
안녕하세요. 작성해주신 글 잘 읽었습니다. 혹시 podReplacementPolicy 이 필드가 미치는 영향이 restartPolicy와 어떻게 다른지 알 수 있을까요? 특히
restartPolicy: OnFailure를 사용할 경우 Pod가 재시작될 것 같은데 이 경우엔 podReplacementPolicy을 설정하여도 영향을 받지 않는걸까요?