[Kubernetes] CronJob의 동작 확인 2

10710 단어 kubectlkubernetes

소개



이번에는 Job의 동시 실행을 제어하는 ​​파라미터 "concurrencyPolicy"의 동작을 확인하고 싶습니다.
설정할 수 있는 값은 다음 세 가지가 있습니다.


설정값
개요


Allow(기본값)
동시 실행 허용(특히 제어하지 않음)

Forbid
동시 실행하지 않음 (이전 작업이 종료되지 않은 경우 다음 작업을 실행하지 않음)

Replace
이전 작업이 종료되지 않은 경우 해당 작업을 취소하고 다음 작업을 실행합니다.


Allow



먼저 기본 Allow 동작을 확인합니다.
작성한 yaml 파일은 여기입니다.

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

1분 간격으로 Job을 실행합니다만, Job 실행중에 90초 슬립하므로, 전후의 Job이 겹칩니다.

이 매니페스트를 apply합니다.
$ kubectl apply -f sampleCronJob2.yaml
cronjob.batch/sample-cronjob created

다른 터미널에서 Pod 상태를 확인합니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585397160-psxdm   0/1     Pending   0          0s
sample-cronjob-1585397160-psxdm   0/1     Pending   0          0s
sample-cronjob-1585397160-psxdm   0/1     ContainerCreating   0          0s
sample-cronjob-1585397160-psxdm   0/1     ContainerCreating   0          2s
sample-cronjob-1585397160-psxdm   1/1     Running             0          8s
sample-cronjob-1585397220-tb4bb   0/1     Pending             0          0s
sample-cronjob-1585397220-tb4bb   0/1     Pending             0          0s
sample-cronjob-1585397220-tb4bb   0/1     ContainerCreating   0          0s <--1つ目のPod実行中に2つ目のPodをデプロイ
sample-cronjob-1585397220-tb4bb   0/1     ContainerCreating   0          0s
sample-cronjob-1585397220-tb4bb   1/1     Running             0          6s
sample-cronjob-1585397160-psxdm   0/1     Completed           0          98s <--1つ目のPod終了
sample-cronjob-1585397280-wls7r   0/1     Pending             0          0s
sample-cronjob-1585397280-wls7r   0/1     Pending             0          0s
sample-cronjob-1585397280-wls7r   0/1     ContainerCreating   0          0s
sample-cronjob-1585397280-wls7r   0/1     ContainerCreating   0          1s
sample-cronjob-1585397280-wls7r   1/1     Running             0          6s
sample-cronjob-1585397220-tb4bb   0/1     Completed           0          95s
sample-cronjob-1585397280-wls7r   0/1     Completed           0          96s

여러 Job(Pod)이 동시에 실행 중인지 확인할 수 있습니다.



Forbid



그런 다음 Forbid의 동작을 확인합니다.
작성한 yaml 파일은 Allow를 "Forbid"로 바꿨습니다.

sampleCronJob2.yaml
・・・
  concurrencyPolicy: Forbid
・・・

마찬가지로 적용하고 다른 터미널에서 Pod의 동작을 확인합니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585398660-7r52w   0/1     Pending   0          0s
sample-cronjob-1585398660-7r52w   0/1     Pending   0          0s
sample-cronjob-1585398660-7r52w   0/1     ContainerCreating   0          0s
sample-cronjob-1585398660-7r52w   0/1     ContainerCreating   0          2s
sample-cronjob-1585398660-7r52w   1/1     Running             0          6s
sample-cronjob-1585398660-7r52w   0/1     Completed           0          97s
sample-cronjob-1585398720-4fbrs   0/1     Pending             0          0s <--1つ目のPodが終了してから2つ目のPodをデプロイ
sample-cronjob-1585398720-4fbrs   0/1     Pending             0          0s
sample-cronjob-1585398720-4fbrs   0/1     ContainerCreating   0          0s
sample-cronjob-1585398720-4fbrs   0/1     ContainerCreating   0          1s
sample-cronjob-1585398720-4fbrs   1/1     Running             0          6s
sample-cronjob-1585398720-4fbrs   0/1     Completed           0          96s
sample-cronjob-1585398840-smvlz   0/1     Pending             0          0s
sample-cronjob-1585398840-smvlz   0/1     Pending             0          0s
sample-cronjob-1585398840-smvlz   0/1     ContainerCreating   0          0s
sample-cronjob-1585398840-smvlz   0/1     ContainerCreating   0          1s
sample-cronjob-1585398840-smvlz   1/1     Running             0          6s
sample-cronjob-1585398840-smvlz   0/1     Completed           0          96s

Allow와 달리 첫 번째 포드가 종료된 후 두 번째 포드가 배포되었는지 확인할 수 있습니다.

첫 번째 및 두 번째 작업의 시작 시간을 확인합니다.
$ kubectl describe job sample-cronjob-1585398660
Name:           sample-cronjob-1585398660
・・・
Start Time:     Sat, 28 Mar 2020 21:31:06 +0900
・・・

