목차

Kubernetes Job & CronJob

  • Job는 Pod와 같은 종류지만, Pod와 다르게 특정 작업만 수행하고 종료된다.
  • Job는 일회성 및 일괄 작업 실행에 적합, CronJob은 반복작업 예약하는데 사용
  • Job은 작업을 정의하고 완료될 때까지 실행되도록 보장, 하나 이상의 Pod의 수명 주기를 관리하여 원하는 성공횟수가 도달할때 까지 관리
  • CronJob리소스는 사전 정의된 일정(매시, 일일, 주간, 월간 등)에 따라 Job 생성
  • CronJob에 의해 생성된 각 Job은 특정작업 또는 작업 집합을 Pod로 실행
    • 백업, 보고서 생성 등과 같은 정기적인 예약 작업을 수행하기 위해
    • 작업을 시작해야하는 특정 시점이 존재하는 경우
    • 리눅스 cronjob과 동일 한 스케쥴 작성( 분, 시, 일, 월, 요일)

  • 매주 금요일 22시 30분에 backup.sh를 실행 → 30 22 * * 5 /bin/bash /root/backup.sh
  • 1 ~ 8월 까지 2개월마다 1일 12시 → 00 12 1 1-10/2 *
$ kubectl create job nodeversion --image node -- node -v
job.batch/nodeversion created

$ kubectl get po,job | grep node
pod/nodeversion-rgfqz                   0/1     Completed   0          2m56s
job.batch/nodeversion   1/1           45s        2m56s

#로그 확인
$ kubectl logs  nodeversion-rgfqz
v21.7.3

#job 정보 확인
$ kubectl describe job nodeversion
...
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  3m51s  job-controller  Created pod: nodeversion-rgfqz
  Normal  Completed         3m6s   job-controller  Job completed

#job.yaml 생성
$ kubectl create job hello-job --image=busybox --dry-run=client -o yaml -- echo "Hello I'm running job" > job-cronjob.yaml
#내용
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: hello-job
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - echo
        - Hello I'm running job
        image: busybox
        name: hello-job
        resources: {}
      restartPolicy: Never
status: {}

#현재 진행되고 있는 job 확인
$ kubectl get jobs.batch -w
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: hello-job
spec:
  activeDeadlineSeconds: 15  # 작업이 실행될 시간, 시간전까지 완료된 작업만 유지 나머지 작업은 종료
                              # 15초에 완료 작업 2개 진행, 3개라하면 3개 terminate
  parallelism: 5   # 병렬로 실행할 최대 Pod수 - 이부분 없을 시 순차 실행
  completions: 10  # 원하는 Pod 수 지정, 하나씩 완료될때 까지 관리
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - echo
        - Hello I'm running job
        image: busybox
        name: hello-job
        resources: {}
      restartPolicy: Never
status: {}
$ kubectl create cronjob hello-date-1m --image=busybox \
--schedule='*/1 * * * *' --dry-run=client -o yaml \
-- /bin/sh -c "date && echo 'Hello from the Kubernetes cluster'" > hello-date-1m.yaml
#내용
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: hello-date-1m
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: hello-date-1m
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
          - command:
            - /bin/sh
            - -c
            - date && echo 'Hello from the Kubernetes cluster'
            image: busybox
            name: hello-date-1m
            resources: {}
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'
status: {}

$ kubectl apply -f hello-date-1m.yaml

#분마다 실행 된 것을 확인 가능
$ kubectl get cj,po | grep hello
cronjob.batch/hello-date-1m   */1 * * * *   False     0        58s             3m37s
pod/hello-date-1m-28555604-ddrb7        0/1     Completed   0          2m58s
pod/hello-date-1m-28555605-ncxdk        0/1     Completed   0          118s
pod/hello-date-1m-28555606-tznpl        0/1     Completed   0          58s
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: hello-date-1m
spec:
  schedule: '*/1 * * * *'         # 리눅스 cronjob와 같은 형식
  successfulJobsHistoryLimit: 5   # 기본값 3. CronJob 컨트롤러가 성공한 마지막 작업기록 갯수
  failedJobsHistoryLimit: 5       # 실패한 마지막 작업기록 작업갯수 지정
  concurrencyPolicy: Allow        # 동시 작업 실행을 처리하는 방법 지정
                                  # Allow: 동일한 작업 동시실행 허용
                                  # Forbid: 동일한 작업이 순차적으로 실행되는 경우 동시실행 방지
                                  # Replace: 현재 실행 중인 작업취소하고 새작업으로 대체
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: hello-date-1m
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
          - command:
            - /bin/sh
            - -c
            - date && echo 'Hello from the Kubernetes cluster'
            image: busybox
            name: hello-date-1m
            resources: {}
          restartPolicy: OnFailure