ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Controller - Cronjob
    kubernetes 2024. 12. 7. 11:02

    Cronjob

    • 사용자가 원하는 시간에 Job 실행 예약 지원
    • Job 컨트롤러로 실행할 Application Pod를 주기적으로 반복해서 실행
    • Linux의 Cronjob의 스케줄링 기능을 Job Controller에 추가한 API
    • 다음과 같은 반복해서 실행하는 Job을 운영해야 할 때 사용
      • Data Backup
      • Send Email
      • Cleaning tasks
    • 즉, CronJob이란 Job의 기능을 그대로 갖고 있지만 주기적으로 Job을 실행할 수 있도록 해주는 컨트롤러

    CronJob Schedule

    • Cronjob Schedule " 0 3 1 * * "
      • Minutes (from 0 to 59)
      • Hours (from 0 to 23)
      • Day of the month (from 1 th 31)
      • Month (from 1 to 12)
      • Day of the weke (from 0 to 6)

    • 예시
      • 0 9 1 * * : 매월 1일 아침 9시 정각에 job을 실행
      • 0 3 * * 0 : 매주 일요일 새벽 3시에 job을 실행
      • * * * * * : 매 분마다 실행
      • */5 * * * * : 5분마다 실행 (0분, 5분, 10분, …)
      • 0 */2 * * * : 2시간마다 실행 (0시, 2시, 4시, …)

     

    Cronjob Definition

     

    Cronjob은 Job을 주기적으로 실행하도록 하는 Controller이기때문에

    spec 내 template은 유사하고, schedule만 추가해준 정도이다.

     

    예시

     

     

    # cronjob-exam.yaml 파일 작성 

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: cronjob-exam
    spec:
      schedule: "* * * * *"
      startingDeadlineSeconds: 500
      concurrencyPolicy: Allow
        #  concurrencyPolicy: Forbid
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - echo Hello; sleep 80; echo Bye
              restartPolicy: Never

     

    • schedule: Cron 형식으로 작업이 실행될 일정을 정의합니다. * * * * *는 매 분마다 실행됨을 의미합니다.
    • startingDeadlineSeconds: 예약된 시간에 작업이 시작되지 않을 경우, 시작할 수 있는 최대 시간(초)입니다. 이 시간 내에 작업이 시작되지 않으면 해당 작업은 건너뛰게 됩니다. 여기서는 500초로 설정되어 있습니다.
    • concurrencyPolicy: 동시 실행되는 작업을 처리하는 방식을 제어합니다. Forbid 값은 이전 작업이 완료되지 않은 경우 새로운 작업이 시작되지 않도록 합니다. 주석 처리된 Allow를 활성화하면 동시 실행이 허용됩니다.

    이 CronJob은 매 분마다, "Hello"를 출력하고 10초 동안 대기한 후 "Bye"를 출력하는 작업을 수행합니다. Forbid 동시 실행 정책 덕분에 이전 작업이 완료되지 않은 경우 새로운 작업이 시작되지 않도록 설정되어 있습니다.

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f cronjob-exam.yaml
    cronjob.batch/cronjob-exam created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get jobs
    NAME                    STATUS     COMPLETIONS   DURATION   AGE
    cronjob-exam-28892312   Complete   1/1           15s        2m30s
    cronjob-exam-28892313   Complete   1/1           15s        90s
    cronjob-exam-28892314   Complete   1/1           14s        30s
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME                          READY   STATUS      RESTARTS   AGE
    cronjob-exam-28892312-2nwgx   0/1     Completed   0          2m33s
    cronjob-exam-28892313-wpk5x   0/1     Completed   0          93s
    cronjob-exam-28892314-6fwmv   0/1     Completed   0          33s

     

    cronjob에 의해 1분에 1개씩 생성되는 것을 확인 가능하다.

     

    # cronjobs.batch 파일 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl get cronjobs.batch -o yaml
    apiVersion: v1
    items:
    - apiVersion: batch/v1
      kind: CronJob
      metadata:
        creationTimestamp: "2024-12-07T02:30:30Z"
        generation: 1
        name: cronjob-exam
        namespace: default
        resourceVersion: "286055"
        uid: 55d80431-a9df-4243-8cb7-2185ed4b8e44
      spec:
        concurrencyPolicy: Forbid
        failedJobsHistoryLimit: 1
        jobTemplate:
          metadata:
            creationTimestamp: null
          spec:
            template:
              metadata:
                creationTimestamp: null
              spec:
                containers:
                - args:
                  - /bin/sh
                  - -c
                  - echo Hello; sleep 10; echo Bye
                  image: busybox
                  imagePullPolicy: Always
                  name: hello
                  resources: {}
                  terminationMessagePath: /dev/termination-log
                  terminationMessagePolicy: File
                dnsPolicy: ClusterFirst
                restartPolicy: Never
                schedulerName: default-scheduler
                securityContext: {}
                terminationGracePeriodSeconds: 30
        schedule: '* * * * *'
        startingDeadlineSeconds: 500
        successfulJobsHistoryLimit: 3
        suspend: false
      status:
        lastScheduleTime: "2024-12-07T02:41:00Z"
        lastSuccessfulTime: "2024-12-07T02:41:15Z"
    kind: List
    metadata:
      resourceVersion: ""

     

    successfulJobsHistoryLimit는 Kubernetes의 CronJob 리소스에서 사용되는 필드 중 하나로, 성공적으로 완료된 작업의 기록을 유지하는 수를 지정합니다. 이 필드는 CronJob이 생성한 성공적인 Job의 수를 제한하여, 클러스터의 리소스를 효율적으로 관리하고 불필요한 Job 기록이 쌓이지 않도록 도와줍니다.

     

    successfulJobsHistoryLimit은 별도로 spec에 명시하지 않아도, defualt 값이 3이다.

    즉, 1분동안 job이 실행 되지만 최근 성공한 job 3개까지만 history로 남준다.

     

    # 삭제

    root@master:~/Getting-Start-Kubernetes/6# kubectl delete cronjob.batch cronjob-exam
    cronjob.batch "cronjob-exam" deleted

     

    # 번외) cronjob-exam.yaml 파일 

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: cronjob-exam
    spec:
      schedule: "* * * * *"
      startingDeadlineSeconds: 500
      concurrencyPolicy: Allow
        #  concurrencyPolicy: Forbid
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - echo Hello; sleep 80; echo Bye
              restartPolicy: Never

     

    concurrencyPolicy : 한 번에 여러 개의 job 실행을 허용

     

    이 CronJob은 매 분마다 실행되어 "Hello"를 출력하고 80초 동안 대기한 후 "Bye"를 출력합니다. 작업이 완료되는 데 1분 이상 걸리면, Allow 동시 실행 정책 덕분에 이후의 작업이 여전히 예약에 따라 시작됩니다.

     

     

     

     

     

     

Designed by Tistory.