$ kubectl describe job sample-cronjob-1585398720
Name:           sample-cronjob-1585398720
・・・
Start Time:     Sat, 28 Mar 2020 21:32:46 +0900
・・・

약 100초 후에 두 번째 Job이 시작됩니다.
CronJob의 실행 간격은 1분(60초)입니다. 작업이 종료되지 않은 경우 다음 작업을 건너뛰기(120초 후)하는 대신 보류 중이며 이전 작업이 완료되면 다음 작업을 실행하는 동작임을 알 수 있습니다.



Replace



마지막으로 Replace 동작을 확인합니다.
작성한 yaml 파일은 마찬가지로 spec.concurrencyPolicy를 'Replace'로 변경했습니다.

apply하고 마찬가지로 Pod 상태를 확인합니다.
$ kubectl get pod -w
NAME                              READY   STATUS    RESTARTS   AGE
sample-cronjob-1585400580-2p7ph   0/1     Pending   0          0s
sample-cronjob-1585400580-2p7ph   0/1     Pending   0          0s
sample-cronjob-1585400580-2p7ph   0/1     ContainerCreating   0          0s
sample-cronjob-1585400580-2p7ph   0/1     ContainerCreating   0          1s
sample-cronjob-1585400580-2p7ph   1/1     Running             0          6s
sample-cronjob-1585400640-svjxz   0/1     Pending             0          0s 
sample-cronjob-1585400640-svjxz   0/1     Pending             0          0s
sample-cronjob-1585400640-svjxz   0/1     ContainerCreating   0          0s <-- 2つ目のPodデプロイ
sample-cronjob-1585400580-2p7ph   1/1     Terminating         0          61s <-- 1つ目のPod削除
sample-cronjob-1585400640-svjxz   0/1     ContainerCreating   0          1s
sample-cronjob-1585400640-svjxz   1/1     Running             0          6s
sample-cronjob-1585400580-2p7ph   0/1     Terminating         0          93s
sample-cronjob-1585400580-2p7ph   0/1     Terminating         0          96s
sample-cronjob-1585400580-2p7ph   0/1     Terminating         0          96s
sample-cronjob-1585400700-jmhhc   0/1     Pending             0          0s
sample-cronjob-1585400700-jmhhc   0/1     Pending             0          0s
sample-cronjob-1585400700-jmhhc   0/1     ContainerCreating   0          0s <-- 3つ目のPodデプロイ
sample-cronjob-1585400640-svjxz   1/1     Terminating         0          61s <-- 2つ目のPod削除
sample-cronjob-1585400700-jmhhc   0/1     ContainerCreating   0          1s
sample-cronjob-1585400700-jmhhc   1/1     Running             0          6s
sample-cronjob-1585400640-svjxz   0/1     Terminating         0          92s
sample-cronjob-1585400640-svjxz   0/1     Terminating         0          93s
sample-cronjob-1585400640-svjxz   0/1     Terminating         0          93s
sample-cronjob-1585400700-jmhhc   0/1     Completed           0          97s

세 번째 Job 런타임에 CronJob을 일시 중단했기 때문에 세 번째 포드 만 완료되었지만 처음 두 개는 중간에 삭제되었습니다.
Job과 Pod의 상태를 확인합니다.
$ kubectl get job
NAME                        COMPLETIONS   DURATION   AGE
sample-cronjob-1585400700   1/1           97s        6m37s
$ kubectl get pod
NAME                              READY   STATUS      RESTARTS   AGE
sample-cronjob-1585400700-jmhhc   0/1     Completed   0          6m40s

남아있는 Job/Pod는 세 번째 것뿐입니다.

CronJob에 대해 자세히 알아보세요.
$ kubectl describe cronjobs.batch sample-cronjob
Name:                          sample-cronjob
・・・
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  5m26s  cronjob-controller  Created job sample-cronjob-1585400580
  Normal  SuccessfulDelete  4m26s  cronjob-controller  Deleted job sample-cronjob-1585400580
  Normal  SuccessfulCreate  4m26s  cronjob-controller  Created job sample-cronjob-1585400640
  Normal  SuccessfulDelete  3m26s  cronjob-controller  Deleted job sample-cronjob-1585400640
  Normal  SuccessfulCreate  3m26s  cronjob-controller  Created job sample-cronjob-1585400700
  Normal  SawCompletedJob   105s   cronjob-controller  Saw completed job: sample-cronjob-1585400700, status: Complete

여기에서도 2개의 Job이 삭제되고 있는 것을 알 수 있군요.



요약



이번에는 concurrencyPolicy의 동작을 확인했습니다. 매뉴얼을 읽고 가정한 움직임과는 조금 다른 동작이었습니다.
역시 실제로 해보지 않으면 모르겠네요.

좋은 웹페이지 즐겨찾기