Kubernetes

워크로드 API 카테고리(크론잡)

jih0ssang 2024. 1. 20. 11:24

워크로드 API 카테고리

컨테이너 실행에 관련된 리소스

- 파드

- 레플리케이션 컨트롤러

- 레플리카셋

- 디플로이먼트

- 데몬셋

- 스테이트풀셋

- 잡

- 크론잡

 

크론잡(cronjob)

크론잡과 잡의 관계는 디플로이먼트와 레플리카셋의 관계와 비슷하다.

즉, 크론잡이 잡을 관리, 잡이 파드를 관리하는 3계층 구조라고 할 수 있다.

 

 

크론잡 생성

spec.schedule에는 Cron과 같은 형식으로 시간을 지정할 수 있다.

apiVersiion: batch/v1beta1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  startingDeadlineSeconds: 30
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 3
  suspend: false
  jobTemplate:
    spec:
      completions: 1
      parallelism: 1
      backoffLimit: 0
      template:
        spec:
          containers:
          - name: tools-container
            image: amsy810/random-exit:v2.0
          restartPolicy: Never

manifest로 잡을 생성한다.

 

# 크론잡 생성
$ kubectl apply -f sample-cronjob.yaml
cronjob.batch/sample-cronjob created

 

# 크론잡 확인
$ kubectl get jobs
NAME	        SCHEDULE     SUSPEND  ACTIVE  LAST SCHEDULE AGE
sample-cronjob  */1 * * * *  False    0       <none>        1s

# 스케줄 시간이 되지 않은 경우 잡이 존재하지 않음
$ kubectl get jobs
No resources found in default namespace.

크론잡 생성 직후에는 아직 잡이 생성되지 않아 ACTIVE한 잡이 존재하지 않는 상태다.

 

# LAST SCHEDULE이 업데이트됨
$ kubectl get cronjobs
NAME	        SCHEDULE     SUSPEND  ACTIVE  LAST SCHEDULE AGE
sample-cronjob  */1 * * * *  False    1       8s           43s

# 크론잡이 생성한 잡이 존재
$ kubectl get jobs
NAME	               COMPLETIONS    DURATION AGE
sample-cronjob-161702  0/1            14S      14s

지정한 시간이 되면 크론잡이 잡을 생성하는 것을 확인할 수 있다.

 

크론잡 일시 정지

크론잡을 suspend(일시 정지)하려면 spec.suspend가 true로 설정되어 있으면 스케줄 대상에서 제외된다.

기본값은 false로 되어있다.

크론잡을 일시 정지하는 방식에는

  • manifest를 수정하고 kubectl apply 명령어를 다시 실행
  • kubectl patch 명령어 사용

총 두가지가 있다.

 

# 클라이언트에서 크론잡 일시 정지 실행
$ kubectl patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}'
cronjob.batch/sample-cronjob patched

 

# 크론잡이 일시 정지한 상태
$ kubectl get cronjobs
NAME	        SCHEDULE     SUSPEND  SUSPEND  ACTIVE LAST SCHEDULE AGE
sample-cronjob  */1 * * * *  False    True     0      71s           106s

실행 후 크론잡을 확인해보면 SUSPEND 부분이 True로 변경되고 더는 잡이 생성되지 않는다.

다시 스케줄링하고 싶을 경우 spec.suspend를 false로 변경한다.

 

크론잡을 임의의 시점에 실행

--from 옵션을 사용하여 크론잡으로 잡을 생성할 수도 있다.

정기적 실행 이외의 시점에 잡을 생성하고 싶은 경우에는 이 방법을 사용한다.

$ kubectl create job sample-job-from-cronjob --from cronjob/sample-cronjob
job.batch/sample-job-from-cronjob created

 

동시 실행 제어

크론잡에서는 잡을 생성하는 특성상 동시 실행에 대한 정책을 설정할 수 있다.

잡 실행은 동시 실행이 아닌, 이전 잡이 정상 종료 후, 다음 새로운 잡을 실행하는 방식이다.

하지만 기존 잡이 아직 실행하고 있을 때는 정책으로 새로운 잡을 실행하도록 제어할 수도 있다.

 

동시 실행에 대한 정책은 spec.concurrencyPolicy에 지정한다. 설정 가능한 값은 다음과 같다.

정책 개요
Allow(기본값) 동시 실행에 대한 제한을 하지 않음
Forbid 이전 잡이 종료되지 않았을 경우 다음 잡은 실행하지 않음
(동시 실행X)
Replace 이전 잡을 취소하고 잡을 시작

 

Allow

기본값은 Allow가 설정되어 있고, 이전에 실행된 잡의 상태와 관계없이 새로운 잡을 계속 생성한다.

 

Forbid

