Kubernetes/05. 컨트롤러 종류 및 설명

[쿠버네티스] EKS 에서 크론잡으로 스케줄 동작

Jaden Park 2021. 8. 21. 14:53

 

들어가며: 잡이란?

 

크론잡이란?

크론잡 정의

크론잡 실행 내용

크론잡 고유의 설정과 유의점

크론잡으로 동작시키는 컨테이너를 개발할 때 주의점

 

 


들어가며: 잡(Job)이란?

잡(Job) 컨트롤러는 파드(컨테이너)의 애플리케이션(잡)의 실행이 완료/종료되는 것에 초점을 맞춘 컨트롤러입니다.

 

레플리케이션 컨트롤러, 레플리카셋, 데몬셋은 파드의 애플리케이션이 계속적으로 잘 동작하는 것을 초점으로 맞춘 것에 대비됩니다. 즉, 애플리케이션이 실행되고 실행이 완료되면 파드의 할 일이 끝난 것으로 간주하고 파드를 종료시킵니다. 

 

잡 컨트롤러는 임시(Ad-hoc) 작업 및 배치(Batch) 작업에 유용하게 사용될 수 있습니다. 

 

만약 애플리케이션이 실행되고 있는 중에 노드가 죽거나 파드의 실행이 완료되지 않았다면, 파드를 다시 스케줄링하여 재실행하게 구성할 수 있습니다.

 

잡에는 단일잡, 다중잡, 병렬잡 등의 특징이 있는데 자세한 내용은 잡 포스팅을 참고하시기 바랍니다.

 

이처럼 크론잡은 정기적으로 실시되기 때문에 새벽에 DB를 백업을 명령하거나 업데이트를 주기적으로 확인하거나 메일이나 메시지를 주기적으로 보낼 때 사용합니다.

 

 

이 문서에서 사용한 실행예제는 클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트를 참고하였습니다.

 

클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트 - YES24

애플리케이션 엔지니어도 쉽게 배우는 실전 쿠버네티스 프로젝트를 만난다!클라우드 컴퓨팅, 컨테이너, 쿠버네티스라는 세 가지 인프라 관련 기술이 등장하면서 최신 서비스 개발 환경은 클라

www.yes24.com


크론잡(CronJob)이란?

 

잡 컨트롤러 잡이 한 번만 실행이 되지만 크론잡 컨트롤러는 주기적으로 잡을 반복 실행할 필요가 있을 때 사용하는 컨트롤러입니다.

리눅스 시스템의 crontab 도구와 기능이 같습니다.

배치 APIGROUP에 속하는 배치 애플리케이션 입니다.

 


크론잡 정의

# 43_cronjob_j8s.yaml.template

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: batch-app
spec:
  schedule: "*/1 * * * *" # min hour day-of-month month day-of-week
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: batch-app
            image: ${ECR_HOST}/k8sbook/batch-app:1.0.0
            imagePullPolicy: Always
            env:
            - name: DB_URL
              valueFrom:
                secretKeyRef:
                  key: db-url
                  name: db-config
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  key: db-username
                  name: db-config
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: db-password
                  name: db-config
            - name: CLOUD_AWS_CREDENTIALS_ACCESSKEY
              valueFrom:
                secretKeyRef:
                  key: aws-accesskey
                  name: batch-secret-config
            - name: CLOUD_AWS_CREDENTIALS_SECRETKEY
              valueFrom:
                secretKeyRef:
                  key: aws-secretkey
                  name: batch-secret-config
            - name: CLOUD_AWS_REGION_STATIC
              valueFrom:
                configMapKeyRef:
                  key: aws-region
                  name: batch-app-config
            - name: SAMPLE_APP_BATCH_BUCKET_NAME
              valueFrom:
                configMapKeyRef:
                  key: bucket-name
                  name: batch-app-config
            - name: SAMPLE_APP_BATCH_FOLDER_NAME
              valueFrom:
                configMapKeyRef:
                  key: folder-name
                  name: batch-app-config
            - name: SAMPLE_APP_BATCH_RUN
              valueFrom:
                configMapKeyRef:
                  key: batch-run
                  name: batch-app-config
          restartPolicy: OnFailure

 

 

  • apiVersion: 크론잡의 API 버전
  • kind: 크론잡이라는 리소스 타입을 설정
  • metadata
    • name: 크론잡의 이름

 

  • spec
    • schedule: 크론잡 스케줄 정의 (1분마다 실행한다는 의미)
    • jobTemplate: 반복 실행되는 잡의 내용
    • containers: 컨테이너 이름, 이미지, 환경 변수와 값의 저장소 설정
      • env: 환경 변수는 deployment와 달리 여러 개의 시크릿과 컨피그맵에서 값을 가져옴
    • restartPolicy: 크론잡을 재시작하는 조건 설정 [Always - (default) 종료/실패 시 항상 재시작 , Onfailure - 실패 시 재시작 (정상 종료 시 재시작x), Never - 재시작 하지 않음]

 


 

