[Kubernetes] CronJob의 동작 확인 3

14059 단어 kubectlkubernetes

소개



이번에는 CronJob의 히스토리를 저장할 수를 지정하는 매개 변수의 동작을 확인하고 싶습니다.
지정하는 매개 변수는 다음 두 가지입니다.


매개변수
개요
기본값


successfulJobsHistoryLimit
성공한 Job을 저장하는 수
3

failedJobsHistoryLimit
실패한 작업을 저장하는 수
3


successfulJobsHistoryLimit



먼저 성공한 Job을 저장하는 동작에서 확인합니다.
작성한 매니페스트는 다음과 같습니다.

sampleCronJob3.yaml
$ cat sampleCronJob3.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 2
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: sample-cronjob
            image: centos:latest
            command:
            - sh
            - -c
            args:
            - echo "start job"; sleep 30; echo "end job"
          restartPolicy: Never

이 매니페스트를 적용하여 다른 터미널에서 Pod(Job) 상태를 확인합니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585485720-zw945   0/1     Pending   0          0s
sample-cronjob-1585485720-zw945   0/1     Pending   0          0s
sample-cronjob-1585485720-zw945   0/1     ContainerCreating   0          0s
sample-cronjob-1585485720-zw945   0/1     ContainerCreating   0          1s
sample-cronjob-1585485720-zw945   1/1     Running             0          7s
sample-cronjob-1585485720-zw945   0/1     Completed           0          37s
sample-cronjob-1585485780-sjf2s   0/1     Pending             0          0s
sample-cronjob-1585485780-sjf2s   0/1     Pending             0          0s
sample-cronjob-1585485780-sjf2s   0/1     ContainerCreating   0          0s
sample-cronjob-1585485780-sjf2s   0/1     ContainerCreating   0          1s
sample-cronjob-1585485780-sjf2s   1/1     Running             0          6s
sample-cronjob-1585485780-sjf2s   0/1     Completed           0          36s
sample-cronjob-1585485840-f56m5   0/1     Pending             0          0s
sample-cronjob-1585485840-f56m5   0/1     Pending             0          0s
sample-cronjob-1585485840-f56m5   0/1     ContainerCreating   0          0s
sample-cronjob-1585485840-f56m5   0/1     ContainerCreating   0          1s
sample-cronjob-1585485840-f56m5   1/1     Running             0          6s <--⓵
sample-cronjob-1585485840-f56m5   0/1     Completed           0          37s
sample-cronjob-1585485720-zw945   0/1     Terminating         0          2m40s
sample-cronjob-1585485720-zw945   0/1     Terminating         0          2m40s <--⓶

successfulJobsHistoryLimit의 값은 '2'입니다.
세 번째 포드(작업)가 배포된 시점이 아니라 세 번째 포드(작업)가 완료된 후 첫 번째 작업이 삭제되었음을 알 수 있습니다.



kubectl describe 명령에서도 이 상태 전이를 확인할 수 있습니다.
$ kubectl describe cronjob sample-cronjob
Name:                          sample-cronjob
・・・
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  3m41s  cronjob-controller  Created job sample-cronjob-1585485720
  Normal  SawCompletedJob   3m1s   cronjob-controller  Saw completed job: sample-cronjob-1585485720, status: Complete
  Normal  SuccessfulCreate  2m41s  cronjob-controller  Created job sample-cronjob-1585485780
  Normal  SawCompletedJob   2m1s   cronjob-controller  Saw completed job: sample-cronjob-1585485780, status: Complete
  Normal  SuccessfulCreate  101s   cronjob-controller  Created job sample-cronjob-1585485840
  Normal  SawCompletedJob   61s    cronjob-controller  Saw completed job: sample-cronjob-1585485840, status: Complete
  Normal  SuccessfulDelete  61s    cronjob-controller  Deleted job sample-cronjob-1585485720

덧붙여 successfulJobsHistoryLimit의 값을 「0」으로 하면, Job 완료 후에 Job이 삭제되는 동작이 됩니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585487700-bcz5h   0/1     Pending   0          0s
sample-cronjob-1585487700-bcz5h   0/1     Pending   0          0s
sample-cronjob-1585487700-bcz5h   0/1     ContainerCreating   0          0s
sample-cronjob-1585487700-bcz5h   0/1     ContainerCreating   0          1s
sample-cronjob-1585487700-bcz5h   1/1     Running             0          6s
sample-cronjob-1585487700-bcz5h   0/1     Completed           0          35s
sample-cronjob-1585487700-bcz5h   0/1     Terminating         0          40s <-- Job完了後に削除
sample-cronjob-1585487700-bcz5h   0/1     Terminating         0          40s
sample-cronjob-1585487760-xrrn2   0/1     Pending             0          0s
sample-cronjob-1585487760-xrrn2   0/1     Pending             0          0s
sample-cronjob-1585487760-xrrn2   0/1     ContainerCreating   0          0s
sample-cronjob-1585487760-xrrn2   0/1     ContainerCreating   0          2s
sample-cronjob-1585487760-xrrn2   1/1     Running             0          9s

failedJobsHistoryLimit



다음은 실패한 작업을 저장하는 동작을 확인합니다.
작성한 매니페스트는 이쪽이 됩니다.

sampleCronJob4.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: sample-cronjob
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 2
  jobTemplate:
    spec:
      backoffLimit: 1
      template:
        spec:
          containers:
          - name: sample-cronjob
            image: centos:latest
            command:
            - sh
            - -c
            args:
            - echo "start job"; sleep 5; echo "end job"; exit 1
          restartPolicy: Never

failedJobsHistoryLimit은 '2'입니다. 또, Job의 파라미터의 「backoffLimit」를 「1」로 하고 있습니다.
backoffLimit 동작에 대한 자세한 내용은 여기을 참조하십시오.