이전 잡이 아직 실행 중인 경우 신규 잡을 생성하지 않는다.

 

Replace

이전 잡이 아직 실행 중인 경우, 이전 잡을 중지하고 신규 잡을 생성한다.

이전 잡을 중지할 때, 이전 잡의 레플리카 수를 0으로 변경하여 삭제 처리한다.

 

실행 시작 기한 제어

크론잡은 지정한 시간이 되면 쿠버네티스 마스터가 잡을 생성한다. 

만약 쿠버네티스 마스터가 일시적으로 정지되는 경우 등과 같이 시작 시간이 지연되면 그 지연시간을 허용하는 시간을 지정할 수 있다.

예를 들어 매시 00분에 시작하는 잡을 '매시 00~05분에만 실행 가능'으로 설정할 경우 300초(5*60)로 설정해야 한다.

기본값에서는 시작 시간이 아무리 늦어져도 잡을 생성하게 되어있다.

 

크론잡 이력

크론잡 설정 항목에는 이외에도

저장할 잡 개수를 지정하는 설정값이

  • spec.successfulJobHistoryLimit : 성공한 잡을 저장하는 개수
  • spec.failedJobsHistoryLimit : 실패한 잡을 저장하는 개수

두 가지가 있다.

이 설정값은 크론잡이 생성할 잡을 몇 개 유지할지를 지정한다.

잡이 남아있다는 것은 잡에 연결된 파드도 'Completed(정상 종료)', 'Error(이상 종료)'의 상태로 남아 있고

kubectl log 명령어로 로그를 확인할 수 있다는 의미이다.

 

그러나 실제 운영 환경에서는 컨테이너 로그를 외부 로그 시스템을 통해 운영하는 것을 추천한다.

로그를 별도 로그 시스템으로 수집하면 kubectl 명령어로 로그를 확인할 필요도 없고 가용성이 높은 환경에 로그를 저장할 수 있다.

 

# 크론잡이 생성한 잡 확인(일정 시간 경과 후)
$ kubectl get jobs
NAME	           COMPLETIONS   SUSPEND  AGE
sample-cronjob-106  1/1          2s       8m45s  # 성공 5
sample-cronjob-160  1/1          2s       7m45s  # 성공 4
sample-cronjob-171  1/1          1s       6m44s  # 성공 3
sample-cronjob-190  1/1          1s       5m44s  # 성공 2
sample-cronjob-196  0/1          3m44s    3m44s  # 실패 2
sample-cronjob-201  0/1          2m44s    2m44s  # 실패 1
sample-cronjob-260  1/1          1s       104s   # 성공 1
sample-cronjob-311  0/1          43s      43s    # 현재 실행 중

다음 예제는 successfulJobsHistoryLimit를 5, failedJobsHistoryLimit을 3으로 설정한 크론잡이 생성한 잡 목록이다.

이 두 설정값을 0으로 설정한 경우 잡은 종료시 즉시 삭제된다.

기본 설정값은 두 파라미터 모두 3이다.

 

# 크론잡이 생성한 파드 확인(일정 시간 경과 후)
$ kubectl get pods
NAME	           READY   STATUS   RESTARTS  AGE
sample-cronjob-106  0/1    Completed  0      9m32s 
sample-cronjob-160  0/1    Completed  0      8m32s
sample-cronjob-171  0/1    Completed  0      7m31s 
sample-cronjob-190  0/1    Completed  0      6m31s
sample-cronjob-196  0/1    Error      0      3m31s 
sample-cronjob-201  0/1    Completed  0      2m31s 
sample-cronjob-260  0/1    Error      0      90s  
sample-cronjob-311  0/1    Error      0      30s

잡 리소스가 남아있기 때문에 잡에 연결된 파드도 남아있다.

 

# 크론잡이 생성한 잡 확인(일정 시간 경과 후)
$ kubectl logs sample-cronjob-311
Failed

# 2분 전에 성공한 잡의 파드 확인
$ kubectl logs sample-cronjob-201
Succeeded

이력에 남아있는 파드 로그는 kubectl 명령어로 확인할 수 있다.

쿠버네티스 대시보드 등과 함께 사용하면 jenkins처럼 잡의 실행 결과나 로그를 UI에서 확인할 수도 있다.

 

메니페스트를 사용하지 않고 크론잡 생성

kubectl create cronjob 명령어를 사용하면 manifest를 사용하지 않고도 크론잡을 생성할 수 있다.

하지만 간단한 작업 용도로 상세한 설정은 할 수 없다.

# 메니페스트를 사용하지 않고 명령어로 크론잡 생성
$ kubectl create cronjob sample-cronjob-by-cli \
--image amsy810/random-exit:v2.0 \
--schedule "*/1 * * * *" \
--restart Never
cronjob.batch/sample-cronjob-by-cli created