크론잡에서의 실행 내용

파드를 직접 생성하면 노드가 죽을 시 다른 노드에 생성되지 않고 Service Down 문제가 일어납니다. 이와 같은 문제로 파드를 직접 사용하는 경우는 없어 일반적으로 Deployment, ReplicaSet 과 함께 사용하게 됩니다.

 

디플로이먼트(레플리카셋)을 생성하면 노드가 죽을 시 파드는 다른 노드에 Recreate 됩니다.

그리고, 파드의 이상이 생긴다면 Restart 하게 됩니다.

이처럼, 하나의 서비스를 지속적으로 운영해야 할 때 디플로이먼트(레플리카셋)을 사용하게 됩니다.

이때, Recreate 와 Restart의 차이점은 Recreate 는 파드의 IP 이름 등이 변경되지만, Restart는 파드는 그대로 있고 파드 안에 컨테이너만 재시동하는 것입니다

 

크론잡(잡)을 생성하면 노드가 죽을 시 파드는 다른 노드에 Recreate 됩니다.

그리고, 파드 프로세스가 종료된다면 파드는 Finish(종료) 됩니다.

이때 종료는 파드가 사라지는게 아니라 파드는 그래도 있고 사용하는 자원만 반환하는 것 입니다.


 

크론잡 고유의 설정과 유의점

크론잡은 설정한 스케줄에 따라 잡을 생성하고 잡 정의에 따라 프로그램을 실행합니다.

크론잡 고유의 설정 항목으로 중요한 것은 .spec.schedule.spec.concurrencyPolicy 입니다.

 

 

.spec.schedule

잡 실행의 스케줄을 정의하는 것이며 cron과 같이 스페이스로 구분한 문자열로 설정

 

크론잡에서 설정한 시각은 마스터 노드의 타임존에 따라 달라집니다.

EKS의 경우 타임존으로 UTC 를 사용하므로 주의가 필요합니다.

 

 

예시 설명
* * * * * echo “1분 마다”
0 * * * * echo “1시간 마다”
30 7 * * 1 echo “매주 월요일 7:30분”
0 0 25 12 * echo “매년 크리스마스 마다”
0 9-18 * * * echo “9시부터 18시 까지”
0 9,12,18 * * * echo “아침 점심 저녁으로만”
*/3 * * * * echo “3으로 나눠 떨어질 때(매 3분마다) (0분 3분 6분 9분…)”

 

 

메타문자 설명
* 조건에 대해 무조건 참(True)을 의미
- 범위를 지정할 수 있음
, 다수의 값을 지정할 수 있음
/ 조건에 대한 주기를 지정할 수 있음

 

 

.spec.concurrencyPolicy

동시 실행 제어 이전 스케줄링된 잡 실행이 미완료인 상태에서 다음 스케줄 시각에 도달했을 때 어떻게 동작할지를 설정

No 설정값 동작
1 Allow 동시 실행 허가(Default)
2 Forbid 실행 중인 잡을 남기고 신규 잡 생성은 건너뛰기
3 Replace 실행 중인 잡을 종료하고 신규로 잡 생성

예제 애플리케이션에서는 Forbid 로 설정했기 때문에 이전 실행한 잡이 남아 있을 경우 다음 스케줄 시각이 되어도 새로운 잡이 생성되지 않습니다.

 


크론잡으로 동작시키는 컨테이너를 개발할 때의 주의점

 

쿠버네티스 공식 문서를 참고하겠습니다.

이는 기본적으로 CronJob은 한 번의 실행 시점에 Job 하나가 생성되고, 드물기는 하지만 CronJob에서 Job 여러 개가 생성되는(또는 하나도 생성되지 않는) 경우도 있어 Job은 멱등성을 갖도록 작성해야 한다는 의미이다.

 

cf) 멱등성? 여러번 수행해도 동일한 결과값을 나올 수 있도록 제공되는 형태

(Job이 멱등성을 갖는다는 것은 같은 조건일 경우 Job을 몇 번을 실행해도 같은 상태가 된다는 의미)

 

이러한 쿠버네티스의 제한 사항이 없다고 해도 batch 애플리케이션은 멱등성을 갖도록 만드는 것이 운영을 고려했을 때 많은 장점을 가지기에 애플리케이션 설계 시 유의해야 합니다.