이 매니페스트를 적용하여 다른 터미널에서 Pod(Job) 동작을 확인합니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585576380-j9gwt   0/1     Pending   0          0s
sample-cronjob-1585576380-j9gwt   0/1     Pending   0          0s
sample-cronjob-1585576380-j9gwt   0/1     ContainerCreating   0          0s
sample-cronjob-1585576380-j9gwt   0/1     ContainerCreating   0          1s
sample-cronjob-1585576380-j9gwt   1/1     Running             0          6s
sample-cronjob-1585576380-j9gwt   0/1     Error               0          11s
sample-cronjob-1585576380-bdj87   0/1     Pending             0          0s
sample-cronjob-1585576380-bdj87   0/1     Pending             0          0s
sample-cronjob-1585576380-bdj87   0/1     ContainerCreating   0          0s
sample-cronjob-1585576380-bdj87   0/1     ContainerCreating   0          1s
sample-cronjob-1585576380-bdj87   1/1     Running             0          6s
sample-cronjob-1585576380-bdj87   0/1     Error               0          11s <--➂
sample-cronjob-1585576440-rpfkp   0/1     Pending             0          0s
sample-cronjob-1585576440-rpfkp   0/1     Pending             0          0s
sample-cronjob-1585576440-rpfkp   0/1     ContainerCreating   0          0s
sample-cronjob-1585576440-rpfkp   0/1     ContainerCreating   0          1s
sample-cronjob-1585576440-rpfkp   1/1     Running             0          6s
sample-cronjob-1585576440-rpfkp   0/1     Error               0          11s
sample-cronjob-1585576440-xgsvp   0/1     Pending             0          0s
sample-cronjob-1585576440-xgsvp   0/1     Pending             0          0s
sample-cronjob-1585576440-xgsvp   0/1     ContainerCreating   0          0s
sample-cronjob-1585576440-xgsvp   0/1     ContainerCreating   0          1s
sample-cronjob-1585576440-xgsvp   1/1     Running             0          5s
sample-cronjob-1585576440-xgsvp   0/1     Error               0          11s <--⓸
sample-cronjob-1585576500-2kzbc   0/1     Pending             0          0s
sample-cronjob-1585576500-2kzbc   0/1     Pending             0          0s
sample-cronjob-1585576500-2kzbc   0/1     ContainerCreating   0          0s
sample-cronjob-1585576500-2kzbc   0/1     ContainerCreating   0          1s
sample-cronjob-1585576500-2kzbc   1/1     Running             0          6s
sample-cronjob-1585576500-2kzbc   0/1     Error               0          10s
sample-cronjob-1585576500-gqtwt   0/1     Pending             0          0s
sample-cronjob-1585576500-gqtwt   0/1     Pending             0          0s
sample-cronjob-1585576500-gqtwt   0/1     ContainerCreating   0          0s
sample-cronjob-1585576500-gqtwt   0/1     ContainerCreating   0          1s
sample-cronjob-1585576500-gqtwt   1/1     Running             0          7s <--⓹
sample-cronjob-1585576500-gqtwt   0/1     Error               0          11s
sample-cronjob-1585576380-j9gwt   0/1     Terminating         0          2m40s
sample-cronjob-1585576380-bdj87   0/1     Terminating         0          2m29s
sample-cronjob-1585576380-bdj87   0/1     Terminating         0          2m29s
sample-cronjob-1585576380-j9gwt   0/1     Terminating         0          2m40s <--⓺

로그가 길기 때문에 알기 어렵습니다만, 이하에 각 포인트가 되는 지점을 그림으로 했습니다.



이번에는 "failedJobsHistoryLimit"뿐만 아니라 "backoffLimit"의 동작도 얽혀 있습니다.
③④의 상태는 backoffLimit의 값에 도달했기 때문에 각 Job이 종료되었습니다.
⑥는 failedJobsHistoryLimit의 조건에 도달했기 때문에 첫 번째 Job과 Pod가 삭제되었습니다.

보충 (Job의 Clean Up)



Job의 동작을 확인하고 있을 때, 실행이 끝난 Job이 자동으로 삭제되면 좋을 것이라고 생각해 조사하고 있었습니다.

매뉴얼을 보면, ttlSecondsAfterFinished라는 파라미터를 설정하면 설정한 시간 후에 삭제해주는 것 같습니다.
쿠베르 자고 s. 이오

다만, 이 파라미터를 유효하게 하려면 , TTL 컨트롤러 를 유효하게 하지 않으면 안됩니다만, 현시점에서는 아직 α판이 되고 있습니다.
그래서 Job을 자동으로 삭제하려면 CronJob을 사용하는 것이 좋을 것 같습니다.

요약



이번에는 CronJob의 히스토리에 대해 확인했습니다.
Job을 정기적으로 실행하고 있으면 실행한 Job이 점점 쌓여 가기 때문에 히스토리를 적절히 설정하고 정기적으로 삭제하도록 해 두고 싶네요.
단, 실행이 끝난 Job을 남겨두면 kubectl logs 명령으로 로그를 확인할 수 있으므로 어느 정도는 남겨두고 싶네요.

큰 시스템이 되면, EFK등으로 로그 관리 기반을 구축한다고 생각하므로, 시스템의 규모나 정책등으로 바뀌어 오는 것일까라고 생각합니다.

지금까지 Job과 CronJob의 동작을 확인해 왔지만 많은 파라미터를 조합하여 사용할 수 있으므로 다양한 동작을 지정할 수 있습니다. 유스 케이스도 추구 정리해 나가면 좋겠다고 생각합니다.

좋은 웹페이지 즐겨찾기