개요
CKAD 시험에서 출제된 Kubernetes CronJob 문제 풀이를 기록합니다. 특정 스케줄로 동작하는 CronJob을 작성하고, 성공/실패 history 보관 수, activeDeadlineSeconds, restartPolicy 등 세부 옵션을 지정하며, 테스트용 Job도 별도로 생성합니다.
출제 문제
※ 기억에 의존해 복기하는 문제라 오류가 있을 수 있습니다.
참고만 부탁 드립니다.
- 30분 마다 job을 스케쥴 처리할 수 있는 cronjob 생성
- cronjob 이름은 grep, namespace는 devops 사용할 것
- 성공 history는 64개, 실패 history는 160개 보관
- job이 실행되고 8초 이내에 완료 되지 못하면 중단할 것
- pod가 중단 되더라도 재실행 되지 않을 것
- container 이름: busybox
image: busybox:stable,
command: [“grep”, “-i”, “NAMESERVER”, “/etc/resolv.conf”] - cronjob 테스트를 위해 job을 별도로 생성해볼 것
job 이름: grep-test
namespace: devops
해결 방법
# cronjob-grep.yaml 생성
apiVersion: batch/v1
kind: CronJob
metadata:
name: grep
namespace: devops
spec:
schedule: "*/30 * * * *"
successfulJobsHistoryLimit: 64
failedJobsHistoryLimit: 160
jobTemplate:
spec:
activeDeadlineSeconds: 8
template:
spec:
containers:
- name: busybox
image: busybox:stable
imagePullPolicy: IfNotPresent
command: ["grep", "-i", "NAMESERVER", "/etc/resolv.conf"]
restartPolicy: Never
# job-grep-test.yaml 생성
apiVersion: batch/v1
kind: Job
metadata:
name: grep-test
namespace: devops
spec:
activeDeadlineSeconds: 8
template:
spec:
containers:
- name: busybox
image: busybox:stable
imagePullPolicy: IfNotPresent
command: ["grep", "-i", "NAMESERVER", "/etc/resolv.conf"]
restartPolicy: Never
# cronjob 생성 및 상태 확인 $ k apply -f cronjob-grep.yaml $ k get cronjob -n devops $ k describe cronjob -n devops grep # job 생성 및 실행 상태 확인 $ k apply -f job-grep-test.yaml $ k get job -n devops $ k describe job -n devops grep-test $ k get po -n devops # pod의 Completed 상태 확인
CronJob 주요 필드 설명
CronJob은 주기적으로 Job을 생성하는 Kubernetes 리소스입니다. spec.schedule은 Linux cron 문법(*/분 시 일 월 요일)을 따르며, */30 * * * *는 30분마다 실행을 의미합니다. 시험에서는 schedule 문법과 Job/Pod 레벨 옵션을 조합하는 문제가 자주 출제됩니다.
주요 필드와 역할은 다음과 같습니다. successfulJobsHistoryLimit와 failedJobsHistoryLimit는 보관할 완료/실패 Job 수를 제한해 클러스터 리소스 낭비를 방지합니다. jobTemplate.spec.activeDeadlineSeconds는 Job 실행 시작 후 제한 시간이며, 이 시간을 초과하면 실행 중인 Pod를 강제 종료합니다. restartPolicy: Never는 Pod 실패 시 재시작하지 않고 새 Pod를 생성하는 방식으로, 반복 실행 가능한 Job에 적합합니다.
# CronJob 상태 및 다음 실행 시간 확인 kubectl get cronjob grep -n devops # CronJob이 생성한 Job 목록 확인 kubectl get jobs -n devops # 특정 Job이 생성한 Pod 확인 및 로그 조회 kubectl get pods -n devops --selector=job-name=grep-test kubectl logs -n devops -l job-name=grep-test
CronJob을 즉시 테스트하려면 kubectl create job --from=cronjob/grep grep-test -n devops로 기존 CronJob 스펙을 기반으로 Job을 수동 실행할 수 있습니다. 이 방법이 YAML 파일을 별도로 작성하는 것보다 간결하고 오타 위험이 없어 시험 환경에서 유용합니다.
concurrencyPolicy와 startingDeadlineSeconds
CronJob에는 이전 Job이 아직 실행 중일 때 새 Job을 어떻게 처리할지 결정하는 concurrencyPolicy 필드가 있습니다. Allow(기본값)는 동시 실행을 허용하고, Forbid는 이전 Job이 완료될 때까지 새 Job 생성을 건너뜁니다. Replace는 실행 중인 Job을 취소하고 새 Job으로 교체합니다. Job 실행 시간이 스케줄 간격보다 길어질 수 있는 경우 Forbid를 설정해야 중복 실행으로 인한 리소스 낭비를 방지할 수 있습니다.
startingDeadlineSeconds는 스케줄된 시간을 놓쳤을 때 허용하는 지연 시간입니다. 클러스터가 일시적으로 중단되었다가 복구될 때, 누락된 스케줄을 이 시간 안에서 복구 실행합니다. 이 값을 설정하지 않으면 100번 이상 스케줄을 놓친 경우 CronJob 컨트롤러가 Job 생성을 포기하므로, 장기 유지보수 후 복구 시 Jobs가 실행되지 않는 상황에 주의해야 합니다.